aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp4
-rw-r--r--test/Transforms/InstCombine/div.ll14
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 2f4b1926d8..0f9df27fa4 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -3012,6 +3012,10 @@ Instruction *InstCombiner::commonDivTransforms(BinaryOperator &I) {
Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
+ // (sdiv X, X) --> 1 (udiv X, X) --> 1
+ if (Op0 == Op1)
+ return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 1));
+
if (Instruction *Common = commonDivTransforms(I))
return Common;
diff --git a/test/Transforms/InstCombine/div.ll b/test/Transforms/InstCombine/div.ll
index b21d39b7a5..ea6ea6323c 100644
--- a/test/Transforms/InstCombine/div.ll
+++ b/test/Transforms/InstCombine/div.ll
@@ -1,8 +1,6 @@
; This test makes sure that div instructions are properly eliminated.
-;
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep div
-; END.
define i32 @test1(i32 %A) {
%B = sdiv i32 %A, 1 ; <i32> [#uses=1]
@@ -72,3 +70,15 @@ define i32 @test11(i32 %X, i1 %C) {
%B = udiv i32 %X, %A ; <i32> [#uses=1]
ret i32 %B
}
+
+; PR2328
+define i32 @test12(i32 %x) nounwind {
+ %tmp3 = udiv i32 %x, %x ; 1
+ ret i32 %tmp3
+}
+
+define i32 @test13(i32 %x) nounwind {
+ %tmp3 = sdiv i32 %x, %x ; 1
+ ret i32 %tmp3
+}
+