diff options
Diffstat (limited to 'test/Transforms/InstCombine/div.ll')
| -rw-r--r-- | test/Transforms/InstCombine/div.ll | 156 |
1 files changed, 153 insertions, 3 deletions
diff --git a/test/Transforms/InstCombine/div.ll b/test/Transforms/InstCombine/div.ll index 9c7ba9b03059..e0ff07baae7c 100644 --- a/test/Transforms/InstCombine/div.ll +++ b/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> } @@ -175,3 +175,153 @@ define i32 @test20(i32 %x) { ; CHECK-NEXT: select i1 %{{.*}}, i32 %x, i32 {{.*}} ; CHECK-NEXT: ret i32 } + +define i32 @test21(i32 %a) { + %shl = shl nsw i32 %a, 2 + %div = sdiv i32 %shl, 12 + ret i32 %div +; CHECK-LABEL: @test21( +; CHECK-NEXT: %div = sdiv i32 %a, 3 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test22(i32 %a) { + %mul = mul nsw i32 %a, 3 + %div = sdiv i32 %mul, 12 + ret i32 %div +; CHECK-LABEL: @test22( +; CHECK-NEXT: %div = sdiv i32 %a, 4 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test23(i32 %a) { + %shl = shl nuw i32 %a, 2 + %div = udiv i32 %shl, 12 + ret i32 %div +; CHECK-LABEL: @test23( +; CHECK-NEXT: %div = udiv i32 %a, 3 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test24(i32 %a) { + %mul = mul nuw i32 %a, 3 + %div = udiv i32 %mul, 12 + ret i32 %div +; CHECK-LABEL: @test24( +; CHECK-NEXT: %div = lshr i32 %a, 2 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test25(i32 %a) { + %shl = shl nsw i32 %a, 2 + %div = sdiv i32 %shl, 2 + ret i32 %div +; CHECK-LABEL: @test25( +; CHECK-NEXT: %div = shl nsw i32 %a, 1 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test26(i32 %a) { + %mul = mul nsw i32 %a, 12 + %div = sdiv i32 %mul, 3 + ret i32 %div +; CHECK-LABEL: @test26( +; CHECK-NEXT: %div = shl nsw i32 %a, 2 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test27(i32 %a) { + %shl = shl nuw i32 %a, 2 + %div = udiv i32 %shl, 2 + ret i32 %div +; CHECK-LABEL: @test27( +; CHECK-NEXT: %div = shl nuw i32 %a, 1 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test28(i32 %a) { + %mul = mul nuw i32 %a, 36 + %div = udiv i32 %mul, 3 + ret i32 %div +; CHECK-LABEL: @test28( +; CHECK-NEXT: %div = mul nuw i32 %a, 12 +; CHECK-NEXT: ret i32 %div +} + +define i32 @test29(i32 %a) { + %mul = shl nsw i32 %a, 31 + %div = sdiv i32 %mul, -2147483648 + ret i32 %div +; CHECK-LABEL: @test29( +; CHECK-NEXT: %[[and:.*]] = and i32 %a, 1 +; CHECK-NEXT: ret i32 %[[and]] +} + +define i32 @test30(i32 %a) { + %mul = shl nuw i32 %a, 31 + %div = udiv i32 %mul, -2147483648 + ret i32 %div +; CHECK-LABEL: @test30( +; CHECK-NEXT: ret i32 %a +} + +define <2 x i32> @test31(<2 x i32> %x) { + %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> +} + +define i32 @test32(i32 %a, i32 %b) { + %shl = shl i32 2, %b + %div = lshr i32 %shl, 2 + %div2 = udiv i32 %a, %div + ret i32 %div2 +; CHECK-LABEL: @test32( +; CHECK-NEXT: %[[shl:.*]] = shl i32 2, %b +; CHECK-NEXT: %[[shr:.*]] = lshr i32 %[[shl]], 2 +; 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, <i64 5, i64 5> + %div = udiv exact <2 x i64> %shr, <i64 6, i64 6> + ret <2 x i64> %div +; CHECK-LABEL: @test33( +; CHECK-NEXT: udiv exact <2 x i64> %x, <i64 192, i64 192> +; CHECK-NEXT: ret <2 x i64> +} + +define <2 x i64> @test34(<2 x i64> %x) nounwind { + %neg = sub nsw <2 x i64> zeroinitializer, %x + %div = sdiv exact <2 x i64> %neg, <i64 3, i64 4> + ret <2 x i64> %div +; CHECK-LABEL: @test34( +; CHECK-NEXT: sdiv exact <2 x i64> %x, <i64 -3, i64 -4> +; CHECK-NEXT: ret <2 x i64> +} + +define i32 @test35(i32 %A) { + %and = and i32 %A, 2147483647 + %mul = sdiv exact i32 %and, 2147483647 + ret i32 %mul +; CHECK-LABEL: @test35( +; CHECK-NEXT: %[[and:.*]] = and i32 %A, 2147483647 +; CHECK-NEXT: %[[udiv:.*]] = udiv exact i32 %[[and]], 2147483647 +; CHECK-NEXT: ret i32 %[[udiv]] +} + +define i32 @test36(i32 %A) { + %and = and i32 %A, 2147483647 + %shl = shl nsw i32 1, %A + %mul = sdiv exact i32 %and, %shl + ret i32 %mul +; CHECK-LABEL: @test36( +; CHECK-NEXT: %[[and:.*]] = and i32 %A, 2147483647 +; CHECK-NEXT: %[[shr:.*]] = lshr exact i32 %[[and]], %A +; CHECK-NEXT: ret i32 %[[shr]] +} |
