From 218fe23f410b3b05bdd30a5f0778a77f05228f18 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 22 Nov 2014 18:16:54 +0000 Subject: [PATCH] InstCombine: Propagate exact in (udiv (lshr X,C1),C2) -> (udiv x,C1<ushl_ov(*C1, Overflow); - if (!Overflow) - return BinaryOperator::CreateUDiv( + if (!Overflow) { + bool IsExact = I.isExact() && match(Op0, m_Exact(m_Value())); + BinaryOperator *BO = BinaryOperator::CreateUDiv( X, ConstantInt::get(X->getType(), C2ShlC1)); + if (IsExact) + BO->setIsExact(); + return BO; + } } } diff --git a/test/Transforms/InstCombine/div.ll b/test/Transforms/InstCombine/div.ll index 5af86680697..585b04a4d5d 100644 --- a/test/Transforms/InstCombine/div.ll +++ b/test/Transforms/InstCombine/div.ll @@ -286,3 +286,12 @@ define i32 @test32(i32 %a, i32 %b) { ; CHECK-NEXT: %[[div:.*]] = udiv i32 %a, %[[shr]] ; CHECK-NEXT: ret i32 } + +define <2 x i64> @test33(<2 x i64> %x) nounwind { + %shr = lshr exact <2 x i64> %x, + %div = udiv exact <2 x i64> %shr, + ret <2 x i64> %div +; CHECK-LABEL: @test33( +; CHECK-NEXT: udiv exact <2 x i64> %x, +; CHECK-NEXT: ret <2 x i64> +}