[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