1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

Don't lower srem/urem X%C to X-X/C*C unless the division is actually

optimized. This avoids creating illegal divisions when the combiner is
running after legalize; this fixes PR1815. Also, it produces better
code in the included testcase by avoiding the subtract and multiply
when the division isn't optimized.

llvm-svn: 44341
This commit is contained in:
Dan Gohman 2007-11-26 23:46:11 +00:00
parent 57c2305216
commit a9f8208852
2 changed files with 24 additions and 14 deletions

View File

@ -1306,15 +1306,17 @@ SDOperand DAGCombiner::visitSREM(SDNode *N) {
DAG.MaskedValueIsZero(N0, SignBit))
return DAG.getNode(ISD::UREM, VT, N0, N1);
// Unconditionally lower X%C -> X-X/C*C. This allows the X/C logic to hack on
// the remainder operation.
// If X/C can be simplified by the division-by-constant logic, lower
// X%C to the equivalent of X-X/C*C.
if (N1C && !N1C->isNullValue()) {
SDOperand Div = DAG.getNode(ISD::SDIV, VT, N0, N1);
SDOperand Mul = DAG.getNode(ISD::MUL, VT, Div, N1);
SDOperand Sub = DAG.getNode(ISD::SUB, VT, N0, Mul);
AddToWorkList(Div.Val);
AddToWorkList(Mul.Val);
return Sub;
SDOperand OptimizedDiv = combine(Div.Val);
if (OptimizedDiv.Val && OptimizedDiv.Val != Div.Val) {
SDOperand Mul = DAG.getNode(ISD::MUL, VT, OptimizedDiv, N1);
SDOperand Sub = DAG.getNode(ISD::SUB, VT, N0, Mul);
AddToWorkList(Mul.Val);
return Sub;
}
}
// undef % X -> 0
@ -1351,15 +1353,17 @@ SDOperand DAGCombiner::visitUREM(SDNode *N) {
}
}
// Unconditionally lower X%C -> X-X/C*C. This allows the X/C logic to hack on
// the remainder operation.
// If X/C can be simplified by the division-by-constant logic, lower
// X%C to the equivalent of X-X/C*C.
if (N1C && !N1C->isNullValue()) {
SDOperand Div = DAG.getNode(ISD::UDIV, VT, N0, N1);
SDOperand Mul = DAG.getNode(ISD::MUL, VT, Div, N1);
SDOperand Sub = DAG.getNode(ISD::SUB, VT, N0, Mul);
AddToWorkList(Div.Val);
AddToWorkList(Mul.Val);
return Sub;
SDOperand OptimizedDiv = combine(Div.Val);
if (OptimizedDiv.Val && OptimizedDiv.Val != Div.Val) {
SDOperand Mul = DAG.getNode(ISD::MUL, VT, OptimizedDiv, N1);
SDOperand Sub = DAG.getNode(ISD::SUB, VT, N0, Mul);
AddToWorkList(Mul.Val);
return Sub;
}
}
// undef % X -> 0

View File

@ -0,0 +1,6 @@
; RUN: llvm-as < %s | llc -march=x86 | not grep mul
define i8 @foo(i8 %tmp325) {
%t546 = urem i8 %tmp325, 37
ret i8 %t546
}