Index: llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp =================================================================== --- llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp +++ llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp @@ -861,7 +861,7 @@ if (LoadInst *Ld = dyn_cast(I->getOperand(0))) if (const ConstantInt *C = dyn_cast(I->getOperand(1))) if (!Ld->hasOneUse() && Ld->getParent() == I->getParent() && - C->getZExtValue() == 0) + C->isZero()) return 0; unsigned Cost = 1; @@ -1020,7 +1020,7 @@ // Comparison between memory and immediate. if (UserI->getOpcode() == Instruction::ICmp) if (ConstantInt *CI = dyn_cast(UserI->getOperand(1))) - if (isUInt<16>(CI->getZExtValue())) + if (CI->getValue().isIntN(16)) return true; return (LoadOrTruncBits == 32 || LoadOrTruncBits == 64); break; Index: llvm/test/Analysis/CostModel/SystemZ/huge-immediates.ll =================================================================== --- /dev/null +++ llvm/test/Analysis/CostModel/SystemZ/huge-immediates.ll @@ -0,0 +1,20 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=systemz-unknown -mcpu=z13 +; +; Test that cost functions can handle immediates of more than 64 bits without crashing. + +; Cost of a load which is checked for folding into a compare w/ memory. +define i32 @fun0(i72* %Src) { + %L = load i72, i72* %Src + %B = icmp ult i72 %L, 166153499473114484112 + %Res = zext i1 %B to i32 + ret i32 %Res +} + +; Cost of a compare which is checked for elimination by Load and Test. +define i32 @fun1(i72* %Src, i72* %Dst) { + %L = load i72, i72* %Src + store i72 %L, i72* %Dst + %B = icmp ult i72 %L, 166153499473114484112 + %Res = zext i1 %B to i32 + ret i32 %Res +}