[llvm-commits] [llvm] r41023 - /llvm/trunk/lib/Analysis/ConstantFolding.cpp

Chris Lattner sabre at nondot.org
Sat Aug 11 16:49:01 PDT 2007


Author: lattner
Date: Sat Aug 11 18:49:01 2007
New Revision: 41023

URL: http://llvm.org/viewvc/llvm-project?rev=41023&view=rev
Log:
constant fold ptrtoint(inttoptr) with target data when available.  This allows
us to fold the entry block of PR1602 to false instead of:

br i1 icmp eq (i32 and (i32 ptrtoint (void (%struct.S*)* inttoptr (i64
1 to void (%struct.S*)*) to i32), i32 1), i32 0), label %cond_next, label
%cond_true


Modified:
    llvm/trunk/lib/Analysis/ConstantFolding.cpp

Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=41023&r1=41022&r2=41023&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Sat Aug 11 18:49:01 2007
@@ -217,6 +217,23 @@
   case Instruction::FCmp:
     return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Ops[0], 
                                     Ops[1]);
+  case Instruction::PtrToInt:
+    // If the input is a inttoptr, eliminate the pair.  This requires knowing
+    // the width of a pointer, so it can't be done in ConstantExpr::getCast.
+    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0])) {
+      if (TD && CE->getOpcode() == Instruction::IntToPtr) {
+        Constant *Input = CE->getOperand(0);
+        unsigned InWidth = Input->getType()->getPrimitiveSizeInBits();
+        Constant *Mask = 
+          ConstantInt::get(APInt::getLowBitsSet(InWidth,
+                                                TD->getPointerSizeInBits()));
+        Input = ConstantExpr::getAnd(Input, Mask);
+        // Do a zext or trunc to get to the dest size.
+        return ConstantExpr::getIntegerCast(Input, I->getType(), false);
+      }
+    }
+    // FALL THROUGH.
+  case Instruction::IntToPtr:
   case Instruction::Trunc:
   case Instruction::ZExt:
   case Instruction::SExt:
@@ -226,8 +243,6 @@
   case Instruction::SIToFP:
   case Instruction::FPToUI:
   case Instruction::FPToSI:
-  case Instruction::PtrToInt:
-  case Instruction::IntToPtr:
   case Instruction::BitCast:
     return ConstantExpr::getCast(Opc, Ops[0], DestTy);
   case Instruction::Select:





More information about the llvm-commits mailing list