summaryrefslogtreecommitdiff
path: root/chapter28b/src/test/java/com/seaofnodes/simple/BulkMemPhiTest.java
blob: 31c0302b36a4259400cd20e90e75ca9386d00a81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.seaofnodes.simple;

import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.TypeInteger;
import com.seaofnodes.simple.type.TypeMem;
import org.junit.Test;
import static org.junit.Assert.*;

public class BulkMemPhiTest {
    // Reduced from Capitalize's Lower-phase failure. A precise MemMerge slot
    // may still be supplied by bulk memory which covers the requested alias.
    @Test public void testBulkInPreciseSlot() {
        CodeGen code=new CodeGen("");
        code._phase=CodeGen.Phase.Lower;
        Node m0=code.con(TypeMem.START), m1=code.con(TypeMem.BOT);
        Node ctrl=new CProjNode(code._start,0,"Ctrl").init();
        Node iff=new IfNode(ctrl,code.con(TypeInteger.BOOL)).init();
        RegionNode region=new RegionNode(null,null,
            new CProjNode(iff,0,"True").init(),
            new CProjNode(iff,1,"False").init()).init();
        BulkMemPhiNode bulk=new BulkMemPhiNode("$mem",region,m0,m1).init();
        // A later init check proves its call arm dead. Its precise Phi can
        // collapse before the surrounding aggregate gets another peephole.
        RegionNode done=new RegionNode(null,null,region,code.XCTRL).init();
        MemPhiNode precise=new MemPhiNode("$4",4,done,bulk,m1).init();
        MemMergeNode merge=new MemMergeNode(null,m0);
        merge.alias(4,precise);
        merge.init();
        Node folded=precise.peepholeOpt();
        assertSame(bulk,folded);
        precise.subsume(folded);

        assertFalse(bulk.isSplit(4));
        assertSame(bulk,merge.alias(4));
        // Splitting this still-covered alias must tolerate the direct bulk use.
        Node mem = bulk.idealize();
        bulk.subsume(mem);
    }
}