diff options
Diffstat (limited to 'llvm/test/Transforms/FunctionAttrs/liveness.ll')
-rw-r--r-- | llvm/test/Transforms/FunctionAttrs/liveness.ll | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/liveness.ll b/llvm/test/Transforms/FunctionAttrs/liveness.ll deleted file mode 100644 index 1de005d15c5..00000000000 --- a/llvm/test/Transforms/FunctionAttrs/liveness.ll +++ /dev/null @@ -1,250 +0,0 @@ -; RUN: opt -attributor --attributor-disable=false -S < %s | FileCheck %s - -declare void @no_return_call() noreturn - -declare void @normal_call() - -declare i32 @foo() - -declare i32 @foo_noreturn() noreturn - -declare i32 @bar() - -; TEST 1: 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. - -define i32 @dead_block_present(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 = 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: 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 = 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 - %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 3: 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 4 noreturn invoke instruction replaced by a call and an unreachable instruction -; put after it. - -; 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 i32 @foo_noreturn() - ; CHECK-NEXT unreachable - -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: Undefined behvior, taken from LangRef. -; FIXME: Should be able to detect undefined behavior. - -; CHECK define @ub(i32) -define void @ub(i32* ) { - %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 6: 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 7: 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 8: 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 -} - -; TEST 9: Only first block is live. - -define i32 @first_block_no_return(i32 %a) #0 { -entry: - call void @no_return_call() - ; CHECK: call void @no_return_call() - ; CHECK-NEXT: unreachable - %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() - 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 -} |