222 lines · plain
1; RUN: opt < %s -disable-output -passes=instcombine -verify-dom-info2; RUN: opt < %s -passes='print<postdomtree>' 2>&1 | FileCheck --check-prefixes=CHECK-POSTDOM %s3 4; Demonstrate that Predicate Canonicalization (InstCombine) does not invalidate PostDomTree5; if the basic block is post-dom unreachable.6 7define void @test1(i24 %a, i24 %b) {8entry:9 br label %LOOP10 11LOOP:12 %f = icmp uge i24 %a, %b13 br i1 %f, label %B1, label %B214 15B1:16 %x = add i24 %a, %b17 br label %B218 19B2:20 br label %LOOP21}22 23; The same as @test1 except the LOOP condition canonicalized (as by instcombine).24define void @test1-canonicalized(i24 %a, i24 %b) {25entry:26 br label %LOOP27 28LOOP:29 %f.not = icmp ult i24 %a, %b30 br i1 %f.not, label %B2, label %B131 32B1:33 %x = add i24 %a, %b34 br label %B235 36B2:37 br label %LOOP38}39 40; The same as @test1 but different order of B1 and B2 in the function.41; The different order makes PostDomTree different in presense of postdom42; unreachable blocks.43define void @test2(i24 %a, i24 %b) {44entry:45 br label %LOOP46 47LOOP:48 %f = icmp uge i24 %a, %b49 br i1 %f, label %B1, label %B250 51B2:52 br label %LOOP53 54B1:55 %x = add i24 %a, %b56 br label %B257}58 59; The same as @test2 except the LOOP condition canonicalized (as by instcombine).60define void @test2-canonicalized(i24 %a, i24 %b) {61entry:62 br label %LOOP63 64LOOP:65 %f.not = icmp ult i24 %a, %b66 br i1 %f.not, label %B2, label %B167 68B2:69 br label %LOOP70 71B1:72 %x = add i24 %a, %b73 br label %B274}75 76; Two reverse unreachable subgraphs with RU1* and RU2* basic blocks respectively.77define void @test3(i24 %a, i24 %b, i32 %flag) {78entry:79 switch i32 %flag, label %EXIT [80 i32 1, label %RU181 i32 2, label %RU282 i32 3, label %RU2_B183 ]84 85RU1:86 %f = icmp uge i24 %a, %b87 br label %RU1_LOOP88 89RU1_LOOP:90 br i1 %f, label %RU1_B1, label %RU1_B291 92RU1_B1:93 %x = add i24 %a, %b94 br label %RU1_B295 96RU1_B2:97 br label %RU1_LOOP98 99RU2:100 %f2 = icmp uge i24 %a, %b101 br i1 %f2, label %RU2_B1, label %RU2_B2102 103RU2_B1:104 br label %RU2_B2105 106RU2_B2:107 br label %RU2_B1108 109EXIT:110 ret void111}112 113; The same as @test3 except the icmp conditions are canonicalized (as by instcombine).114define void @test3-canonicalized(i24 %a, i24 %b, i32 %flag) {115entry:116 switch i32 %flag, label %EXIT [117 i32 1, label %RU1118 i32 2, label %RU2119 i32 3, label %RU2_B1120 ]121 122RU1:123 %f.not = icmp ult i24 %a, %b124 br label %RU1_LOOP125 126RU1_LOOP:127 br i1 %f.not, label %RU1_B2, label %RU1_B1128 129RU1_B1:130 %x = add i24 %a, %b131 br label %RU1_B2132 133RU1_B2:134 br label %RU1_LOOP135 136RU2:137 %f2.not = icmp ult i24 %a, %b138 br i1 %f2.not, label %RU2_B2, label %RU2_B1139 140RU2_B1:141 br label %RU2_B2142 143RU2_B2:144 br label %RU2_B1145 146EXIT:147 ret void148}149 150; PostDomTrees of @test1(), @test2() and @test3() are different.151; PostDomTrees of @testX() and @testX-canonicalize() are the same.152 153; CHECK-POSTDOM-LABEL: test1154; CHECK-POSTDOM-NEXT: =============================--------------------------------155; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.156; CHECK-POSTDOM-NEXT: [1] <<exit node>>157; CHECK-POSTDOM-NEXT: [2] %B1158; CHECK-POSTDOM-NEXT: [3] %LOOP159; CHECK-POSTDOM-NEXT: [4] %entry160; CHECK-POSTDOM-NEXT: [4] %B2161; CHECK-POSTDOM-NEXT: Roots: %B1162 163; CHECK-POSTDOM-LABEL: test1-canonicalized164; CHECK-POSTDOM-NEXT: =============================--------------------------------165; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.166; CHECK-POSTDOM-NEXT: [1] <<exit node>>167; CHECK-POSTDOM-NEXT: [2] %B1168; CHECK-POSTDOM-NEXT: [3] %LOOP169; CHECK-POSTDOM-NEXT: [4] %entry170; CHECK-POSTDOM-NEXT: [4] %B2171; CHECK-POSTDOM-NEXT: Roots: %B1172 173; CHECK-POSTDOM-LABEL: test2174; CHECK-POSTDOM-NEXT: =============================--------------------------------175; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.176; CHECK-POSTDOM-NEXT: [1] <<exit node>>177; CHECK-POSTDOM-NEXT: [2] %B2178; CHECK-POSTDOM-NEXT: [3] %LOOP179; CHECK-POSTDOM-NEXT: [4] %entry180; CHECK-POSTDOM-NEXT: [3] %B1181; CHECK-POSTDOM-NEXT: Roots: %B2182 183; CHECK-POSTDOM-LABEL: test2-canonicalized184; CHECK-POSTDOM-NEXT: =============================--------------------------------185; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.186; CHECK-POSTDOM-NEXT: [1] <<exit node>>187; CHECK-POSTDOM-NEXT: [2] %B2188; CHECK-POSTDOM-NEXT: [3] %LOOP189; CHECK-POSTDOM-NEXT: [4] %entry190; CHECK-POSTDOM-NEXT: [3] %B1191; CHECK-POSTDOM-NEXT: Roots: %B2192 193; CHECK-POSTDOM-LABEL: test3194; CHECK-POSTDOM-NEXT:=============================--------------------------------195; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.196; CHECK-POSTDOM-NEXT: [1] <<exit node>>197; CHECK-POSTDOM-NEXT: [2] %EXIT198; CHECK-POSTDOM-NEXT: [2] %entry199; CHECK-POSTDOM-NEXT: [2] %RU1_B1200; CHECK-POSTDOM-NEXT: [3] %RU1_LOOP201; CHECK-POSTDOM-NEXT: [4] %RU1202; CHECK-POSTDOM-NEXT: [4] %RU1_B2203; CHECK-POSTDOM-NEXT: [2] %RU2_B1204; CHECK-POSTDOM-NEXT: [3] %RU2205; CHECK-POSTDOM-NEXT: [3] %RU2_B2206; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1207 208; CHECK-POSTDOM-LABEL: test3-canonicalized209; CHECK-POSTDOM-NEXT:=============================--------------------------------210; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.211; CHECK-POSTDOM-NEXT: [1] <<exit node>>212; CHECK-POSTDOM-NEXT: [2] %EXIT213; CHECK-POSTDOM-NEXT: [2] %entry214; CHECK-POSTDOM-NEXT: [2] %RU1_B1215; CHECK-POSTDOM-NEXT: [3] %RU1_LOOP216; CHECK-POSTDOM-NEXT: [4] %RU1217; CHECK-POSTDOM-NEXT: [4] %RU1_B2218; CHECK-POSTDOM-NEXT: [2] %RU2_B1219; CHECK-POSTDOM-NEXT: [3] %RU2220; CHECK-POSTDOM-NEXT: [3] %RU2_B2221; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1222