diff options
author | Hal Finkel <hfinkel@anl.gov> | 2016-07-11 03:37:59 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2016-07-11 03:37:59 +0000 |
commit | b0d67723f07e6b093455a1f8b2ea4d3c316f1668 (patch) | |
tree | a3bb72a6ad75485d7227c2a7d42cbd0b6b06e5a4 | |
parent | 0017f3683d7bcf83f7af2791dc3b2d9fbeaacbd9 (diff) |
Pointer-comparison folding should look through returned-argument functions
For functions which are known to return a specific argument, pointer-comparison
folding can look through the function calls as part of its analysis.
Differential Revision: http://reviews.llvm.org/D9387
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275039 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 5 | ||||
-rw-r--r-- | test/Transforms/InstSimplify/returned.ll | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index a41be07fcd5..27c10ee7cf8 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -621,6 +621,11 @@ static Constant *stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V, break; V = GA->getAliasee(); } else { + if (auto CS = CallSite(V)) + if (Value *RV = CS.getReturnedArgOperand()) { + V = RV; + continue; + } break; } assert(V->getType()->getScalarType()->isPointerTy() && diff --git a/test/Transforms/InstSimplify/returned.ll b/test/Transforms/InstSimplify/returned.ll new file mode 100644 index 00000000000..0e89e91085d --- /dev/null +++ b/test/Transforms/InstSimplify/returned.ll @@ -0,0 +1,30 @@ +; RUN: opt -instsimplify -S < %s | FileCheck %s + +define i1 @bitcast() { +; CHECK-LABEL: @bitcast( + %a = alloca i32 + %b = alloca i64 + %x = bitcast i32* %a to i8* + %z = bitcast i64* %b to i8* + %y = call i8* @func1(i8* %z) + %cmp = icmp eq i8* %x, %y + ret i1 %cmp +; CHECK-NEXT: ret i1 false +} + +%gept = type { i32, i32 } + +define i1 @gep3() { +; CHECK-LABEL: @gep3( + %x = alloca %gept, align 8 + %a = getelementptr %gept, %gept* %x, i64 0, i32 0 + %y = call %gept* @func2(%gept* %x) + %b = getelementptr %gept, %gept* %y, i64 0, i32 1 + %equal = icmp eq i32* %a, %b + ret i1 %equal +; CHECK-NEXT: ret i1 false +} + +declare i8* @func1(i8* returned) nounwind readnone +declare %gept* @func2(%gept* returned) nounwind readnone + |