Skip to content

Commit 856e815

Browse files
authored
[DAGCombiner] Set disjoint flag in add->or and xor->or combines (#86925)
We check DAG.haveNoCommonBitsSet so the operands will be known to be disjoint. I couldn't think of a codegen test case since most targets aren't checking hasDisjoint yet, apart from RISCV in the or_is_add pattern, but it also falls back to computeKnownBits.
1 parent 912e2c4 commit 856e815

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,8 +2887,11 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
28872887

28882888
// fold (a+b) -> (a|b) iff a and b share no bits.
28892889
if ((!LegalOperations || TLI.isOperationLegal(ISD::OR, VT)) &&
2890-
DAG.haveNoCommonBitsSet(N0, N1))
2891-
return DAG.getNode(ISD::OR, DL, VT, N0, N1);
2890+
DAG.haveNoCommonBitsSet(N0, N1)) {
2891+
SDNodeFlags Flags;
2892+
Flags.setDisjoint(true);
2893+
return DAG.getNode(ISD::OR, DL, VT, N0, N1, Flags);
2894+
}
28922895

28932896
// Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
28942897
if (N0.getOpcode() == ISD::VSCALE && N1.getOpcode() == ISD::VSCALE) {
@@ -9289,8 +9292,11 @@ SDValue DAGCombiner::visitXOR(SDNode *N) {
92899292

92909293
// fold (a^b) -> (a|b) iff a and b share no bits.
92919294
if ((!LegalOperations || TLI.isOperationLegal(ISD::OR, VT)) &&
9292-
DAG.haveNoCommonBitsSet(N0, N1))
9293-
return DAG.getNode(ISD::OR, DL, VT, N0, N1);
9295+
DAG.haveNoCommonBitsSet(N0, N1)) {
9296+
SDNodeFlags Flags;
9297+
Flags.setDisjoint(true);
9298+
return DAG.getNode(ISD::OR, DL, VT, N0, N1, Flags);
9299+
}
92949300

92959301
// look for 'add-like' folds:
92969302
// XOR(N0,MIN_SIGNED_VALUE) == ADD(N0,MIN_SIGNED_VALUE)

llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/lanai_isel.ll.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ define i64 @i64_test(i64 %i) nounwind readnone {
77
; CHECK-NEXT: t0: ch,glue = EntryToken
88
; CHECK-NEXT: t5: i32,ch = LDW_RI<Mem:(load (s32) from %fixed-stack.0)> TargetFrameIndex:i32<-2>, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
99
; CHECK-NEXT: t7: i32 = ADD_I_LO TargetFrameIndex:i32<0>, TargetConstant:i32<0>
10-
; CHECK-NEXT: t29: i32 = OR_I_LO t7, TargetConstant:i32<4>
10+
; CHECK-NEXT: t29: i32 = OR_I_LO disjoint t7, TargetConstant:i32<4>
1111
; CHECK-NEXT: t22: i32,ch = LDW_RI<Mem:(dereferenceable load (s32) from %ir.loc + 4, basealign 8)> t29, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
1212
; CHECK-NEXT: t24: i32 = ADD_R t5, t22, TargetConstant:i32<0>
1313
; CHECK-NEXT: t3: i32,ch = LDW_RI<Mem:(load (s32) from %fixed-stack.1, align 8)> TargetFrameIndex:i32<-1>, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
@@ -52,7 +52,7 @@ define i64 @i16_test(i16 %i) nounwind readnone {
5252
; CHECK-NEXT: t33: i32,ch = CopyFromReg t0, Register:i32 $r0
5353
; CHECK-NEXT: t14: ch,glue = CopyToReg t0, Register:i32 $rv, t33
5454
; CHECK-NEXT: t1: i32 = ADD_I_LO TargetFrameIndex:i32<-1>, TargetConstant:i32<0>
55-
; CHECK-NEXT: t21: i32 = OR_I_LO t1, TargetConstant:i32<2>
55+
; CHECK-NEXT: t21: i32 = OR_I_LO disjoint t1, TargetConstant:i32<2>
5656
; CHECK-NEXT: t23: i32,ch = LDHz_RI<Mem:(load (s16) from %fixed-stack.0 + 2, basealign 4)> t21, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
5757
; CHECK-NEXT: t22: i32,ch = LDHz_RI<Mem:(dereferenceable load (s16) from %ir.loc)> TargetFrameIndex:i32<0>, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
5858
; CHECK-NEXT: t24: i32 = ADD_R t23, t22, TargetConstant:i32<0>
@@ -75,7 +75,7 @@ define i64 @i8_test(i8 %i) nounwind readnone {
7575
; CHECK-NEXT: t33: i32,ch = CopyFromReg t0, Register:i32 $r0
7676
; CHECK-NEXT: t14: ch,glue = CopyToReg t0, Register:i32 $rv, t33
7777
; CHECK-NEXT: t1: i32 = ADD_I_LO TargetFrameIndex:i32<-1>, TargetConstant:i32<0>
78-
; CHECK-NEXT: t21: i32 = OR_I_LO t1, TargetConstant:i32<3>
78+
; CHECK-NEXT: t21: i32 = OR_I_LO disjoint t1, TargetConstant:i32<3>
7979
; CHECK-NEXT: t23: i32,ch = LDBz_RI<Mem:(load (s8) from %fixed-stack.0 + 3, basealign 4)> t21, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
8080
; CHECK-NEXT: t22: i32,ch = LDBz_RI<Mem:(dereferenceable load (s8) from %ir.loc)> TargetFrameIndex:i32<0>, TargetConstant:i32<0>, TargetConstant:i32<0>, t0
8181
; CHECK-NEXT: t24: i32 = ADD_R t23, t22, TargetConstant:i32<0>

0 commit comments

Comments
 (0)