Skip to content

Commit a68fde5

Browse files
authored
[DAG] foldAddToAvg - optimize nested m_Reassociatable matchers (#171681)
The use of nested m_Reassociatable matchers by #169644 can result in high compile times as the inner m_Reassociatable call is being repeated a lot while the outer call is trying to match. Place the inner m_ReassociatableAnd at the beginning of the pattern so it is not repeatedly matched in recursion.
1 parent a93214c commit a68fde5

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3171,19 +3171,19 @@ SDValue DAGCombiner::foldAddToAvg(SDNode *N, const SDLoc &DL) {
31713171
m_Add(m_And(m_Value(A), m_Value(B)),
31723172
m_Srl(m_Xor(m_Deferred(A), m_Deferred(B)), m_One()))) ||
31733173
sd_match(N, m_ReassociatableAdd(
3174-
m_Srl(m_Value(A), m_One()), m_Srl(m_Value(B), m_One()),
3175-
m_ReassociatableAnd(m_Deferred(A), m_Deferred(B),
3176-
m_One()))))) {
3174+
m_ReassociatableAnd(m_Value(A), m_Value(B), m_One()),
3175+
m_Srl(m_Deferred(A), m_One()),
3176+
m_Srl(m_Deferred(B), m_One()))))) {
31773177
return DAG.getNode(ISD::AVGFLOORU, DL, VT, A, B);
31783178
}
31793179
if ((!LegalOperations || hasOperation(ISD::AVGFLOORS, VT)) &&
31803180
(sd_match(N,
31813181
m_Add(m_And(m_Value(A), m_Value(B)),
31823182
m_Sra(m_Xor(m_Deferred(A), m_Deferred(B)), m_One()))) ||
31833183
sd_match(N, m_ReassociatableAdd(
3184-
m_Sra(m_Value(A), m_One()), m_Sra(m_Value(B), m_One()),
3185-
m_ReassociatableAnd(m_Deferred(A), m_Deferred(B),
3186-
m_One()))))) {
3184+
m_ReassociatableAnd(m_Value(A), m_Value(B), m_One()),
3185+
m_Sra(m_Deferred(A), m_One()),
3186+
m_Sra(m_Deferred(B), m_One()))))) {
31873187
return DAG.getNode(ISD::AVGFLOORS, DL, VT, A, B);
31883188
}
31893189

llvm/test/CodeGen/X86/avgfloors-scalar.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,11 @@ define i64 @test_lsb_i64(i64 %a0, i64 %a1) nounwind {
317317
;
318318
; X64-LABEL: test_lsb_i64:
319319
; X64: # %bb.0:
320-
; X64-NEXT: movq %rsi, %rax
321-
; X64-NEXT: andq %rdi, %rax
322-
; X64-NEXT: xorq %rdi, %rsi
323-
; X64-NEXT: sarq %rsi
324-
; X64-NEXT: addq %rsi, %rax
320+
; X64-NEXT: movq %rdi, %rax
321+
; X64-NEXT: andq %rsi, %rax
322+
; X64-NEXT: xorq %rsi, %rdi
323+
; X64-NEXT: sarq %rdi
324+
; X64-NEXT: addq %rdi, %rax
325325
; X64-NEXT: retq
326326
%s0 = ashr i64 %a0, 1
327327
%s1 = ashr i64 %a1, 1

llvm/test/CodeGen/X86/avgflooru-scalar.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,11 @@ define i64 @test_lsb_i64(i64 %a0, i64 %a1) nounwind {
293293
;
294294
; X64-LABEL: test_lsb_i64:
295295
; X64: # %bb.0:
296-
; X64-NEXT: movq %rsi, %rax
297-
; X64-NEXT: andq %rdi, %rax
298-
; X64-NEXT: xorq %rdi, %rsi
299-
; X64-NEXT: shrq %rsi
300-
; X64-NEXT: addq %rsi, %rax
296+
; X64-NEXT: movq %rdi, %rax
297+
; X64-NEXT: andq %rsi, %rax
298+
; X64-NEXT: xorq %rsi, %rdi
299+
; X64-NEXT: shrq %rdi
300+
; X64-NEXT: addq %rdi, %rax
301301
; X64-NEXT: retq
302302
%s0 = lshr i64 %a0, 1
303303
%s1 = lshr i64 %a1, 1

0 commit comments

Comments
 (0)