summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-03 09:32:33 -0700
committerCliff Click <cliffc@acm.org>2025-04-03 09:32:33 -0700
commit37b46799c03244241d589085e24582bef8a59efb (patch)
tree1ea479058bd5e62346bf6063c1f1b23edbcfe13a /chapter21/src/main/java/com
parent35057d50ae21e143bf89158a65e2db139fcb76fa (diff)
downloadSimple-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/java/com')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java15
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