summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/codegen')
-rw-r--r--src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java b/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java
index b60adce7..0304c6a1 100644
--- a/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java
+++ b/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java
@@ -249,6 +249,33 @@ public class RegAllocTestSupport {
assertFalse("A fixed definition clobbers even before coloring",uncolored.sameBlockNoClobber(copy));
}
+ public static void coldLoopSelfConflict() {
+ for( boolean phiConflict : new boolean[]{false,true} ) {
+ CodeGen code = graph();
+ RegAlloc alloc = new RegAlloc(code);
+ Op init = new Op(A,null,null,false,code._start);
+ LoopNode loop = new LoopNode(null,code._start);
+ PhiNode phi = new PhiNode("loop",TypeInteger.BOT,loop,init,null);
+ Op back = new Op(A,A,null,false,loop,phi);
+ phi.setDef(2,back);
+ Op use = new Op(null,A,null,false,loop,phi);
+ loop.setDef(2,loop);
+ LRG lrg = alloc.newLRG(phi);
+ lrg._mask = A;
+ alloc.union(lrg,init); alloc.union(lrg,back);
+ lrg.selfConflict(back);
+ if( phiConflict ) lrg.selfConflict(phi);
+ assertTrue(alloc.splitSelfConflict((byte)0,lrg));
+ assertSame(phi,use.in(1)); // First try leaves the hot definition alone.
+ assertSame(back,phi.in(2));
+ if( phiConflict ) assertTrue(phi.in(1) instanceof SplitNode);
+ // Even if the first attempt made no graph change, retry must split.
+ assertTrue(alloc.splitSelfConflict((byte)1,lrg));
+ assertTrue(phi.in(2) instanceof SplitNode);
+ if( phiConflict ) assertTrue(use.in(1) instanceof SplitNode);
+ }
+ }
+
public static void copyForward() throws Exception {
// Forwarding, fixed operand, two-address tie, intervening clobber,
// another user, and a scheduling-only edge.