[SystemZ] Make sure not to call getZExtValue on a >64 bit constant.

Better use isZero() and isIntN() in SystemZTargetTransformInfo rather than
calling getZExtValue() since the immediate operand may be wider than 64 bits,
which is not allowed with getZExtValue().

Fixes https://bugs.llvm.org/show_bug.cgi?id=47600

Review: Simon Pilgrim
This commit is contained in:
Jonas Paulsson 2020-09-22 12:11:29 +02:00
parent 00c34f72fb
commit 370a8c8025
2 changed files with 22 additions and 2 deletions

View File

@ -862,7 +862,7 @@ int SystemZTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
if (LoadInst *Ld = dyn_cast<LoadInst>(I->getOperand(0)))
if (const ConstantInt *C = dyn_cast<ConstantInt>(I->getOperand(1)))
if (!Ld->hasOneUse() && Ld->getParent() == I->getParent() &&
C->getZExtValue() == 0)
C->isZero())
return 0;
unsigned Cost = 1;
@ -1021,7 +1021,7 @@ isFoldableLoad(const LoadInst *Ld, const Instruction *&FoldedValue) {
// Comparison between memory and immediate.
if (UserI->getOpcode() == Instruction::ICmp)
if (ConstantInt *CI = dyn_cast<ConstantInt>(UserI->getOperand(1)))
if (isUInt<16>(CI->getZExtValue()))
if (CI->getValue().isIntN(16))
return true;
return (LoadOrTruncBits == 32 || LoadOrTruncBits == 64);
break;

View File

@ -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
}