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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
; RUN: opt -S -ipsccp < %s | FileCheck %s
declare void @BB0_f()
declare void @BB1_f()
; Make sure we can eliminate what is in BB0 as we know that the indirectbr is going to BB1.
;
; CHECK-LABEL: define void @indbrtest1(
; CHECK-NOT: call void @BB0_f()
; CHECK: ret void
define void @indbrtest1() {
entry:
indirectbr i8* blockaddress(@indbrtest1, %BB1), [label %BB0, label %BB1]
BB0:
call void @BB0_f()
br label %BB1
BB1:
call void @BB1_f()
ret void
}
; Make sure we can eliminate what is in BB0 as we know that the indirectbr is going to BB1
; by looking through the casts. The casts should be folded away when they are visited
; before the indirectbr instruction.
;
; CHECK-LABEL: define void @indbrtest2(
; CHECK-NOT: call void @BB0_f()
; CHECK: ret void
define void @indbrtest2() {
entry:
%a = ptrtoint i8* blockaddress(@indbrtest2, %BB1) to i64
%b = inttoptr i64 %a to i8*
%c = bitcast i8* %b to i8*
indirectbr i8* %b, [label %BB0, label %BB1]
BB0:
call void @BB0_f()
br label %BB1
BB1:
call void @BB1_f()
ret void
}
; Make sure we can not eliminate BB0 as we do not know the target of the indirectbr.
;
; CHECK-LABEL: define void @indbrtest3(
; CHECK: call void @BB0_f()
; CHECK: ret void
define void @indbrtest3(i8** %Q) {
entry:
%t = load i8*, i8** %Q
indirectbr i8* %t, [label %BB0, label %BB1]
BB0:
call void @BB0_f()
br label %BB1
BB1:
call void @BB1_f()
ret void
}
; Make sure we eliminate BB1 as we pick the first successor on undef.
;
; CHECK-LABEL: define void @indbrtest4(
; CHECK: call void @BB0_f()
; CHECK: ret void
define void @indbrtest4(i8** %Q) {
entry:
indirectbr i8* undef, [label %BB0, label %BB1]
BB0:
call void @BB0_f()
br label %BB1
BB1:
call void @BB1_f()
ret void
}
; CHECK-LABEL: define internal i32 @indbrtest5(
; CHECK: ret i32 undef
define internal i32 @indbrtest5(i1 %c) {
entry:
br i1 %c, label %bb1, label %bb2
bb1:
br label %branch.block
bb2:
br label %branch.block
branch.block:
%addr = phi i8* [blockaddress(@indbrtest5, %target1), %bb1], [blockaddress(@indbrtest5, %target2), %bb2]
indirectbr i8* %addr, [label %target1, label %target2]
target1:
br label %target2
target2:
ret i32 10
}
define i32 @indbrtest5_callee(i1 %c) {
; CHECK-LABEL: define i32 @indbrtest5_callee(
; CHECK-NEXT: %r = call i32 @indbrtest5(i1 %c)
; CHECK-NEXT: ret i32 10
%r = call i32 @indbrtest5(i1 %c)
ret i32 %r
}
|