[llvm-commits] [PATCH] Basic lowering for LLVM invariants
hfinkel at anl.gov
hfinkel at anl.gov
Wed Dec 5 16:17:38 PST 2012
LLVM invariants are free, but not dead.
http://llvm-reviews.chandlerc.com/D179
Files:
lib/Analysis/CodeMetrics.cpp
lib/Analysis/ValueTracking.cpp
lib/CodeGen/IntrinsicLowering.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/Transforms/Scalar/ADCE.cpp
lib/Transforms/Utils/Local.cpp
Index: lib/Analysis/CodeMetrics.cpp
===================================================================
--- lib/Analysis/CodeMetrics.cpp
+++ lib/Analysis/CodeMetrics.cpp
@@ -69,6 +69,7 @@
return false;
case Intrinsic::dbg_declare:
case Intrinsic::dbg_value:
+ case Intrinsic::invariant:
case Intrinsic::invariant_start:
case Intrinsic::invariant_end:
case Intrinsic::lifetime_start:
Index: lib/Analysis/ValueTracking.cpp
===================================================================
--- lib/Analysis/ValueTracking.cpp
+++ lib/Analysis/ValueTracking.cpp
@@ -1898,6 +1898,7 @@
// should be considered at least *safe* to speculate...
case Intrinsic::dbg_declare:
case Intrinsic::dbg_value:
+ case Intrinsic::invariant:
return true;
case Intrinsic::bswap:
Index: lib/CodeGen/IntrinsicLowering.cpp
===================================================================
--- lib/CodeGen/IntrinsicLowering.cpp
+++ lib/CodeGen/IntrinsicLowering.cpp
@@ -453,6 +453,7 @@
CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1));
break;
+ case Intrinsic::invariant:
case Intrinsic::var_annotation:
break; // Strip out annotate intrinsic
Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -5018,6 +5018,7 @@
setValue(&I, Res);
return 0;
}
+ case Intrinsic::invariant:
case Intrinsic::var_annotation:
// Discard annotate attributes
return 0;
Index: lib/Transforms/Scalar/ADCE.cpp
===================================================================
--- lib/Transforms/Scalar/ADCE.cpp
+++ lib/Transforms/Scalar/ADCE.cpp
@@ -23,6 +23,7 @@
#include "llvm/BasicBlock.h"
#include "llvm/Instructions.h"
#include "llvm/IntrinsicInst.h"
+#include "llvm/Intrinsics.h"
#include "llvm/Pass.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/InstIterator.h"
@@ -49,14 +50,22 @@
char ADCE::ID = 0;
INITIALIZE_PASS(ADCE, "adce", "Aggressive Dead Code Elimination", false, false)
+static bool isInvariantIntrinsic(Instruction *I) {
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
+ return II->getIntrinsicID() == Intrinsic::invariant;
+
+ return false;
+}
+
bool ADCE::runOnFunction(Function& F) {
SmallPtrSet<Instruction*, 128> alive;
SmallVector<Instruction*, 128> worklist;
// Collect the set of "root" instructions that are known live.
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
if (isa<TerminatorInst>(I.getInstructionIterator()) ||
isa<DbgInfoIntrinsic>(I.getInstructionIterator()) ||
+ isInvariantIntrinsic(I.getInstructionIterator()) ||
isa<LandingPadInst>(I.getInstructionIterator()) ||
I->mayHaveSideEffects()) {
alive.insert(I.getInstructionIterator());
Index: lib/Transforms/Utils/Local.cpp
===================================================================
--- lib/Transforms/Utils/Local.cpp
+++ lib/Transforms/Utils/Local.cpp
@@ -286,6 +286,12 @@
return true;
}
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
+ // Invariants are dead if their condition is undef.
+ if (II->getIntrinsicID() == Intrinsic::invariant)
+ return isa<UndefValue>(II->getArgOperand(0));
+ }
+
if (!I->mayHaveSideEffects()) return true;
// Special case intrinsics that "may have side effects" but can be deleted
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D179.1.patch
Type: text/x-patch
Size: 3552 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121205/f29e7596/attachment.bin>
More information about the llvm-commits
mailing list