[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