Skip to content

Commit 1e4d039

Browse files
committed
[DAGCombiner][RISCV] Don't propagate the exact flag from udiv/sdiv to urem/srem.
If we simplify a udiv/sdiv using the exact flag we shouldn't propagate that simplifaction to any urem/srem that happens to use the same operands. If the exact flag is wrong, the udiv/sdiv will produce poison, but that doesn't mean we can make the urem/srem simplify to 0. Fixes #145360.
1 parent 52e10b2 commit 1e4d039

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4961,11 +4961,15 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) {
49614961
// (Dividend - (Quotient * Divisor).
49624962
if (SDNode *RemNode = DAG.getNodeIfExists(ISD::SREM, N->getVTList(),
49634963
{ N0, N1 })) {
4964-
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
4965-
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
4966-
AddToWorklist(Mul.getNode());
4967-
AddToWorklist(Sub.getNode());
4968-
CombineTo(RemNode, Sub);
4964+
// If the udiv has the exact flag we shouldn't propagate it to the
4965+
// remainder node.
4966+
if (!N->getFlags().hasExact()) {
4967+
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
4968+
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
4969+
AddToWorklist(Mul.getNode());
4970+
AddToWorklist(Sub.getNode());
4971+
CombineTo(RemNode, Sub);
4972+
}
49694973
}
49704974
return V;
49714975
}
@@ -5101,11 +5105,15 @@ SDValue DAGCombiner::visitUDIV(SDNode *N) {
51015105
// (Dividend - (Quotient * Divisor).
51025106
if (SDNode *RemNode = DAG.getNodeIfExists(ISD::UREM, N->getVTList(),
51035107
{ N0, N1 })) {
5104-
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
5105-
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
5106-
AddToWorklist(Mul.getNode());
5107-
AddToWorklist(Sub.getNode());
5108-
CombineTo(RemNode, Sub);
5108+
// If the udiv has the exact flag we shouldn't propagate it to the
5109+
// remainder node.
5110+
if (!N->getFlags().hasExact()) {
5111+
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, V, N1);
5112+
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
5113+
AddToWorklist(Mul.getNode());
5114+
AddToWorklist(Sub.getNode());
5115+
CombineTo(RemNode, Sub);
5116+
}
51095117
}
51105118
return V;
51115119
}

llvm/test/CodeGen/RISCV/pr145360.ll

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
define i32 @signed(i32 %0, ptr %1) {
55
; CHECK-LABEL: signed:
66
; CHECK: # %bb.0:
7+
; CHECK-NEXT: sraiw a2, a0, 31
8+
; CHECK-NEXT: srliw a2, a2, 24
9+
; CHECK-NEXT: add a2, a0, a2
10+
; CHECK-NEXT: andi a2, a2, -256
11+
; CHECK-NEXT: subw a2, a0, a2
712
; CHECK-NEXT: sraiw a0, a0, 8
8-
; CHECK-NEXT: sw zero, 0(a1)
13+
; CHECK-NEXT: sw a2, 0(a1)
914
; CHECK-NEXT: ret
1015
%rem = srem i32 %0, 256
1116
store i32 %rem, ptr %1, align 4
@@ -16,11 +21,19 @@ define i32 @signed(i32 %0, ptr %1) {
1621
define i32 @unsigned(i32 %0, ptr %1) {
1722
; CHECK-LABEL: unsigned:
1823
; CHECK: # %bb.0:
19-
; CHECK-NEXT: srliw a0, a0, 3
20-
; CHECK-NEXT: lui a2, 699051
21-
; CHECK-NEXT: addi a2, a2, -1365
22-
; CHECK-NEXT: mulw a0, a0, a2
23-
; CHECK-NEXT: sw zero, 0(a1)
24+
; CHECK-NEXT: slli a2, a0, 32
25+
; CHECK-NEXT: lui a3, 699051
26+
; CHECK-NEXT: addi a3, a3, -1365
27+
; CHECK-NEXT: slli a4, a3, 32
28+
; CHECK-NEXT: mulhu a2, a2, a4
29+
; CHECK-NEXT: srli a2, a2, 36
30+
; CHECK-NEXT: slli a4, a2, 5
31+
; CHECK-NEXT: slli a2, a2, 3
32+
; CHECK-NEXT: subw a2, a2, a4
33+
; CHECK-NEXT: srliw a4, a0, 3
34+
; CHECK-NEXT: add a2, a0, a2
35+
; CHECK-NEXT: mulw a0, a4, a3
36+
; CHECK-NEXT: sw a2, 0(a1)
2437
; CHECK-NEXT: ret
2538
%rem = urem i32 %0, 24
2639
store i32 %rem, ptr %1, align 4

0 commit comments

Comments
 (0)