Implement InstCombine/GEPIdxCanon.ll
authorChris Lattner <sabre@nondot.org>
Tue, 20 Jul 2004 01:48:15 +0000 (01:48 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 20 Jul 2004 01:48:15 +0000 (01:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15024 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 6b993750a3fc613ed1283b38801ca100b097352c..27ba7ab163334880188c033c63c5968c18e1d06d 100644 (file)
@@ -2700,7 +2700,8 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
       Value *Op = GEP.getOperand(i);
       if (Op->getType()->getPrimitiveSize() > TD->getPointerSize())
         if (Constant *C = dyn_cast<Constant>(Op)) {
-          GEP.setOperand(i, ConstantExpr::getCast(C, TD->getIntPtrType()));
+          GEP.setOperand(i, ConstantExpr::getCast(C,
+                                     TD->getIntPtrType()->getSignedVersion()));
           MadeChange = true;
         } else {
           Op = InsertNewInstBefore(new CastInst(Op, TD->getIntPtrType(),
@@ -2708,6 +2709,14 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
           GEP.setOperand(i, Op);
           MadeChange = true;
         }
+
+      // If this is a constant idx, make sure to canonicalize it to be a signed
+      // operand, otherwise CSE and other optimizations are pessimized.
+      if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(Op)) {
+        GEP.setOperand(i, ConstantExpr::getCast(CUI,
+                                          CUI->getType()->getSignedVersion()));
+        MadeChange = true;
+      }
     }
   if (MadeChange) return &GEP;