Fix this regression and remove the XFAIL from this test.
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 8 Dec 2004 23:10:30 +0000 (23:10 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 8 Dec 2004 23:10:30 +0000 (23:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18674 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/2004-12-08-InstCombineCrash.ll

index 9eb30549f47b58dbbc842bd19783e02cac478fc8..356b86fdbb0176ea57a5fe96a6a6fd03401c1e0f 100644 (file)
@@ -4216,9 +4216,11 @@ bool InstCombiner::runOnFunction(Function &F) {
 
     // Instruction isn't dead, see if we can constant propagate it...
     if (Constant *C = ConstantFoldInstruction(I)) {
+      Value* Ptr = I->getOperand(0);
       if (isa<GetElementPtrInst>(I) &&
-          cast<Constant>(I->getOperand(0))->isNullValue() &&
-          !isa<ConstantPointerNull>(C)) {
+          cast<Constant>(Ptr)->isNullValue() &&
+          !isa<ConstantPointerNull>(C) &&
+          cast<PointerType>(Ptr->getType())->getElementType()->isSized()) {
         // If this is a constant expr gep that is effectively computing an
         // "offsetof", fold it into 'cast int X to T*' instead of 'gep 0, 0, 12'
         bool isFoldableGEP = true;
@@ -4226,7 +4228,7 @@ bool InstCombiner::runOnFunction(Function &F) {
           if (!isa<ConstantInt>(I->getOperand(i)))
             isFoldableGEP = false;
         if (isFoldableGEP) {
-          uint64_t Offset = TD->getIndexedOffset(I->getOperand(0)->getType(),
+          uint64_t Offset = TD->getIndexedOffset(Ptr->getType(),
                              std::vector<Value*>(I->op_begin()+1, I->op_end()));
           C = ConstantUInt::get(Type::ULongTy, Offset);
           C = ConstantExpr::getCast(C, TD->getIntPtrType());
index 15b75bd983af1c054744e2200be69171d12aa414..02939c0c3eee619fe0f987b53a02f228d16e97a2 100644 (file)
@@ -1,5 +1,4 @@
 ; RUN: llvm-as %s -o - | opt -instcombine
-; XFAIL: *
 
        %struct.llvm_java_object_base = type opaque
        "java/lang/Object" = type { %struct.llvm_java_object_base }