[llvm] r245919 - Assume intrinsic handling in global opt
Piotr Padlewski via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 18:34:15 PDT 2015
Author: prazek
Date: Mon Aug 24 20:34:15 2015
New Revision: 245919
URL: http://llvm.org/viewvc/llvm-project?rev=245919&view=rev
Log:
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
Added:
llvm/trunk/test/Transforms/GlobalOpt/assume.ll
Modified:
llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=245919&r1=245918&r2=245919&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Mon Aug 24 20:34:15 2015
@@ -2504,6 +2504,10 @@ bool Evaluator::EvaluateBlock(BasicBlock
// 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");
Added: llvm/trunk/test/Transforms/GlobalOpt/assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/assume.ll?rev=245919&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/assume.ll (added)
+++ llvm/trunk/test/Transforms/GlobalOpt/assume.ll Mon Aug 24 20:34:15 2015
@@ -0,0 +1,21 @@
+; RUN: opt -S -globalopt < %s | FileCheck %s
+
+; CHECK: @tmp = global i32 42
+
+ at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at 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)
More information about the llvm-commits
mailing list