In `TargetLowering::ShrinkDemandedOp`, types of lhs and rhs may differ
before legalization.
In the original case, `VT` is `i64` and `SmallVT` is `i32`, but the type
of rhs is `i8`. Then invalid truncate nodes will be created.
See the description of ISD::SHL for further information:
> After legalization, the type of the shift amount is known to be
TLI.getShiftAmountTy(). Before legalization, the shift amount can be any
type, but care must be taken to ensure it is large enough.
605ae4e93b/llvm/include/llvm/CodeGen/ISDOpcodes.h (L691-L712)
This patch stops handling ISD::SHL in `TargetLowering::ShrinkDemandedOp`
and duplicates the logic in `TargetLowering::SimplifyDemandedBits`.
Additionally, it adds some additional checks like
`isNarrowingProfitable` and `isTypeDesirableForOp` to improve the
codegen on AArch64.
Fixes https://github.com/llvm/llvm-project/issues/92720.
16 lines
518 B
LLVM
16 lines
518 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s
|
|
|
|
; Make sure we don't crash when shrinking the shift amount before legalization.
|
|
define i64 @pr92720(i64 %x) {
|
|
; CHECK-LABEL: pr92720:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movabsq $8589934592, %rax # imm = 0x200000000
|
|
; CHECK-NEXT: retq
|
|
%or = or i64 %x, 255
|
|
%sub = sub i64 0, %or
|
|
%shl = shl i64 1, %sub
|
|
%sext = shl i64 %shl, 32
|
|
ret i64 %sext
|
|
}
|