[llvm] 370a8c8 - [SystemZ] Make sure not to call getZExtValue on a >64 bit constant.
Jonas Paulsson via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 06:37:02 PDT 2020
Author: Jonas Paulsson
Date: 2020-09-23T15:36:32+02:00
New Revision: 370a8c802558ed7aedbcc09c1bdf4c2d3f4c28c0
URL: https://github.com/llvm/llvm-project/commit/370a8c802558ed7aedbcc09c1bdf4c2d3f4c28c0
DIFF: https://github.com/llvm/llvm-project/commit/370a8c802558ed7aedbcc09c1bdf4c2d3f4c28c0.diff
LOG: [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
Added:
llvm/test/Analysis/CostModel/SystemZ/huge-immediates.ll
Modified:
llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
index 23b061f6d862..4b8a330c331c 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
@@ -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;
diff --git a/llvm/test/Analysis/CostModel/SystemZ/huge-immediates.ll b/llvm/test/Analysis/CostModel/SystemZ/huge-immediates.ll
new file mode 100644
index 000000000000..e388b6d76c53
--- /dev/null
+++ b/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
+}
More information about the llvm-commits
mailing list