summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/FunctionAttrs/liveness.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/FunctionAttrs/liveness.ll')
-rw-r--r--llvm/test/Transforms/FunctionAttrs/liveness.ll857
1 files changed, 0 insertions, 857 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/liveness.ll b/llvm/test/Transforms/FunctionAttrs/liveness.ll
deleted file mode 100644
index 4fea57ff921..00000000000
--- a/llvm/test/Transforms/FunctionAttrs/liveness.ll
+++ /dev/null
@@ -1,857 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s
-; UTC_ARGS: --turn off
-
-; CHECK: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]
-@dead_with_blockaddress_users.l = constant [2 x i8*] [i8* blockaddress(@dead_with_blockaddress_users, %lab0), i8* blockaddress(@dead_with_blockaddress_users, %end)]
-
-declare void @no_return_call() nofree noreturn nounwind readnone
-
-declare void @normal_call() readnone
-
-declare i32 @foo()
-
-declare i32 @foo_nounwind() nounwind
-
-declare i32 @foo_noreturn_nounwind() noreturn nounwind
-
-declare i32 @foo_noreturn() noreturn
-
-declare i32 @bar() nosync readnone
-
-; This internal function has no live call sites, so all its BBs are considered dead,
-; and nothing should be deduced for it.
-
-; CHECK-NOT: define internal i32 @dead_internal_func(i32 %0)
-define internal i32 @dead_internal_func(i32 %0) {
- %2 = icmp slt i32 %0, 1
- br i1 %2, label %3, label %5
-
-; <label>:3: ; preds = %5, %1
- %4 = phi i32 [ 1, %1 ], [ %8, %5 ]
- ret i32 %4
-
-; <label>:5: ; preds = %1, %5
- %6 = phi i32 [ %9, %5 ], [ 1, %1 ]
- %7 = phi i32 [ %8, %5 ], [ 1, %1 ]
- %8 = mul nsw i32 %6, %7
- %9 = add nuw nsw i32 %6, 1
- %10 = icmp eq i32 %6, %0
- br i1 %10, label %3, label %5
-}
-
-; CHECK: Function Attrs: nofree norecurse nounwind uwtable willreturn
-define i32 @volatile_load(i32*) norecurse nounwind uwtable {
- %2 = load volatile i32, i32* %0, align 4
- ret i32 %2
-}
-
-; CHECK-NOT: internal_load
-define internal i32 @internal_load(i32*) norecurse nounwind uwtable {
- %2 = load i32, i32* %0, align 4
- ret i32 %2
-}
-; TEST 1: Only first block is live.
-
-; CHECK: Function Attrs: nofree noreturn nosync nounwind
-; CHECK-NEXT: define i32 @first_block_no_return(i32 %a, i32* nocapture nofree nonnull readonly %ptr1, i32* nocapture nofree readnone %ptr2)
-define i32 @first_block_no_return(i32 %a, i32* nonnull %ptr1, i32* %ptr2) #0 {
-entry:
- call i32 @internal_load(i32* %ptr1)
- call void @no_return_call()
- ; CHECK: call void @no_return_call()
- ; CHECK-NEXT: unreachable
- call i32 @dead_internal_func(i32 10)
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call i32 @internal_load(i32* %ptr2)
- %load = call i32 @volatile_load(i32* %ptr1)
- call void @normal_call()
- %call = call i32 @foo()
- br label %cond.end
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %cond.true
- %cond = phi i32 [ %call, %cond.true ], [ %call1, %cond.false ]
- ret i32 %cond
-}
-
-; TEST 2: cond.true is dead, but cond.end is not, since cond.false is live
-
-; This is just an example. For example we can put a sync call in a
-; dead block and check if it is deduced.
-
-; CHECK: Function Attrs: nosync
-; CHECK-NEXT: define i32 @dead_block_present(i32 %a, i32* nocapture nofree readnone %ptr1)
-define i32 @dead_block_present(i32 %a, i32* %ptr1) #0 {
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @no_return_call()
- ; CHECK: call void @no_return_call()
- ; CHECK-NEXT: unreachable
- %call = call i32 @volatile_load(i32* %ptr1)
- br label %cond.end
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %cond.true
-; CHECK: cond.end:
-; CHECK-NEXT: ret i32 %call1
- %cond = phi i32 [ %call, %cond.true ], [ %call1, %cond.false ]
- ret i32 %cond
-}
-
-; TEST 3: both cond.true and cond.false are dead, therfore cond.end is dead as well.
-
-define i32 @all_dead(i32 %a) #0 {
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @no_return_call()
- ; CHECK: call void @no_return_call()
- ; CHECK-NEXT: unreachable
- call i32 @dead_internal_func(i32 10)
- ; CHECK-NOT: call
- %call = call i32 @foo()
- br label %cond.end
-
-cond.false: ; preds = %entry
- call void @no_return_call()
- ; CHECK: call void @no_return_call()
- ; CHECK-NEXT: unreachable
- call i32 @dead_internal_func(i32 10)
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %cond.true
- %cond = phi i32 [ %call, %cond.true ], [ %call1, %cond.false ]
- ret i32 %cond
-}
-
-declare i32 @__gxx_personality_v0(...)
-
-; TEST 4: All blocks are live.
-
-; CHECK: define i32 @all_live(i32 %a)
-define i32 @all_live(i32 %a) #0 {
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @normal_call()
- %call = call i32 @foo_noreturn()
- br label %cond.end
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %cond.true
- %cond = phi i32 [ %call, %cond.true ], [ %call1, %cond.false ]
- ret i32 %cond
-}
-
-; TEST 5.1 noreturn invoke instruction with a unreachable normal successor block.
-
-; CHECK: define i32 @invoke_noreturn(i32 %a)
-define i32 @invoke_noreturn(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @normal_call()
- %call = invoke i32 @foo_noreturn() to label %continue
- unwind label %cleanup
- ; CHECK: %call = invoke i32 @foo_noreturn()
- ; CHECK-NEXT: to label %continue unwind label %cleanup
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %continue
- %cond = phi i32 [ %call, %continue ], [ %call1, %cond.false ]
- ret i32 %cond
-
-continue:
- ; CHECK: continue:
- ; CHECK-NEXT: unreachable
- br label %cond.end
-
-cleanup:
- %res = landingpad { i8*, i32 }
- catch i8* null
- ret i32 0
-}
-
-; TEST 5.2 noreturn invoke instruction replaced by a call and an unreachable instruction
-; put after it.
-
-; CHECK: define i32 @invoke_noreturn_nounwind(i32 %a)
-define i32 @invoke_noreturn_nounwind(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @normal_call()
- %call = invoke i32 @foo_noreturn_nounwind() to label %continue
- unwind label %cleanup
- ; CHECK: call void @normal_call()
- ; CHECK-NEXT: call i32 @foo_noreturn_nounwind()
- ; CHECK-NEXT: unreachable
-
- ; CHECK-NOT: @foo_noreturn_nounwind()
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %continue
- %cond = phi i32 [ %call, %continue ], [ %call1, %cond.false ]
- ret i32 %cond
-
-continue:
- br label %cond.end
-
-cleanup:
- %res = landingpad { i8*, i32 }
- catch i8* null
- ret i32 0
-}
-
-; TEST 5.3 unounwind invoke instruction replaced by a call and a branch instruction put after it.
-define i32 @invoke_nounwind(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
-; CHECK-LABEL: define {{[^@]+}}@invoke_nounwind
-; CHECK: cond.true:
-; CHECK-NEXT: call void @normal_call()
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo_nounwind()
-; CHECK-NEXT: br label [[CONTINUE:%.*]]
-; CHECK: continue:
-; CHECK-NEXT: br label [[COND_END:%.*]]
-;
-entry:
- %cmp = icmp eq i32 %a, 0
- br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true: ; preds = %entry
- call void @normal_call()
- %call = invoke i32 @foo_nounwind() to label %continue
- unwind label %cleanup
-
-cond.false: ; preds = %entry
- call void @normal_call()
- %call1 = call i32 @bar()
- br label %cond.end
-
-cond.end: ; preds = %cond.false, %continue
- %cond = phi i32 [ %call, %continue ], [ %call1, %cond.false ]
- ret i32 %cond
-
-continue:
- br label %cond.end
-
-cleanup:
- %res = landingpad { i8*, i32 }
- catch i8* null
- ret i32 0
-}
-
-; UTC_ARGS: --turn off
-
-; TEST 6: Undefined behvior, taken from LangRef.
-; FIXME: Should be able to detect undefined behavior.
-
-; CHECK: define void @ub(i32* nocapture nofree writeonly %0)
-define void @ub(i32* %0) {
- %poison = sub nuw i32 0, 1 ; Results in a poison value.
- %still_poison = and i32 %poison, 0 ; 0, but also poison.
- %poison_yet_again = getelementptr i32, i32* %0, i32 %still_poison
- store i32 0, i32* %poison_yet_again ; Undefined behavior due to store to poison.
- ret void
-}
-
-define void @inf_loop() #0 {
-entry:
- br label %while.body
-
-while.body: ; preds = %entry, %while.body
- br label %while.body
-}
-
-; TEST 7: Infinite loop.
-; FIXME: Detect infloops, and mark affected blocks dead.
-
-define i32 @test5(i32, i32) #0 {
- %3 = icmp sgt i32 %0, %1
- br i1 %3, label %cond.if, label %cond.elseif
-
-cond.if: ; preds = %2
- %4 = tail call i32 @bar()
- br label %cond.end
-
-cond.elseif: ; preds = %2
- call void @inf_loop()
- %5 = icmp slt i32 %0, %1
- br i1 %5, label %cond.end, label %cond.else
-
-cond.else: ; preds = %cond.elseif
- %6 = tail call i32 @foo()
- br label %cond.end
-
-cond.end: ; preds = %cond.if, %cond.else, %cond.elseif
- %7 = phi i32 [ %1, %cond.elseif ], [ 0, %cond.else ], [ 0, %cond.if ]
- ret i32 %7
-}
-
-define void @rec() #0 {
-entry:
- call void @rec()
- ret void
-}
-
-; TEST 8: Recursion
-; FIXME: everything after first block should be marked dead
-; and unreachable should be put after call to @rec().
-
-define i32 @test6(i32, i32) #0 {
- call void @rec()
- %3 = icmp sgt i32 %0, %1
- br i1 %3, label %cond.if, label %cond.elseif
-
-cond.if: ; preds = %2
- %4 = tail call i32 @bar()
- br label %cond.end
-
-cond.elseif: ; preds = %2
- call void @rec()
- %5 = icmp slt i32 %0, %1
- br i1 %5, label %cond.end, label %cond.else
-
-cond.else: ; preds = %cond.elseif
- %6 = tail call i32 @foo()
- br label %cond.end
-
-cond.end: ; preds = %cond.if, %cond.else, %cond.elseif
- %7 = phi i32 [ %1, %cond.elseif ], [ 0, %cond.else ], [ 0, %cond.if ]
- ret i32 %7
-}
-; TEST 9: Recursion
-; FIXME: contains recursive call to itself in cond.elseif block
-
-define i32 @test7(i32, i32) #0 {
- %3 = icmp sgt i32 %0, %1
- br i1 %3, label %cond.if, label %cond.elseif
-
-cond.if: ; preds = %2
- %4 = tail call i32 @bar()
- br label %cond.end
-
-cond.elseif: ; preds = %2
- %5 = tail call i32 @test7(i32 %0, i32 %1)
- %6 = icmp slt i32 %0, %1
- br i1 %6, label %cond.end, label %cond.else
-
-cond.else: ; preds = %cond.elseif
- %7 = tail call i32 @foo()
- br label %cond.end
-
-cond.end: ; preds = %cond.if, %cond.else, %cond.elseif
- %8 = phi i32 [ %1, %cond.elseif ], [ 0, %cond.else ], [ 0, %cond.if ]
- ret i32 %8
-}
-
-; SCC test
-;
-; char a1 __attribute__((aligned(8)));
-; char a2 __attribute__((aligned(16)));
-;
-; char* f1(char* a ){
-; return a?a:f2(&a1);
-; }
-; char* f2(char* a){
-; return a?f1(a):f3(&a2);
-; }
-;
-; char* f3(char* a){
-; return a?&a1: f1(&a2);
-; }
-
-@a1 = common global i8 0, align 8
-@a2 = common global i8 0, align 16
-
-define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {
-; ATTRIBUTOR: define internal i8* @f1(i8* readnone %0)
- %2 = icmp eq i8* %0, null
- br i1 %2, label %3, label %5
-
-; <label>:3: ; preds = %1
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 8 @a1)
- %4 = tail call i8* @f2(i8* nonnull @a1)
- br label %5
-
-; <label>:5: ; preds = %1, %3
- %6 = phi i8* [ %4, %3 ], [ %0, %1 ]
- ret i8* %6
-}
-
-define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {
-; ATTRIBUTOR: define internal i8* @f2(i8* readnone %0)
- %2 = icmp eq i8* %0, null
- br i1 %2, label %5, label %3
-
-; <label>:3: ; preds = %1
-
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 8 %0)
- %4 = tail call i8* @f1(i8* nonnull %0)
- br label %7
-
-; <label>:5: ; preds = %1
-; ATTRIBUTOR: %6 = tail call i8* undef(i8* nonnull align 16 @a2)
- %6 = tail call i8* @f3(i8* nonnull @a2)
- br label %7
-
-; <label>:7: ; preds = %5, %3
- %8 = phi i8* [ %4, %3 ], [ %6, %5 ]
- ret i8* %8
-}
-
-define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {
-; ATTRIBUTOR: define internal i8* @f3(i8* readnone %0)
- %2 = icmp eq i8* %0, null
- br i1 %2, label %3, label %5
-
-; <label>:3: ; preds = %1
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 16 @a2)
- %4 = tail call i8* @f1(i8* nonnull @a2)
- br label %5
-
-; <label>:5: ; preds = %1, %3
- %6 = phi i8* [ %4, %3 ], [ @a1, %1 ]
- ret i8* %6
-}
-
-define void @test_unreachable() {
-; CHECK: define void @test_unreachable()
-; CHECK-NEXT: call void @test_unreachable()
-; CHECK-NEXT: unreachable
-; CHECK-NEXT: }
- call void @test_unreachable()
- unreachable
-}
-
-define linkonce_odr void @non_exact1() {
- call void @non_dead_a0()
- call void @non_dead_a1()
- call void @non_dead_a2()
- call void @non_dead_a3()
- call void @non_dead_a4()
- call void @non_dead_a5()
- call void @non_dead_a6()
- call void @non_dead_a7()
- call void @non_dead_a8()
- call void @non_dead_a9()
- call void @non_dead_a10()
- call void @non_dead_a11()
- call void @non_dead_a12()
- call void @non_dead_a13()
- call void @non_dead_a14()
- call void @non_dead_a15()
- call void @middle()
- ret void
-}
-define internal void @middle() {
-bb0:
- call void @non_dead_b0()
- call void @non_dead_b1()
- call void @non_dead_b2()
- call void @non_dead_b3()
-br label %bb1
-bb1:
- call void @non_dead_b4()
- call void @non_dead_b5()
- call void @non_dead_b6()
- call void @non_dead_b7()
-br label %bb2
-bb2:
- call void @non_dead_b8()
- call void @non_dead_b9()
- call void @non_dead_b10()
- call void @non_dead_b11()
-br label %bb3
-bb3:
- call void @non_dead_b12()
- call void @non_dead_b13()
- call void @non_dead_b14()
- call void @non_dead_b15()
-br label %bb4
-bb4:
- call void @non_exact2()
- ret void
-}
-define linkonce_odr void @non_exact2() {
- call void @non_dead_c0()
- call void @non_dead_c1()
- call void @non_dead_c2()
- call void @non_dead_c3()
- call void @non_dead_c4()
- call void @non_dead_c5()
- call void @non_dead_c6()
- call void @non_dead_c7()
- call void @non_dead_c8()
- call void @non_dead_c9()
- call void @non_dead_c10()
- call void @non_dead_c11()
- call void @non_dead_c12()
- call void @non_dead_c13()
- call void @non_dead_c14()
- call void @non_dead_c15()
- call void @non_exact3()
- ret void
-}
-define linkonce_odr void @non_exact3() {
- call void @non_dead_d0()
- call void @non_dead_d1()
- call void @non_dead_d2()
- call void @non_dead_d3()
- call void @non_dead_d4()
- call void @non_dead_d5()
- call void @non_dead_d6()
- call void @non_dead_d7()
- call void @non_dead_d8()
- call void @non_dead_d9()
- call void @non_dead_d10()
- call void @non_dead_d11()
- call void @non_dead_d12()
- call void @non_dead_d13()
- call void @non_dead_d14()
- call void @non_dead_d15()
- %nr = call i32 @foo_noreturn()
- call void @dead_e1()
- ret void
-}
-; CHECK: define linkonce_odr void @non_exact3() {
-; CHECK-NEXT: call void @non_dead_d0()
-; CHECK-NEXT: call void @non_dead_d1()
-; CHECK-NEXT: call void @non_dead_d2()
-; CHECK-NEXT: call void @non_dead_d3()
-; CHECK-NEXT: call void @non_dead_d4()
-; CHECK-NEXT: call void @non_dead_d5()
-; CHECK-NEXT: call void @non_dead_d6()
-; CHECK-NEXT: call void @non_dead_d7()
-; CHECK-NEXT: call void @non_dead_d8()
-; CHECK-NEXT: call void @non_dead_d9()
-; CHECK-NEXT: call void @non_dead_d10()
-; CHECK-NEXT: call void @non_dead_d11()
-; CHECK-NEXT: call void @non_dead_d12()
-; CHECK-NEXT: call void @non_dead_d13()
-; CHECK-NEXT: call void @non_dead_d14()
-; CHECK-NEXT: call void @non_dead_d15()
-; CHECK-NEXT: %nr = call i32 @foo_noreturn()
-; CHECK-NEXT: unreachable
-
-define internal void @non_dead_a0() { ret void }
-define internal void @non_dead_a1() { ret void }
-define internal void @non_dead_a2() { ret void }
-define internal void @non_dead_a3() { ret void }
-define internal void @non_dead_a4() { ret void }
-define internal void @non_dead_a5() { ret void }
-define internal void @non_dead_a6() { ret void }
-define internal void @non_dead_a7() { ret void }
-define internal void @non_dead_a8() { ret void }
-define internal void @non_dead_a9() { ret void }
-define internal void @non_dead_a10() { ret void }
-define internal void @non_dead_a11() { ret void }
-define internal void @non_dead_a12() { ret void }
-define internal void @non_dead_a13() { ret void }
-define internal void @non_dead_a14() { ret void }
-define internal void @non_dead_a15() { ret void }
-define internal void @non_dead_b0() { ret void }
-define internal void @non_dead_b1() { ret void }
-define internal void @non_dead_b2() { ret void }
-define internal void @non_dead_b3() { ret void }
-define internal void @non_dead_b4() { ret void }
-define internal void @non_dead_b5() { ret void }
-define internal void @non_dead_b6() { ret void }
-define internal void @non_dead_b7() { ret void }
-define internal void @non_dead_b8() { ret void }
-define internal void @non_dead_b9() { ret void }
-define internal void @non_dead_b10() { ret void }
-define internal void @non_dead_b11() { ret void }
-define internal void @non_dead_b12() { ret void }
-define internal void @non_dead_b13() { ret void }
-define internal void @non_dead_b14() { ret void }
-define internal void @non_dead_b15() { ret void }
-define internal void @non_dead_c0() { ret void }
-define internal void @non_dead_c1() { ret void }
-define internal void @non_dead_c2() { ret void }
-define internal void @non_dead_c3() { ret void }
-define internal void @non_dead_c4() { ret void }
-define internal void @non_dead_c5() { ret void }
-define internal void @non_dead_c6() { ret void }
-define internal void @non_dead_c7() { ret void }
-define internal void @non_dead_c8() { ret void }
-define internal void @non_dead_c9() { ret void }
-define internal void @non_dead_c10() { ret void }
-define internal void @non_dead_c11() { ret void }
-define internal void @non_dead_c12() { ret void }
-define internal void @non_dead_c13() { ret void }
-define internal void @non_dead_c14() { ret void }
-define internal void @non_dead_c15() { ret void }
-define internal void @non_dead_d0() { ret void }
-define internal void @non_dead_d1() { ret void }
-define internal void @non_dead_d2() { ret void }
-define internal void @non_dead_d3() { ret void }
-define internal void @non_dead_d4() { ret void }
-define internal void @non_dead_d5() { ret void }
-define internal void @non_dead_d6() { ret void }
-define internal void @non_dead_d7() { ret void }
-define internal void @non_dead_d8() { ret void }
-define internal void @non_dead_d9() { ret void }
-define internal void @non_dead_d10() { ret void }
-define internal void @non_dead_d11() { ret void }
-define internal void @non_dead_d12() { ret void }
-define internal void @non_dead_d13() { ret void }
-define internal void @non_dead_d14() { ret void }
-define internal void @non_dead_d15() { ret void }
-define internal void @dead_e0() { call void @dead_e1() ret void }
-define internal void @dead_e1() { call void @dead_e2() ret void }
-define internal void @dead_e2() { ret void }
-
-; CHECK: define internal void @non_dead_a0()
-; CHECK: define internal void @non_dead_a1()
-; CHECK: define internal void @non_dead_a2()
-; CHECK: define internal void @non_dead_a3()
-; CHECK: define internal void @non_dead_a4()
-; CHECK: define internal void @non_dead_a5()
-; CHECK: define internal void @non_dead_a6()
-; CHECK: define internal void @non_dead_a7()
-; CHECK: define internal void @non_dead_a8()
-; CHECK: define internal void @non_dead_a9()
-; CHECK: define internal void @non_dead_a10()
-; CHECK: define internal void @non_dead_a11()
-; CHECK: define internal void @non_dead_a12()
-; CHECK: define internal void @non_dead_a13()
-; CHECK: define internal void @non_dead_a14()
-; CHECK: define internal void @non_dead_a15()
-; CHECK: define internal void @non_dead_b0()
-; CHECK: define internal void @non_dead_b1()
-; CHECK: define internal void @non_dead_b2()
-; CHECK: define internal void @non_dead_b3()
-; CHECK: define internal void @non_dead_b4()
-; CHECK: define internal void @non_dead_b5()
-; CHECK: define internal void @non_dead_b6()
-; CHECK: define internal void @non_dead_b7()
-; CHECK: define internal void @non_dead_b8()
-; CHECK: define internal void @non_dead_b9()
-; CHECK: define internal void @non_dead_b10()
-; CHECK: define internal void @non_dead_b11()
-; CHECK: define internal void @non_dead_b12()
-; CHECK: define internal void @non_dead_b13()
-; CHECK: define internal void @non_dead_b14()
-; CHECK: define internal void @non_dead_b15()
-; CHECK: define internal void @non_dead_c0()
-; CHECK: define internal void @non_dead_c1()
-; CHECK: define internal void @non_dead_c2()
-; CHECK: define internal void @non_dead_c3()
-; CHECK: define internal void @non_dead_c4()
-; CHECK: define internal void @non_dead_c5()
-; CHECK: define internal void @non_dead_c6()
-; CHECK: define internal void @non_dead_c7()
-; CHECK: define internal void @non_dead_c8()
-; CHECK: define internal void @non_dead_c9()
-; CHECK: define internal void @non_dead_c10()
-; CHECK: define internal void @non_dead_c11()
-; CHECK: define internal void @non_dead_c12()
-; CHECK: define internal void @non_dead_c13()
-; CHECK: define internal void @non_dead_c14()
-; CHECK: define internal void @non_dead_c15()
-; CHECK: define internal void @non_dead_d0()
-; CHECK: define internal void @non_dead_d1()
-; CHECK: define internal void @non_dead_d2()
-; CHECK: define internal void @non_dead_d3()
-; CHECK: define internal void @non_dead_d4()
-; CHECK: define internal void @non_dead_d5()
-; CHECK: define internal void @non_dead_d6()
-; CHECK: define internal void @non_dead_d7()
-; CHECK: define internal void @non_dead_d8()
-; CHECK: define internal void @non_dead_d9()
-; CHECK: define internal void @non_dead_d10()
-; CHECK: define internal void @non_dead_d11()
-; CHECK: define internal void @non_dead_d12()
-; CHECK: define internal void @non_dead_d13()
-; CHECK: define internal void @non_dead_d14()
-; Verify we actually deduce information for these functions.
-; CHECK: Function Attrs: nofree nosync nounwind readnone willreturn
-; CHECK-NEXT: define internal void @non_dead_d15()
-; CHECK-NOT: define internal void @dead_e
-
-
-declare void @blowup() noreturn
-define void @live_with_dead_entry() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
-; CHECK: define void @live_with_dead_entry(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: invoke void @blowup()
-; CHECK-NEXT: to label %live_with_dead_entry.dead unwind label %lpad
-; CHECK: lpad: ; preds = %entry
-; CHECK-NEXT: %0 = landingpad { i8*, i32 }
-; CHECK-NEXT: catch i8* null
-; CHECK-NEXT: br label %live_with_dead_entry
-; CHECK: live_with_dead_entry.dead: ; preds = %entry
-; CHECK-NEXT: unreachable
-; CHECK: live_with_dead_entry: ; preds = %lpad
-; CHECK-NEXT: ret void
-entry:
- invoke void @blowup() to label %live_with_dead_entry unwind label %lpad
-lpad:
- %0 = landingpad { i8*, i32 } catch i8* null
- br label %live_with_dead_entry
-live_with_dead_entry:
- ret void
-}
-
-define void @live_with_dead_entry_lp() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
-; CHECK: define void @live_with_dead_entry_lp(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: invoke void @blowup()
-; CHECK-NEXT: to label %live_with_dead_entry.dead unwind label %lp1
-; CHECK: lp1: ; preds = %entry
-; CHECK-NEXT: %lp = landingpad { i8*, i32 }
-; CHECK-NEXT: catch i8* null
-; CHECK-NEXT: invoke void @blowup()
-; CHECK-NEXT: to label %live_with_dead_entry.dead1 unwind label %lp2
-; CHECK: lp2: ; preds = %lp1
-; CHECK-NEXT: %0 = landingpad { i8*, i32 }
-; CHECK-NEXT: catch i8* null
-; CHECK-NEXT: br label %live_with_dead_entry
-; CHECK: live_with_dead_entry.dead:
-; CHECK-NEXT: unreachable
-; CHECK: live_with_dead_entry.dead1:
-; CHECK-NEXT: unreachable
-; CHECK: live_with_dead_entry: ; preds = %lp2
-; CHECK-NEXT: ret void
-entry:
- invoke void @blowup() to label %live_with_dead_entry unwind label %lp1
-lp1:
- %lp = landingpad { i8*, i32 } catch i8* null
- invoke void @blowup() to label %live_with_dead_entry unwind label %lp2
-lp2:
- %0 = landingpad { i8*, i32 } catch i8* null
- br label %live_with_dead_entry
-live_with_dead_entry:
- ret void
-}
-
-; CHECK: define internal void @useless_arg_sink(i32* nocapture nofree readnone %a)
-define internal void @useless_arg_sink(i32* %a) {
- ret void
-}
-
-; CHECK: define internal void @useless_arg_almost_sink(i32* nocapture nofree readnone %a)
-define internal void @useless_arg_almost_sink(i32* %a) {
-; CHECK: call void @useless_arg_sink(i32* nofree undef)
- call void @useless_arg_sink(i32* %a)
- ret void
-}
-
-; Check we do not annotate the function interface of this weak function.
-; CHECK: define weak_odr void @useless_arg_ext(i32* %a)
-define weak_odr void @useless_arg_ext(i32* %a) {
-; CHECK: call void @useless_arg_almost_sink(i32* nofree undef)
- call void @useless_arg_almost_sink(i32* %a)
- ret void
-}
-
-; CHECK: define internal void @useless_arg_ext_int(i32* %a)
-define internal void @useless_arg_ext_int(i32* %a) {
-; CHECK: call void @useless_arg_ext(i32* %a)
- call void @useless_arg_ext(i32* %a)
- ret void
-}
-
-define void @useless_arg_ext_int_ext(i32* %a) {
-; CHECK: call void @useless_arg_ext_int(i32* %a)
- call void @useless_arg_ext_int(i32* %a)
- ret void
-}
-
-; UTC_ARGS: --turn on
-
-; FIXME: We should fold terminators.
-
-define internal i32 @switch_default(i64 %i) nounwind {
-; CHECK-LABEL: define {{[^@]+}}@switch_default
-; CHECK-SAME: (i64 [[I:%.*]])
-; CHECK-NEXT: entry:
-; CHECK-NEXT: switch i64 0, label [[SW_DEFAULT:%.*]] [
-; CHECK-NEXT: i64 3, label [[RETURN:%.*]]
-; CHECK-NEXT: i64 10, label [[RETURN]]
-; CHECK-NEXT: ]
-; CHECK: sw.default:
-; CHECK-NEXT: ret i32 123
-; CHECK: return:
-; CHECK-NEXT: unreachable
-;
-entry:
- switch i64 %i, label %sw.default [
- i64 3, label %return
- i64 10, label %return
- ]
-
-sw.default:
- ret i32 123
-
-return:
- ret i32 0
-}
-
-define i32 @switch_default_caller() {
-; CHECK-LABEL: define {{[^@]+}}@switch_default_caller()
-; CHECK-NEXT: [[CALL2:%.*]] = tail call i32 @switch_default(i64 0)
-; CHECK-NEXT: ret i32 123
-;
- %call2 = tail call i32 @switch_default(i64 0)
- ret i32 %call2
-}
-; UTC_ARGS: --turn off
-
-; Allow blockaddress users
-; CHECK-NOT @dead_with_blockaddress_users
-define internal void @dead_with_blockaddress_users(i32* nocapture %pc) nounwind readonly {
-entry:
- br label %indirectgoto
-
-lab0: ; preds = %indirectgoto
- %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1]
- br label %indirectgoto
-
-end: ; preds = %indirectgoto
- ret void
-
-indirectgoto: ; preds = %lab0, %entry
- %indvar = phi i32 [ %indvar.next, %lab0 ], [ 0, %entry ] ; <i32> [#uses=2]
- %pc.addr.0 = getelementptr i32, i32* %pc, i32 %indvar ; <i32*> [#uses=1]
- %tmp1.pn = load i32, i32* %pc.addr.0 ; <i32> [#uses=1]
- %indirect.goto.dest.in = getelementptr inbounds [2 x i8*], [2 x i8*]* @dead_with_blockaddress_users.l, i32 0, i32 %tmp1.pn ; <i8**> [#uses=1]
- %indirect.goto.dest = load i8*, i8** %indirect.goto.dest.in ; <i8*> [#uses=1]
- indirectbr i8* %indirect.goto.dest, [label %lab0, label %end]
-}
OpenPOWER on IntegriCloud