diff options
author | Piotr Padlewski <prazek@google.com> | 2015-08-25 01:34:15 +0000 |
---|---|---|
committer | Piotr Padlewski <prazek@google.com> | 2015-08-25 01:34:15 +0000 |
commit | 4e7f752bb8424936857dfb47c8e8000edc50d2e8 (patch) | |
tree | 0652a10f703e63015f995eb41921fc04c83b5f5a | |
parent | fb65a3a657daec596ee0380a20797b2855efd17f (diff) | |
download | bcm5719-llvm-4e7f752bb8424936857dfb47c8e8000edc50d2e8.tar.gz bcm5719-llvm-4e7f752bb8424936857dfb47c8e8000edc50d2e8.zip |
Assume intrinsic handling in global opt
It doesn't solve the problem, when for example we load something, and
then assume that it is the same as some constant value, because
globalopt will fail on unknown load instruction. The proposed solution
would be to skip some instructions that we can't evaluate and they are
safe to skip (f.e. load, assume and many others) and see if they are
required to perform optimization (f.e. we don't care about ephemeral
instructions that may appear using @llvm.assume())
http://reviews.llvm.org/D12266
llvm-svn: 245919
-rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/GlobalOpt/assume.ll | 21 |
2 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index af19e7d3b4e..c60b3ccc298 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2504,6 +2504,10 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst, // Continue even if we do nothing. ++CurInst; continue; + } else if (II->getIntrinsicID() == Intrinsic::assume) { + DEBUG(dbgs() << "Skipping assume intrinsic.\n"); + ++CurInst; + continue; } DEBUG(dbgs() << "Unknown intrinsic. Can not evaluate.\n"); diff --git a/llvm/test/Transforms/GlobalOpt/assume.ll b/llvm/test/Transforms/GlobalOpt/assume.ll new file mode 100644 index 00000000000..59e80b1c554 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/assume.ll @@ -0,0 +1,21 @@ +; RUN: opt -S -globalopt < %s | FileCheck %s + +; CHECK: @tmp = global i32 42 + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] +@tmp = global i32 0 + +define i32 @TheAnswerToLifeTheUniverseAndEverything() { + ret i32 42 +} + +define void @_GLOBAL__I_a() i8* undef { +enter: + %tmp1 = call i32 @TheAnswerToLifeTheUniverseAndEverything() + store i32 %tmp1, i32* @tmp + %cmp = icmp eq i32 %tmp1, 42 + call void @llvm.assume(i1 %cmp) + ret void +} + +declare void @llvm.assume(i1) |