blob: 78875cd4411249cf1c1a239980793c6224d409ed [file]
; RUN: llc -mtriple=hexagon < %s | FileCheck %s
; Verify that SelectSHL handles (shl (mul val, const), const) with negative
; multiply constants. The left shift of the negative constant must be done in
; unsigned arithmetic to avoid undefined behavior.
; The multiply constant 0xAAAAAAAB shifted left by 1 does not fit in a signed
; 9-bit immediate, so this should not be folded into M2_mpysmi.
define i32 @shl_mul_neg_large(i32 %x) #0 {
; CHECK-LABEL: shl_mul_neg_large:
; CHECK: +mpyi(r0,##1431655766)
; CHECK: jumpr r31
entry:
%m = mul i32 %x, u0xAAAAAAAB
%s = shl i32 %m, 1
ret i32 %s
}
; A small negative multiply constant (-3) shifted left by 1 gives -6, which
; fits in a signed 9-bit immediate. This should be folded into M2_mpysmi.
define i32 @shl_mul_neg_small(i32 %x) #0 {
; CHECK-LABEL: shl_mul_neg_small:
; CHECK: -mpyi(r0,#6)
; CHECK: jumpr r31
entry:
%m = mul i32 %x, -3
%s = shl i32 %m, 1
ret i32 %s
}
attributes #0 = { nounwind "target-cpu"="hexagonv60" }