forked from OSchip/llvm-project
[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 llvm-svn: 365462
This commit is contained in:
parent
65d7511f38
commit
e0831dac0c
|
@ -71,9 +71,11 @@ int RISCVTTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
|
|||
// 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.
|
||||
return getIntImmCost(Imm, Ty);
|
||||
|
|
|
@ -27,3 +27,12 @@ define i64 @test3(i64 %a) nounwind {
|
|||
%2 = add i64 %1, 32767
|
||||
ret i64 %2
|
||||
}
|
||||
|
||||
; 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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue