From a252138942d8d48eb31234e0da09d3d97cb6abad Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 13 Oct 2014 21:48:30 +0000 Subject: InstCombine: Don't miscompile (x lshr C1) udiv C2 We have a transform that changes: (x lshr C1) udiv C2 into: x udiv (C2 << C1) However, it is unsafe to do so if C2 << C1 discards any of C2's bits. This fixes PR21255. llvm-svn: 219634 --- llvm/test/Transforms/InstCombine/div.ll | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'llvm/test/Transforms') diff --git a/llvm/test/Transforms/InstCombine/div.ll b/llvm/test/Transforms/InstCombine/div.ll index 5a884ac671d..f2a70fd0f0d 100644 --- a/llvm/test/Transforms/InstCombine/div.ll +++ b/llvm/test/Transforms/InstCombine/div.ll @@ -132,11 +132,11 @@ define i32 @test15(i32 %a, i32 %b) nounwind { } define <2 x i64> @test16(<2 x i64> %x) nounwind { - %shr = lshr <2 x i64> %x, - %div = udiv <2 x i64> %shr, + %shr = lshr <2 x i64> %x, + %div = udiv <2 x i64> %shr, ret <2 x i64> %div ; CHECK-LABEL: @test16( -; CHECK-NEXT: udiv <2 x i64> %x, +; CHECK-NEXT: udiv <2 x i64> %x, ; CHECK-NEXT: ret <2 x i64> } @@ -264,3 +264,13 @@ define i32 @test30(i32 %a) { ; CHECK-LABEL: @test30( ; CHECK-NEXT: ret i32 %a } + +define <2 x i32> @test31(<2 x i32> %x) nounwind { + %shr = lshr <2 x i32> %x, + %div = udiv <2 x i32> %shr, + ret <2 x i32> %div +; CHECK-LABEL: @test31( +; CHECK-NEXT: %[[shr:.*]] = lshr <2 x i32> %x, +; CHECK-NEXT: udiv <2 x i32> %[[shr]], +; CHECK-NEXT: ret <2 x i32> +} -- cgit v1.2.3