diff options
Diffstat (limited to 'test/Transforms/DeadArgElim/returned.ll')
-rw-r--r-- | test/Transforms/DeadArgElim/returned.ll | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/Transforms/DeadArgElim/returned.ll b/test/Transforms/DeadArgElim/returned.ll new file mode 100644 index 0000000000..c4d3ec7d3c --- /dev/null +++ b/test/Transforms/DeadArgElim/returned.ll @@ -0,0 +1,55 @@ +; RUN: opt < %s -deadargelim -S | FileCheck %s + +%Ty = type { i32, i32 } + +; sanity check that the argument and return value are both dead +; CHECK: define internal void @test1() + +define internal %Ty* @test1(%Ty* %this) { + ret %Ty* %this +} + +; do not keep alive the return value of a function with a dead 'returned' argument +; CHECK: define internal void @test2() + +define internal %Ty* @test2(%Ty* returned %this) { + ret %Ty* %this +} + +; dummy to keep 'this' alive +@dummy = global %Ty* null + +; sanity check that return value is dead +; CHECK: define internal void @test3(%Ty* %this) + +define internal %Ty* @test3(%Ty* %this) { + store volatile %Ty* %this, %Ty** @dummy + ret %Ty* %this +} + +; keep alive return value of a function if the 'returned' argument is live +; CHECK: define internal %Ty* @test4(%Ty* returned %this) + +define internal %Ty* @test4(%Ty* returned %this) { + store volatile %Ty* %this, %Ty** @dummy + ret %Ty* %this +} + +; don't do this if 'returned' is on the call site... +; CHECK: define internal void @test5(%Ty* %this) + +define internal %Ty* @test5(%Ty* %this) { + store volatile %Ty* %this, %Ty** @dummy + ret %Ty* %this +} + +define %Ty* @caller(%Ty* %this) { + %1 = call %Ty* @test1(%Ty* %this) + %2 = call %Ty* @test2(%Ty* %this) + %3 = call %Ty* @test3(%Ty* %this) + %4 = call %Ty* @test4(%Ty* %this) +; ...instead, drop 'returned' form the call site +; CHECK: call void @test5(%Ty* %this) + %5 = call %Ty* @test5(%Ty* returned %this) + ret %Ty* %this +} |