Skip to content

Commit d921291

Browse files
[LLVM][DAGCombiner] fold (shl (X * vscale(C0)), C1) -> (X * vscale(C0 << C1)).
1 parent 568aa4a commit d921291

File tree

3 files changed

+17
-12
lines changed

3 files changed

+17
-12
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10615,6 +10615,15 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
1061510615
return DAG.getVScale(DL, VT, C0 << C1);
1061610616
}
1061710617

10618+
SDValue X;
10619+
APInt VS0;
10620+
10621+
// fold (shl (X * vscale(VS0)), C1) -> (X * vscale(VS0 << C1))
10622+
if (N1C && sd_match(N0, m_Mul(m_Value(X), m_VScale(m_ConstInt(VS0))))) {
10623+
SDValue VScale = DAG.getVScale(DL, VT, VS0 << N1C->getAPIntValue());
10624+
return DAG.getNode(ISD::MUL, DL, VT, X, VScale);
10625+
}
10626+
1061810627
// Fold (shl step_vector(C0), C1) to (step_vector(C0 << C1)).
1061910628
APInt ShlVal;
1062010629
if (N0.getOpcode() == ISD::STEP_VECTOR &&

llvm/test/CodeGen/AArch64/sve-vscale-combine.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,8 @@ define i32 @combine_shl_vscale_i32() nounwind {
120120
define i64 @combine_shl_mul_vscale(i64 %a) nounwind {
121121
; CHECK-LABEL: combine_shl_mul_vscale:
122122
; CHECK: // %bb.0:
123-
; CHECK-NEXT: rdvl x8, #1
124-
; CHECK-NEXT: lsr x8, x8, #4
125-
; CHECK-NEXT: mul x8, x0, x8
126-
; CHECK-NEXT: lsl x0, x8, #3
123+
; CHECK-NEXT: cnth x8
124+
; CHECK-NEXT: mul x0, x0, x8
127125
; CHECK-NEXT: ret
128126
%vscale = tail call i64 @llvm.vscale.i64()
129127
%mul = mul i64 %a, %vscale
@@ -134,10 +132,8 @@ define i64 @combine_shl_mul_vscale(i64 %a) nounwind {
134132
define i64 @combine_shl_mul_vscale_commuted(i64 %a) nounwind {
135133
; CHECK-LABEL: combine_shl_mul_vscale_commuted:
136134
; CHECK: // %bb.0:
137-
; CHECK-NEXT: rdvl x8, #1
138-
; CHECK-NEXT: lsr x8, x8, #4
139-
; CHECK-NEXT: mul x8, x8, x0
140-
; CHECK-NEXT: lsl x0, x8, #3
135+
; CHECK-NEXT: cnth x8
136+
; CHECK-NEXT: mul x0, x0, x8
141137
; CHECK-NEXT: ret
142138
%vscale = tail call i64 @llvm.vscale.i64()
143139
%mul = mul i64 %vscale, %a

llvm/test/Transforms/LoopStrengthReduce/AArch64/vscale-fixups.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,14 +383,14 @@ define void @vscale_squared_offset(ptr %alloc) #0 {
383383
; COMMON-LABEL: vscale_squared_offset:
384384
; COMMON: // %bb.0: // %entry
385385
; COMMON-NEXT: rdvl x9, #1
386+
; COMMON-NEXT: rdvl x10, #4
386387
; COMMON-NEXT: fmov z0.s, #4.00000000
387-
; COMMON-NEXT: mov x8, xzr
388388
; COMMON-NEXT: lsr x9, x9, #4
389389
; COMMON-NEXT: fmov z1.s, #8.00000000
390-
; COMMON-NEXT: cntw x10
390+
; COMMON-NEXT: mov x8, xzr
391391
; COMMON-NEXT: ptrue p0.s, vl1
392-
; COMMON-NEXT: umull x9, w9, w9
393-
; COMMON-NEXT: lsl x9, x9, #6
392+
; COMMON-NEXT: umull x9, w9, w10
393+
; COMMON-NEXT: cntw x10
394394
; COMMON-NEXT: cmp x8, x10
395395
; COMMON-NEXT: b.ge .LBB6_2
396396
; COMMON-NEXT: .LBB6_1: // %for.body

0 commit comments

Comments
 (0)