diff options
author | Stephen Lin <stephenwlin@gmail.com> | 2013-06-30 20:26:21 +0000 |
---|---|---|
committer | Stephen Lin <stephenwlin@gmail.com> | 2013-06-30 20:26:21 +0000 |
commit | 3f4385a0b6f52ff0feb99ddb6431b7e7960b13af (patch) | |
tree | f59374abdad44b641c1f978d95a463c1a6f13cee /test/Transforms/DeadArgElim | |
parent | 80c070493d657a4bcc6eca5627c28d659d3330d8 (diff) | |
download | llvm-3f4385a0b6f52ff0feb99ddb6431b7e7960b13af.tar.gz llvm-3f4385a0b6f52ff0feb99ddb6431b7e7960b13af.tar.bz2 llvm-3f4385a0b6f52ff0feb99ddb6431b7e7960b13af.tar.xz |
DeadArgumentElimination: keep return value on functions that have a live argument with the 'returned' attribute (rather than generate invalid IR); however, if both can be eliminated, both will be
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185290 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/DeadArgElim')
-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 +} |