| ; RUN: opt < %s -disable-output -passes=instcombine -verify-dom-info | |
| ; RUN: opt < %s -passes='print<postdomtree>' 2>&1 | FileCheck --check-prefixes=CHECK-POSTDOM %s | |
| ; Demonstrate that Predicate Canonicalization (InstCombine) does not invalidate PostDomTree | |
| ; if the basic block is post-dom unreachable. | |
| define void @test1(i24 %a, i24 %b) { | |
| entry: | |
| br label %LOOP | |
| LOOP: | |
| %f = icmp uge i24 %a, %b | |
| br i1 %f, label %B1, label %B2 | |
| B1: | |
| %x = add i24 %a, %b | |
| br label %B2 | |
| B2: | |
| br label %LOOP | |
| } | |
| ; The same as @test1 except the LOOP condition canonicalized (as by instcombine). | |
| define void @test1-canonicalized(i24 %a, i24 %b) { | |
| entry: | |
| br label %LOOP | |
| LOOP: | |
| %f.not = icmp ult i24 %a, %b | |
| br i1 %f.not, label %B2, label %B1 | |
| B1: | |
| %x = add i24 %a, %b | |
| br label %B2 | |
| B2: | |
| br label %LOOP | |
| } | |
| ; The same as @test1 but different order of B1 and B2 in the function. | |
| ; The different order makes PostDomTree different in presense of postdom | |
| ; unreachable blocks. | |
| define void @test2(i24 %a, i24 %b) { | |
| entry: | |
| br label %LOOP | |
| LOOP: | |
| %f = icmp uge i24 %a, %b | |
| br i1 %f, label %B1, label %B2 | |
| B2: | |
| br label %LOOP | |
| B1: | |
| %x = add i24 %a, %b | |
| br label %B2 | |
| } | |
| ; The same as @test2 except the LOOP condition canonicalized (as by instcombine). | |
| define void @test2-canonicalized(i24 %a, i24 %b) { | |
| entry: | |
| br label %LOOP | |
| LOOP: | |
| %f.not = icmp ult i24 %a, %b | |
| br i1 %f.not, label %B2, label %B1 | |
| B2: | |
| br label %LOOP | |
| B1: | |
| %x = add i24 %a, %b | |
| br label %B2 | |
| } | |
| ; Two reverse unreachable subgraphs with RU1* and RU2* basic blocks respectively. | |
| define void @test3(i24 %a, i24 %b, i32 %flag) { | |
| entry: | |
| switch i32 %flag, label %EXIT [ | |
| i32 1, label %RU1 | |
| i32 2, label %RU2 | |
| i32 3, label %RU2_B1 | |
| ] | |
| RU1: | |
| %f = icmp uge i24 %a, %b | |
| br label %RU1_LOOP | |
| RU1_LOOP: | |
| br i1 %f, label %RU1_B1, label %RU1_B2 | |
| RU1_B1: | |
| %x = add i24 %a, %b | |
| br label %RU1_B2 | |
| RU1_B2: | |
| br label %RU1_LOOP | |
| RU2: | |
| %f2 = icmp uge i24 %a, %b | |
| br i1 %f2, label %RU2_B1, label %RU2_B2 | |
| RU2_B1: | |
| br label %RU2_B2 | |
| RU2_B2: | |
| br label %RU2_B1 | |
| EXIT: | |
| ret void | |
| } | |
| ; The same as @test3 except the icmp conditions are canonicalized (as by instcombine). | |
| define void @test3-canonicalized(i24 %a, i24 %b, i32 %flag) { | |
| entry: | |
| switch i32 %flag, label %EXIT [ | |
| i32 1, label %RU1 | |
| i32 2, label %RU2 | |
| i32 3, label %RU2_B1 | |
| ] | |
| RU1: | |
| %f.not = icmp ult i24 %a, %b | |
| br label %RU1_LOOP | |
| RU1_LOOP: | |
| br i1 %f.not, label %RU1_B2, label %RU1_B1 | |
| RU1_B1: | |
| %x = add i24 %a, %b | |
| br label %RU1_B2 | |
| RU1_B2: | |
| br label %RU1_LOOP | |
| RU2: | |
| %f2.not = icmp ult i24 %a, %b | |
| br i1 %f2.not, label %RU2_B2, label %RU2_B1 | |
| RU2_B1: | |
| br label %RU2_B2 | |
| RU2_B2: | |
| br label %RU2_B1 | |
| EXIT: | |
| ret void | |
| } | |
| ; PostDomTrees of @test1(), @test2() and @test3() are different. | |
| ; PostDomTrees of @testX() and @testX-canonicalize() are the same. | |
| ; CHECK-POSTDOM-LABEL: test1 | |
| ; CHECK-POSTDOM-NEXT: =============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %entry | |
| ; CHECK-POSTDOM-NEXT: [4] %B2 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B1 | |
| ; CHECK-POSTDOM-LABEL: test1-canonicalized | |
| ; CHECK-POSTDOM-NEXT: =============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %entry | |
| ; CHECK-POSTDOM-NEXT: [4] %B2 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B1 | |
| ; CHECK-POSTDOM-LABEL: test2 | |
| ; CHECK-POSTDOM-NEXT: =============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %B2 | |
| ; CHECK-POSTDOM-NEXT: [3] %LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %entry | |
| ; CHECK-POSTDOM-NEXT: [3] %B1 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B2 | |
| ; CHECK-POSTDOM-LABEL: test2-canonicalized | |
| ; CHECK-POSTDOM-NEXT: =============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %B2 | |
| ; CHECK-POSTDOM-NEXT: [3] %LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %entry | |
| ; CHECK-POSTDOM-NEXT: [3] %B1 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B2 | |
| ; CHECK-POSTDOM-LABEL: test3 | |
| ; CHECK-POSTDOM-NEXT:=============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %EXIT | |
| ; CHECK-POSTDOM-NEXT: [2] %entry | |
| ; CHECK-POSTDOM-NEXT: [2] %RU1_B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU1_LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %RU1 | |
| ; CHECK-POSTDOM-NEXT: [4] %RU1_B2 | |
| ; CHECK-POSTDOM-NEXT: [2] %RU2_B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU2 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU2_B2 | |
| ; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1 | |
| ; CHECK-POSTDOM-LABEL: test3-canonicalized | |
| ; CHECK-POSTDOM-NEXT:=============================-------------------------------- | |
| ; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries. | |
| ; CHECK-POSTDOM-NEXT: [1] <<exit node>> | |
| ; CHECK-POSTDOM-NEXT: [2] %EXIT | |
| ; CHECK-POSTDOM-NEXT: [2] %entry | |
| ; CHECK-POSTDOM-NEXT: [2] %RU1_B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU1_LOOP | |
| ; CHECK-POSTDOM-NEXT: [4] %RU1 | |
| ; CHECK-POSTDOM-NEXT: [4] %RU1_B2 | |
| ; CHECK-POSTDOM-NEXT: [2] %RU2_B1 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU2 | |
| ; CHECK-POSTDOM-NEXT: [3] %RU2_B2 | |
| ; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1 |