Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit d5f7353

Browse files
committed
InstSimplify: Don't allow (x srem y) urem y -> x srem y
Let's consider the case where: %x i16 = 32768 %y i16 = 384 %x srem %y = 65408 (%x srem %y) urem %y = 128 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217939 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 27e656c commit d5f7353

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

lib/Analysis/InstructionSimplify.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,10 +1171,12 @@ static Value *SimplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1,
11711171
if (Op0 == Op1)
11721172
return Constant::getNullValue(Op0->getType());
11731173

1174-
// ((X % Y) % Y) -> (X % Y)
1175-
if (match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) {
1174+
// (X % Y) % Y -> X % Y
1175+
if ((Opcode == Instruction::SRem &&
1176+
match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) ||
1177+
(Opcode == Instruction::URem &&
1178+
match(Op0, m_URem(m_Value(), m_Specific(Op1)))))
11761179
return Op0;
1177-
}
11781180

11791181
// If the operation is with the result of a select instruction, check whether
11801182
// operating on either branch of the select always yields the same value.

test/Transforms/InstSimplify/rem.ll

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,30 @@ define i32 @select2(i32 %x, i1 %b) {
1616
; CHECK: ret i32 0
1717
}
1818

19-
define i32 @select3(i32 %x, i32 %n) {
20-
; CHECK-LABEL: @select3(
19+
define i32 @rem1(i32 %x, i32 %n) {
20+
; CHECK-LABEL: @rem1(
2121
; CHECK-NEXT: %mod = srem i32 %x, %n
2222
; CHECK-NEXT: ret i32 %mod
2323
%mod = srem i32 %x, %n
2424
%mod1 = srem i32 %mod, %n
2525
ret i32 %mod1
2626
}
27+
28+
define i32 @rem2(i32 %x, i32 %n) {
29+
; CHECK-LABEL: @rem2(
30+
; CHECK-NEXT: %mod = urem i32 %x, %n
31+
; CHECK-NEXT: ret i32 %mod
32+
%mod = urem i32 %x, %n
33+
%mod1 = urem i32 %mod, %n
34+
ret i32 %mod1
35+
}
36+
37+
define i32 @rem3(i32 %x, i32 %n) {
38+
; CHECK-LABEL: @rem3(
39+
; CHECK-NEXT: %[[srem:.*]] = srem i32 %x, %n
40+
; CHECK-NEXT: %[[urem:.*]] = urem i32 %[[srem]], %n
41+
; CHECK-NEXT: ret i32 %[[urem]]
42+
%mod = srem i32 %x, %n
43+
%mod1 = urem i32 %mod, %n
44+
ret i32 %mod1
45+
}

0 commit comments

Comments
 (0)