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:
parent
57c2305216
commit
a9f8208852
@ -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
|
||||
|
6
test/CodeGen/X86/urem-i8-constant.ll
Normal file
6
test/CodeGen/X86/urem-i8-constant.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user