diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-03 09:32:33 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-03 09:32:33 -0700 |
| commit | 37b46799c03244241d589085e24582bef8a59efb (patch) | |
| tree | 1ea479058bd5e62346bf6063c1f1b23edbcfe13a /chapter21/src/main | |
| parent | 35057d50ae21e143bf89158a65e2db139fcb76fa (diff) | |
| download | Simple-37b46799c03244241d589085e24582bef8a59efb.tar.gz Simple-37b46799c03244241d589085e24582bef8a59efb.zip | |
Allow stacked cloneables
For RISC 2-part immediates, both parts can be treated as constants and moved/cloned
Diffstat (limited to 'chapter21/src/main')
| -rw-r--r-- | chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java index c81eb9b5..ee8c0259 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java @@ -24,7 +24,7 @@ public abstract class GlobalCodeMotion { schedEarly(code); // Break up shared global constants by functions - breakUpGlobalConstants(code); + breakUpGlobalConstants(code._start); code._visit.clear(); schedLate (code); @@ -45,11 +45,12 @@ public abstract class GlobalCodeMotion { } // Break up shared global constants by functions - private static void breakUpGlobalConstants( CodeGen code ) { + private static void breakUpGlobalConstants( Node start ) { // For all global constants - for( int i=0; i< code._start.nOuts(); i++ ) { - Node con = code._start.out(i); + for( int i=0; i< start.nOuts(); i++ ) { + Node con = start.out(i); if( con instanceof MachNode mach && mach.isClone() ) { + breakUpGlobalConstants(con); // While constant has users in different functions while( true ) { // Find a function user, and another function @@ -61,7 +62,11 @@ public abstract class GlobalCodeMotion { else { done=false; break; } } // Single function user, so this constant is not shared - if( done ) { i--; con.setDef(0,fun); break; } + if( done ) { + if( con.in(0)==start ) i--; + con.setDef(0,fun); + break; + } // Move function users to a private constant Node con2 = mach.copy(); // Private constant clone con2._inputs.set(0,null); // Preserve edge invariants from clone |
