forked from OSchip/llvm-project
[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:
parent
00c34f72fb
commit
370a8c8025
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue