[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