diff options
Diffstat (limited to 'lib/Transforms')
| -rw-r--r-- | lib/Transforms/InstCombine/InstCombineCompares.cpp | 31 | ||||
| -rw-r--r-- | lib/Transforms/Scalar/LoopStrengthReduce.cpp | 11 | 
2 files changed, 28 insertions, 14 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index bca1304534b63..428f94bb5e932 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -4039,11 +4039,6 @@ Instruction *InstCombiner::foldICmpUsingKnownBits(ICmpInst &I) {          Constant *CMinus1 = ConstantInt::get(Op0->getType(), *CmpC - 1);          return new ICmpInst(ICmpInst::ICMP_EQ, Op0, CMinus1);        } -      // (x <u 2147483648) -> (x >s -1)  -> true if sign bit clear -      if (CmpC->isMinSignedValue()) { -        Constant *AllOnes = Constant::getAllOnesValue(Op0->getType()); -        return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes); -      }      }      break;    } @@ -4063,11 +4058,6 @@ Instruction *InstCombiner::foldICmpUsingKnownBits(ICmpInst &I) {        if (*CmpC == Op0Max - 1)          return new ICmpInst(ICmpInst::ICMP_EQ, Op0,                              ConstantInt::get(Op1->getType(), *CmpC + 1)); - -      // (x >u 2147483647) -> (x <s 0)  -> true if sign bit set -      if (CmpC->isMaxSignedValue()) -        return new ICmpInst(ICmpInst::ICMP_SLT, Op0, -                            Constant::getNullValue(Op0->getType()));      }      break;    } @@ -4299,6 +4289,27 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {            (SI->getOperand(2) == Op0 && SI->getOperand(1) == Op1))          return nullptr; +  // FIXME: We only do this after checking for min/max to prevent infinite +  // looping caused by a reverse canonicalization of these patterns for min/max. +  // FIXME: The organization of folds is a mess. These would naturally go into +  // canonicalizeCmpWithConstant(), but we can't move all of the above folds +  // down here after the min/max restriction. +  ICmpInst::Predicate Pred = I.getPredicate(); +  const APInt *C; +  if (match(Op1, m_APInt(C))) { +    // For i32: x >u 2147483647 -> x <s 0  -> true if sign bit set +    if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) { +      Constant *Zero = Constant::getNullValue(Op0->getType()); +      return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero); +    } + +    // For i32: x <u 2147483648 -> x >s -1  -> true if sign bit clear +    if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) { +      Constant *AllOnes = Constant::getAllOnesValue(Op0->getType()); +      return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes); +    } +  } +    if (Instruction *Res = foldICmpInstWithConstant(I))      return Res; diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 01728ae680de7..194587a85e7c1 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -158,8 +158,9 @@ struct MemAccessTy {    bool operator!=(MemAccessTy Other) const { return !(*this == Other); } -  static MemAccessTy getUnknown(LLVMContext &Ctx) { -    return MemAccessTy(Type::getVoidTy(Ctx), UnknownAddressSpace); +  static MemAccessTy getUnknown(LLVMContext &Ctx, +                                unsigned AS = UnknownAddressSpace) { +    return MemAccessTy(Type::getVoidTy(Ctx), AS);    }  }; @@ -2279,8 +2280,10 @@ bool LSRInstance::reconcileNewOffset(LSRUse &LU, int64_t NewOffset,    // TODO: Be less conservative when the type is similar and can use the same    // addressing modes.    if (Kind == LSRUse::Address) { -    if (AccessTy != LU.AccessTy) -      NewAccessTy = MemAccessTy::getUnknown(AccessTy.MemTy->getContext()); +    if (AccessTy.MemTy != LU.AccessTy.MemTy) { +      NewAccessTy = MemAccessTy::getUnknown(AccessTy.MemTy->getContext(), +                                            AccessTy.AddrSpace); +    }    }    // Conservatively assume HasBaseReg is true for now.  | 
