summaryrefslogtreecommitdiff
path: root/chapter21/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-31 16:57:26 -0700
committerCliff Click <cliffc@acm.org>2025-03-31 16:57:26 -0700
commit28a873ea522190733e89602b1d50f042c41d20bc (patch)
tree41c8dea87745856c3ec3b5b4514df9530607d259 /chapter21/src
parent950d57cc74a36655a770daea7c28cee03b60e707 (diff)
downloadSimple-28a873ea522190733e89602b1d50f042c41d20bc.tar.gz
Simple-28a873ea522190733e89602b1d50f042c41d20bc.zip
RA uses killOrdered
Diffstat (limited to 'chapter21/src')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/Node.java11
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java4
3 files changed, 13 insertions, 4 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
index 1fe5591b..1a4d0120 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
@@ -343,7 +343,7 @@ public class RegAlloc {
SplitNode split = makeSplit("def/self",round,lrg);
insertAfterAndReplace(split,def,false);
if( split.nOuts()==0 )
- split.kill();
+ split.killOrdered();
insertBefore(phi,1,"use/self/phi",round,lrg);
}
// Split before two-address ops which extend the live range
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
index 44c9d7cf..1e9630e3 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -268,6 +268,15 @@ public abstract class Node {
assert isDead(); // Really dead now
}
+ // Preserve CFG use-ordering when killing
+ public void killOrdered() {
+ CFGNode cfg = cfg0();
+ cfg._outputs.remove(cfg._outputs.find(this));
+ _inputs.set(0,null);
+ kill();
+ }
+
+
// Mostly used for asserts and printing.
public boolean isDead() { return isUnused() && nIns()==0 && _type==null; }
@@ -336,7 +345,7 @@ public abstract class Node {
use.setDefOrdered(uidx,this);
}
- public void setDefOrdered(int idx, Node def) {
+ public void setDefOrdered( int idx, Node def) {
// If old is dying, remove from CFG ordered
Node old = in(idx);
if( old!=null && old.nOuts()==1 ) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
index 421c91e9..dea2d530 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
@@ -170,8 +170,8 @@ public class riscv extends Machine {
public static int i_type(int opcode, int rd, int func3, int rs1, int imm12) {
- assert 0 <= rd && rd < 32;
- assert 0 <= rs1 && rs1 < 32;
+ assert 0 <= rd && rd < 32;
+ assert 0 <= rs1 && rs1 < 32;
assert opcode >= 0 && func3 >=0 && imm12 >= 0; // Zero-extend by caller
return (imm12 << 20) | (rs1 << 15) | (func3 << 12) | (rd << 7) | opcode;
}