Fix PR336: The instcombine pass asserts when visiting load instruction
authorChris Lattner <sabre@nondot.org>
Fri, 7 May 2004 15:35:56 +0000 (15:35 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 7 May 2004 15:35:56 +0000 (15:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13400 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 2266a70b6e616d4c70d7eac8aa6b0e11ee925980..0ad4ad44da0b2abe5f64d305622fc2f2db66037e 100644 (file)
@@ -887,7 +887,7 @@ Instruction *InstCombiner::visitRem(BinaryOperator &I) {
     // if so, convert to a bitwise and.
     if (ConstantUInt *C = dyn_cast<ConstantUInt>(RHS))
       if (uint64_t Val = C->getValue())    // Don't break X % 0 (divide by zero)
-        if (!(Val & Val-1))                // Power of 2
+        if (!(Val & (Val-1)))              // Power of 2
           return BinaryOperator::create(Instruction::And, I.getOperand(0),
                                         ConstantUInt::get(I.getType(), Val-1));
   }
@@ -2869,7 +2869,8 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
     if (const PointerType *SrcTy =
         dyn_cast<PointerType>(CI->getOperand(0)->getType())) {
       const Type *SrcPTy = SrcTy->getElementType();
-      if (TD->getTypeSize(SrcPTy) == TD->getTypeSize(DestPTy) &&
+      if (SrcPTy->isSized() && DestPTy->isSized() &&
+          TD->getTypeSize(SrcPTy) == TD->getTypeSize(DestPTy) &&
           (SrcPTy->isInteger() || isa<PointerType>(SrcPTy)) &&
           (DestPTy->isInteger() || isa<PointerType>(DestPTy))) {
         // Okay, we are casting from one integer or pointer type to another of