Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.689 -> 1.690
---
Log message:

implement Transforms/InstCombine/cast2.ll:test3 and PR1263: 
http://llvm.org/PR1263 


---
Diffs of the changes:  (+21 -1)

 InstructionCombining.cpp |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletion(-)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.689 
llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.690
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.689   Sun Mar 25 
14:55:33 2007
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Sun Mar 25 15:43:09 2007
@@ -7896,10 +7896,22 @@
   if (GEP.getNumOperands() == 2 && HasZeroPointerIndex)
     return ReplaceInstUsesWith(GEP, PtrOp);
 
+  // Keep track of whether all indices are zero constants integers.
+  bool AllZeroIndices = true;
+  
   // Eliminate unneeded casts for indices.
   bool MadeChange = false;
+  
   gep_type_iterator GTI = gep_type_begin(GEP);
-  for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI)
+  for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI) {
+    // Track whether this GEP has all zero indices, if so, it doesn't move the
+    // input pointer, it just changes its type.
+    if (AllZeroIndices) {
+      if (ConstantInt *CI = dyn_cast<ConstantInt>(GEP.getOperand(i)))
+        AllZeroIndices = CI->isNullValue();
+      else
+        AllZeroIndices = false;
+    }
     if (isa<SequentialType>(*GTI)) {
       if (CastInst *CI = dyn_cast<CastInst>(GEP.getOperand(i))) {
         if (CI->getOpcode() == Instruction::ZExt ||
@@ -7929,8 +7941,16 @@
           MadeChange = true;
         }
     }
+  }
   if (MadeChange) return &GEP;
 
+  // If this GEP instruction doesn't move the pointer, and if the input operand
+  // is a bitcast of another pointer, just replace the GEP with a bitcast of 
the
+  // real input to the dest type.
+  if (AllZeroIndices && isa<BitCastInst>(GEP.getOperand(0)))
+    return new BitCastInst(cast<BitCastInst>(GEP.getOperand(0))->getOperand(0),
+                           GEP.getType());
+    
   // Combine Indices - If the source pointer to this getelementptr instruction
   // is a getelementptr instruction, combine the indices of the two
   // getelementptr instructions into a single instruction.



_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to