summaryrefslogtreecommitdiff
path: root/chapter28b
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-28 12:26:28 -0700
committerCliff Click <cliffc@acm.org>2026-10-28 12:26:28 -0700
commite481e3d215882faa82b19f29cfde5746d4e51863 (patch)
treed6035c13e4ee471b67d7dd4732a62bc04020fbd1 /chapter28b
parent07a87b4461015dd81f1d40cef1e2378882c86479 (diff)
downloadSimple-e481e3d215882faa82b19f29cfde5746d4e51863.tar.gz
Simple-e481e3d215882faa82b19f29cfde5746d4e51863.zip
Backport Opto speedups and Minus fix
Diffstat (limited to 'chapter28b')
-rw-r--r--chapter28b/src/main/java/com/seaofnodes/simple/codegen/Opto.java7
1 files changed, 5 insertions, 2 deletions
diff --git a/chapter28b/src/main/java/com/seaofnodes/simple/codegen/Opto.java b/chapter28b/src/main/java/com/seaofnodes/simple/codegen/Opto.java
index e288d838..511e0027 100644
--- a/chapter28b/src/main/java/com/seaofnodes/simple/codegen/Opto.java
+++ b/chapter28b/src/main/java/com/seaofnodes/simple/codegen/Opto.java
@@ -30,7 +30,7 @@ abstract public class Opto {
WorkList<Node> deps = new WorkList<>();
WorkList<Node> changes = new WorkList<>();
Ary<Node> modes = new Ary<>(Node.class);
- resetToTop(code,oldTypes,modes);
+ resetToTop(code,oldTypes,modes,deps);
unlinkStart(code);
// OPTIMISTIC INTERPROCEDURAL SCCP
@@ -53,8 +53,11 @@ abstract public class Opto {
}
// Reset Types before running the worklist algorithm
- private static void resetToTop(CodeGen code, Ary<Type> oldTypes, Ary<Node> modes ) {
+ private static void resetToTop(CodeGen code, Ary<Type> oldTypes, Ary<Node> modes, WorkList<Node> deps ) {
code._start.walk( x -> {
+ // Opto ends Parm.inProgress(), enabling constant folding even
+ // when a parameter's type was already constant before SCCP.
+ if( x instanceof ParmNode && x._type.isHighOrConst() ) deps.push(x);
// SCCP adds call edges and default arguments, not numeric
// operations. Gather unresolved modes on this required walk.
if( x instanceof ModeNode mode && mode.mode()==0 ) modes.push(x);