mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
DAGCombiner: Don't fold vector muls with constants that look like a splat of a power of 2 but differ in bit width.
PR17283. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191000 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c9554b1342
commit
530d09a22b
@ -1824,20 +1824,24 @@ SDValue DAGCombiner::visitMUL(SDNode *N) {
|
||||
// fold (mul x, 0) -> 0
|
||||
if (N1IsConst && ConstValue1 == 0)
|
||||
return N1;
|
||||
// We require a splat of the entire scalar bit width for non-contiguous
|
||||
// bit patterns.
|
||||
bool IsFullSplat =
|
||||
ConstValue1.getBitWidth() == VT.getScalarType().getSizeInBits();
|
||||
// fold (mul x, 1) -> x
|
||||
if (N1IsConst && ConstValue1 == 1)
|
||||
if (N1IsConst && ConstValue1 == 1 && IsFullSplat)
|
||||
return N0;
|
||||
// fold (mul x, -1) -> 0-x
|
||||
if (N1IsConst && ConstValue1.isAllOnesValue())
|
||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT,
|
||||
DAG.getConstant(0, VT), N0);
|
||||
// fold (mul x, (1 << c)) -> x << c
|
||||
if (N1IsConst && ConstValue1.isPowerOf2())
|
||||
if (N1IsConst && ConstValue1.isPowerOf2() && IsFullSplat)
|
||||
return DAG.getNode(ISD::SHL, SDLoc(N), VT, N0,
|
||||
DAG.getConstant(ConstValue1.logBase2(),
|
||||
getShiftAmountTy(N0.getValueType())));
|
||||
// fold (mul x, -(1 << c)) -> -(x << c) or (-x) << c
|
||||
if (N1IsConst && (-ConstValue1).isPowerOf2()) {
|
||||
if (N1IsConst && (-ConstValue1).isPowerOf2() && IsFullSplat) {
|
||||
unsigned Log2Val = (-ConstValue1).logBase2();
|
||||
// FIXME: If the input is something that is easily negated (e.g. a
|
||||
// single-use add), we should put the negate there.
|
||||
|
@ -148,3 +148,21 @@ define <8 x i32> @mul_const9(<8 x i32> %x) {
|
||||
%y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
|
||||
ret <8 x i32> %y
|
||||
}
|
||||
|
||||
; CHECK: mul_const10
|
||||
; CHECK: vpmulld
|
||||
; CHECK: ret
|
||||
define <4 x i32> @mul_const10(<4 x i32> %x) {
|
||||
; %x * 0x01010101
|
||||
%m = mul <4 x i32> %x, <i32 16843009, i32 16843009, i32 16843009, i32 16843009>
|
||||
ret <4 x i32> %m
|
||||
}
|
||||
|
||||
; CHECK: mul_const11
|
||||
; CHECK: vpmulld
|
||||
; CHECK: ret
|
||||
define <4 x i32> @mul_const11(<4 x i32> %x) {
|
||||
; %x * 0x80808080
|
||||
%m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152>
|
||||
ret <4 x i32> %m
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user