[llvm] r365462 - [RISCV] Fix RISCVTTIImpl::getIntImmCost for immediates where getMinSignedBits() > 64

Alex Bradbury via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 9 03:56:18 PDT 2019


Author: asb
Date: Tue Jul  9 03:56:18 2019
New Revision: 365462

URL: http://llvm.org/viewvc/llvm-project?rev=365462&view=rev
Log:
[RISCV] Fix RISCVTTIImpl::getIntImmCost for immediates where getMinSignedBits() > 64

APInt::getSExtValue will assert if getMinSignedBits() > 64. This can happen,
for instance, if examining an i128. Avoid this assertion by checking
Imm.getMinSignedBits() <= 64 before doing
getTLI()->isLegalAddImmediate(Imm.getSExtValue()). We could directly check
getMinSignedBits() <= 12 but it seems better to reuse the isLegalAddImmediate
helper for this.

Differential Revision: https://reviews.llvm.org/D64390


Modified:
    llvm/trunk/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
    llvm/trunk/test/Transforms/ConstantHoisting/RISCV/immediates.ll

Modified: llvm/trunk/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/RISCV/RISCVTargetTransformInfo.cpp?rev=365462&r1=365461&r2=365462&view=diff
==============================================================================
--- llvm/trunk/lib/Target/RISCV/RISCVTargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Target/RISCV/RISCVTargetTransformInfo.cpp Tue Jul  9 03:56:18 2019
@@ -71,8 +71,10 @@ int RISCVTTIImpl::getIntImmCost(unsigned
     // Check immediate is the correct argument...
     if (Instruction::isCommutative(Opcode) || Idx == ImmArgIdx) {
       // ... and fits into the 12-bit immediate.
-      if (getTLI()->isLegalAddImmediate(Imm.getSExtValue()))
+      if (Imm.getMinSignedBits() <= 64 &&
+          getTLI()->isLegalAddImmediate(Imm.getSExtValue())) {
         return TTI::TCC_Free;
+      }
     }
 
     // Otherwise, use the full materialisation cost.

Modified: llvm/trunk/test/Transforms/ConstantHoisting/RISCV/immediates.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstantHoisting/RISCV/immediates.ll?rev=365462&r1=365461&r2=365462&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ConstantHoisting/RISCV/immediates.ll (original)
+++ llvm/trunk/test/Transforms/ConstantHoisting/RISCV/immediates.ll Tue Jul  9 03:56:18 2019
@@ -26,4 +26,13 @@ define i64 @test3(i64 %a) nounwind {
   %1 = mul i64 %a, 32767
   %2 = add i64 %1, 32767
   ret i64 %2
-}
\ No newline at end of file
+}
+
+; Check that we hoist immediates with very large values.
+define i128 @test4(i128 %a) nounwind {
+; CHECK-LABEL: test4
+; CHECK: %const = bitcast i128 12297829382473034410122878 to i128
+  %1 = add i128 %a, 12297829382473034410122878
+  %2 = add i128 %1, 12297829382473034410122878
+  ret i128 %2
+}




More information about the llvm-commits mailing list