
Should cover most of the tests for GVN, GVNHoist, GVNSink, GlobalOpt, GlobalSplit, InstCombine, Reassociate, SROA and TailCallElim that had not been updated earlier.
222 lines
5.7 KiB
LLVM
222 lines
5.7 KiB
LLVM
; 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
|