diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-10-13 21:48:30 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-10-13 21:48:30 +0000 |
| commit | a252138942d8d48eb31234e0da09d3d97cb6abad (patch) | |
| tree | eaabf3357117fd540cd950b358b119366ae26c27 /llvm/test/Transforms | |
| parent | a562b46db736bdaa74e7c52a1eb7415561613836 (diff) | |
| download | bcm5719-llvm-a252138942d8d48eb31234e0da09d3d97cb6abad.tar.gz bcm5719-llvm-a252138942d8d48eb31234e0da09d3d97cb6abad.zip | |
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
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/div.ll | 16 |
1 files changed, 13 insertions, 3 deletions
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, <i64 3, i64 5> - %div = udiv <2 x i64> %shr, <i64 4, i64 6> + %shr = lshr <2 x i64> %x, <i64 5, i64 5> + %div = udiv <2 x i64> %shr, <i64 6, i64 6> ret <2 x i64> %div ; CHECK-LABEL: @test16( -; CHECK-NEXT: udiv <2 x i64> %x, <i64 32, i64 192> +; CHECK-NEXT: udiv <2 x i64> %x, <i64 192, i64 192> ; 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, <i32 31, i32 31> + %div = udiv <2 x i32> %shr, <i32 2147483647, i32 2147483647> + ret <2 x i32> %div +; CHECK-LABEL: @test31( +; CHECK-NEXT: %[[shr:.*]] = lshr <2 x i32> %x, <i32 31, i32 31> +; CHECK-NEXT: udiv <2 x i32> %[[shr]], <i32 2147483647, i32 2147483647> +; CHECK-NEXT: ret <2 x i32> +} |

