[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