mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[InstCombine] add tests for bitmask of casted shift; NFC (PR46013)
This commit is contained in:
parent
320b88c87c
commit
b868a972c1
@ -1,6 +1,9 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
declare void @use8(i8)
|
||||
declare void @use32(i32)
|
||||
|
||||
; There should be no 'and' instructions left in any test.
|
||||
|
||||
define i32 @test1(i32 %A) {
|
||||
@ -13,7 +16,7 @@ define i32 @test1(i32 %A) {
|
||||
|
||||
define i32 @test2(i32 %A) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK-NEXT: ret i32 %A
|
||||
; CHECK-NEXT: ret i32 [[A:%.*]]
|
||||
;
|
||||
%B = and i32 %A, -1
|
||||
ret i32 %B
|
||||
@ -29,7 +32,7 @@ define i1 @test3(i1 %A) {
|
||||
|
||||
define i1 @test4(i1 %A) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK-NEXT: ret i1 %A
|
||||
; CHECK-NEXT: ret i1 [[A:%.*]]
|
||||
;
|
||||
%B = and i1 %A, true
|
||||
ret i1 %B
|
||||
@ -37,7 +40,7 @@ define i1 @test4(i1 %A) {
|
||||
|
||||
define i32 @test5(i32 %A) {
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK-NEXT: ret i32 %A
|
||||
; CHECK-NEXT: ret i32 [[A:%.*]]
|
||||
;
|
||||
%B = and i32 %A, %A
|
||||
ret i32 %B
|
||||
@ -45,7 +48,7 @@ define i32 @test5(i32 %A) {
|
||||
|
||||
define i1 @test6(i1 %A) {
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK-NEXT: ret i1 %A
|
||||
; CHECK-NEXT: ret i1 [[A:%.*]]
|
||||
;
|
||||
%B = and i1 %A, %A
|
||||
ret i1 %B
|
||||
@ -74,7 +77,7 @@ define i8 @test8(i8 %A) {
|
||||
; Test of sign bit, convert to setle %A, 0
|
||||
define i1 @test9(i32 %A) {
|
||||
; CHECK-LABEL: @test9(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 %A, 0
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[A:%.*]], 0
|
||||
; CHECK-NEXT: ret i1 [[C]]
|
||||
;
|
||||
%B = and i32 %A, -2147483648
|
||||
@ -85,7 +88,7 @@ define i1 @test9(i32 %A) {
|
||||
; Test of sign bit, convert to setle %A, 0
|
||||
define i1 @test9a(i32 %A) {
|
||||
; CHECK-LABEL: @test9a(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 %A, 0
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[A:%.*]], 0
|
||||
; CHECK-NEXT: ret i1 [[C]]
|
||||
;
|
||||
%B = and i32 %A, -2147483648
|
||||
@ -106,9 +109,9 @@ define i32 @test10(i32 %A) {
|
||||
|
||||
define i32 @test11(i32 %A, i32* %P) {
|
||||
; CHECK-LABEL: @test11(
|
||||
; CHECK-NEXT: [[B:%.*]] = or i32 %A, 3
|
||||
; CHECK-NEXT: [[B:%.*]] = or i32 [[A:%.*]], 3
|
||||
; CHECK-NEXT: [[C:%.*]] = xor i32 [[B]], 12
|
||||
; CHECK-NEXT: store i32 [[C]], i32* %P, align 4
|
||||
; CHECK-NEXT: store i32 [[C]], i32* [[P:%.*]], align 4
|
||||
; CHECK-NEXT: ret i32 3
|
||||
;
|
||||
%B = or i32 %A, 3
|
||||
@ -122,8 +125,8 @@ define i32 @test11(i32 %A, i32* %P) {
|
||||
|
||||
define i1 @test12(i32 %A, i32 %B) {
|
||||
; CHECK-LABEL: @test12(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 %A, %B
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[A:%.*]], [[B:%.*]]
|
||||
; CHECK-NEXT: ret i1 [[C1]]
|
||||
;
|
||||
%C1 = icmp ult i32 %A, %B
|
||||
%C2 = icmp ule i32 %A, %B
|
||||
@ -145,7 +148,7 @@ define i1 @test13(i32 %A, i32 %B) {
|
||||
|
||||
define i1 @test14(i8 %A) {
|
||||
; CHECK-LABEL: @test14(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 %A, 0
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[A:%.*]], 0
|
||||
; CHECK-NEXT: ret i1 [[C]]
|
||||
;
|
||||
%B = and i8 %A, -128
|
||||
@ -174,7 +177,7 @@ define i8 @test16(i8 %A) {
|
||||
|
||||
define i1 @test18(i32 %A) {
|
||||
; CHECK-LABEL: @test18(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 %A, 127
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[A:%.*]], 127
|
||||
; CHECK-NEXT: ret i1 [[C]]
|
||||
;
|
||||
%B = and i32 %A, -128
|
||||
@ -185,7 +188,7 @@ define i1 @test18(i32 %A) {
|
||||
|
||||
define <2 x i1> @test18_vec(<2 x i32> %A) {
|
||||
; CHECK-LABEL: @test18_vec(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ugt <2 x i32> %A, <i32 127, i32 127>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ugt <2 x i32> [[A:%.*]], <i32 127, i32 127>
|
||||
; CHECK-NEXT: ret <2 x i1> [[C]]
|
||||
;
|
||||
%B = and <2 x i32> %A, <i32 -128, i32 -128>
|
||||
@ -195,7 +198,7 @@ define <2 x i1> @test18_vec(<2 x i32> %A) {
|
||||
|
||||
define i1 @test18a(i8 %A) {
|
||||
; CHECK-LABEL: @test18a(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 %A, 2
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[A:%.*]], 2
|
||||
; CHECK-NEXT: ret i1 [[C]]
|
||||
;
|
||||
%B = and i8 %A, -2
|
||||
@ -205,7 +208,7 @@ define i1 @test18a(i8 %A) {
|
||||
|
||||
define <2 x i1> @test18a_vec(<2 x i8> %A) {
|
||||
; CHECK-LABEL: @test18a_vec(
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ult <2 x i8> %A, <i8 2, i8 2>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ult <2 x i8> [[A:%.*]], <i8 2, i8 2>
|
||||
; CHECK-NEXT: ret <2 x i1> [[C]]
|
||||
;
|
||||
%B = and <2 x i8> %A, <i8 -2, i8 -2>
|
||||
@ -215,7 +218,7 @@ define <2 x i1> @test18a_vec(<2 x i8> %A) {
|
||||
|
||||
define i32 @test19(i32 %A) {
|
||||
; CHECK-LABEL: @test19(
|
||||
; CHECK-NEXT: [[B:%.*]] = shl i32 %A, 3
|
||||
; CHECK-NEXT: [[B:%.*]] = shl i32 [[A:%.*]], 3
|
||||
; CHECK-NEXT: ret i32 [[B]]
|
||||
;
|
||||
%B = shl i32 %A, 3
|
||||
@ -226,7 +229,7 @@ define i32 @test19(i32 %A) {
|
||||
|
||||
define i8 @test20(i8 %A) {
|
||||
; CHECK-LABEL: @test20(
|
||||
; CHECK-NEXT: [[C:%.*]] = lshr i8 %A, 7
|
||||
; CHECK-NEXT: [[C:%.*]] = lshr i8 [[A:%.*]], 7
|
||||
; CHECK-NEXT: ret i8 [[C]]
|
||||
;
|
||||
%C = lshr i8 %A, 7
|
||||
@ -237,7 +240,7 @@ define i8 @test20(i8 %A) {
|
||||
|
||||
define i1 @test23(i32 %A) {
|
||||
; CHECK-LABEL: @test23(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 %A, 2
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[A:%.*]], 2
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
;
|
||||
%B = icmp sgt i32 %A, 1
|
||||
@ -249,8 +252,8 @@ define i1 @test23(i32 %A) {
|
||||
; FIXME: Vectors should fold too.
|
||||
define <2 x i1> @test23vec(<2 x i32> %A) {
|
||||
; CHECK-LABEL: @test23vec(
|
||||
; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i32> %A, <i32 1, i32 1>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt <2 x i32> %A, <i32 3, i32 3>
|
||||
; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i32> [[A:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt <2 x i32> [[A]], <i32 3, i32 3>
|
||||
; CHECK-NEXT: [[D:%.*]] = and <2 x i1> [[B]], [[C]]
|
||||
; CHECK-NEXT: ret <2 x i1> [[D]]
|
||||
;
|
||||
@ -262,7 +265,7 @@ define <2 x i1> @test23vec(<2 x i32> %A) {
|
||||
|
||||
define i1 @test24(i32 %A) {
|
||||
; CHECK-LABEL: @test24(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 %A, 2
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], 2
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
;
|
||||
%B = icmp sgt i32 %A, 1
|
||||
@ -274,7 +277,7 @@ define i1 @test24(i32 %A) {
|
||||
|
||||
define i1 @test25(i32 %A) {
|
||||
; CHECK-LABEL: @test25(
|
||||
; CHECK-NEXT: [[A_OFF:%.*]] = add i32 %A, -50
|
||||
; CHECK-NEXT: [[A_OFF:%.*]] = add i32 [[A:%.*]], -50
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[A_OFF]], 50
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
;
|
||||
@ -287,8 +290,8 @@ define i1 @test25(i32 %A) {
|
||||
; FIXME: Vectors should fold too.
|
||||
define <2 x i1> @test25vec(<2 x i32> %A) {
|
||||
; CHECK-LABEL: @test25vec(
|
||||
; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i32> %A, <i32 49, i32 49>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt <2 x i32> %A, <i32 100, i32 100>
|
||||
; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i32> [[A:%.*]], <i32 49, i32 49>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp slt <2 x i32> [[A]], <i32 100, i32 100>
|
||||
; CHECK-NEXT: [[D:%.*]] = and <2 x i1> [[B]], [[C]]
|
||||
; CHECK-NEXT: ret <2 x i1> [[D]]
|
||||
;
|
||||
@ -313,8 +316,8 @@ define i8 @test27(i8 %A) {
|
||||
;; This is just a zero-extending shr.
|
||||
define i32 @test28(i32 %X) {
|
||||
; CHECK-LABEL: @test28(
|
||||
; CHECK-NEXT: [[Y1:%.*]] = lshr i32 %X, 24
|
||||
; CHECK-NEXT: ret i32 [[Y1]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 24
|
||||
; CHECK-NEXT: ret i32 [[TMP1]]
|
||||
;
|
||||
;; Sign extend
|
||||
%Y = ashr i32 %X, 24
|
||||
@ -325,7 +328,7 @@ define i32 @test28(i32 %X) {
|
||||
|
||||
define i32 @test29(i8 %X) {
|
||||
; CHECK-LABEL: @test29(
|
||||
; CHECK-NEXT: [[Y:%.*]] = zext i8 %X to i32
|
||||
; CHECK-NEXT: [[Y:%.*]] = zext i8 [[X:%.*]] to i32
|
||||
; CHECK-NEXT: ret i32 [[Y]]
|
||||
;
|
||||
%Y = zext i8 %X to i32
|
||||
@ -336,7 +339,7 @@ define i32 @test29(i8 %X) {
|
||||
|
||||
define i32 @test30(i1 %X) {
|
||||
; CHECK-LABEL: @test30(
|
||||
; CHECK-NEXT: [[Y:%.*]] = zext i1 %X to i32
|
||||
; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X:%.*]] to i32
|
||||
; CHECK-NEXT: ret i32 [[Y]]
|
||||
;
|
||||
%Y = zext i1 %X to i32
|
||||
@ -359,7 +362,7 @@ define i32 @test31(i1 %X) {
|
||||
|
||||
define <2 x i32> @and_demanded_bits_splat_vec(<2 x i32> %x) {
|
||||
; CHECK-LABEL: @and_demanded_bits_splat_vec(
|
||||
; CHECK-NEXT: [[Z:%.*]] = and <2 x i32> %x, <i32 7, i32 7>
|
||||
; CHECK-NEXT: [[Z:%.*]] = and <2 x i32> [[X:%.*]], <i32 7, i32 7>
|
||||
; CHECK-NEXT: ret <2 x i32> [[Z]]
|
||||
;
|
||||
%y = add <2 x i32> %x, <i32 8, i32 8>
|
||||
@ -373,7 +376,7 @@ define <2 x i32> @and_demanded_bits_splat_vec(<2 x i32> %x) {
|
||||
|
||||
define i32 @and_zext_demanded(i16 %x, i32 %y) {
|
||||
; CHECK-LABEL: @and_zext_demanded(
|
||||
; CHECK-NEXT: [[S:%.*]] = lshr i16 %x, 8
|
||||
; CHECK-NEXT: [[S:%.*]] = lshr i16 [[X:%.*]], 8
|
||||
; CHECK-NEXT: [[Z:%.*]] = zext i16 [[S]] to i32
|
||||
; CHECK-NEXT: ret i32 [[Z]]
|
||||
;
|
||||
@ -397,59 +400,59 @@ define i32 @test32(i32 %In) {
|
||||
;; Code corresponding to one-bit bitfield ^1.
|
||||
define i32 @test33(i32 %b) {
|
||||
; CHECK-LABEL: @test33(
|
||||
; CHECK-NEXT: [[TMP_13:%.*]] = xor i32 %b, 1
|
||||
; CHECK-NEXT: ret i32 [[TMP_13]]
|
||||
; CHECK-NEXT: [[T13:%.*]] = xor i32 [[B:%.*]], 1
|
||||
; CHECK-NEXT: ret i32 [[T13]]
|
||||
;
|
||||
%tmp.4.mask = and i32 %b, 1
|
||||
%tmp.10 = xor i32 %tmp.4.mask, 1
|
||||
%tmp.12 = and i32 %b, -2
|
||||
%tmp.13 = or i32 %tmp.12, %tmp.10
|
||||
ret i32 %tmp.13
|
||||
%t4.mask = and i32 %b, 1
|
||||
%t10 = xor i32 %t4.mask, 1
|
||||
%t12 = and i32 %b, -2
|
||||
%t13 = or i32 %t12, %t10
|
||||
ret i32 %t13
|
||||
}
|
||||
|
||||
define i32 @test33b(i32 %b) {
|
||||
; CHECK-LABEL: @test33b(
|
||||
; CHECK-NEXT: [[TMP_13:%.*]] = xor i32 [[B:%.*]], 1
|
||||
; CHECK-NEXT: ret i32 [[TMP_13]]
|
||||
; CHECK-NEXT: [[T13:%.*]] = xor i32 [[B:%.*]], 1
|
||||
; CHECK-NEXT: ret i32 [[T13]]
|
||||
;
|
||||
%tmp.4.mask = and i32 %b, 1
|
||||
%tmp.10 = xor i32 %tmp.4.mask, 1
|
||||
%tmp.12 = and i32 %b, -2
|
||||
%tmp.13 = or i32 %tmp.10, %tmp.12
|
||||
ret i32 %tmp.13
|
||||
%t4.mask = and i32 %b, 1
|
||||
%t10 = xor i32 %t4.mask, 1
|
||||
%t12 = and i32 %b, -2
|
||||
%t13 = or i32 %t10, %t12
|
||||
ret i32 %t13
|
||||
}
|
||||
|
||||
define <2 x i32> @test33vec(<2 x i32> %b) {
|
||||
; CHECK-LABEL: @test33vec(
|
||||
; CHECK-NEXT: [[TMP_13:%.*]] = xor <2 x i32> [[B:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: ret <2 x i32> [[TMP_13]]
|
||||
; CHECK-NEXT: [[T13:%.*]] = xor <2 x i32> [[B:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: ret <2 x i32> [[T13]]
|
||||
;
|
||||
%tmp.4.mask = and <2 x i32> %b, <i32 1, i32 1>
|
||||
%tmp.10 = xor <2 x i32> %tmp.4.mask, <i32 1, i32 1>
|
||||
%tmp.12 = and <2 x i32> %b, <i32 -2, i32 -2>
|
||||
%tmp.13 = or <2 x i32> %tmp.12, %tmp.10
|
||||
ret <2 x i32> %tmp.13
|
||||
%t4.mask = and <2 x i32> %b, <i32 1, i32 1>
|
||||
%t10 = xor <2 x i32> %t4.mask, <i32 1, i32 1>
|
||||
%t12 = and <2 x i32> %b, <i32 -2, i32 -2>
|
||||
%t13 = or <2 x i32> %t12, %t10
|
||||
ret <2 x i32> %t13
|
||||
}
|
||||
|
||||
define <2 x i32> @test33vecb(<2 x i32> %b) {
|
||||
; CHECK-LABEL: @test33vecb(
|
||||
; CHECK-NEXT: [[TMP_13:%.*]] = xor <2 x i32> [[B:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: ret <2 x i32> [[TMP_13]]
|
||||
; CHECK-NEXT: [[T13:%.*]] = xor <2 x i32> [[B:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: ret <2 x i32> [[T13]]
|
||||
;
|
||||
%tmp.4.mask = and <2 x i32> %b, <i32 1, i32 1>
|
||||
%tmp.10 = xor <2 x i32> %tmp.4.mask, <i32 1, i32 1>
|
||||
%tmp.12 = and <2 x i32> %b, <i32 -2, i32 -2>
|
||||
%tmp.13 = or <2 x i32> %tmp.10, %tmp.12
|
||||
ret <2 x i32> %tmp.13
|
||||
%t4.mask = and <2 x i32> %b, <i32 1, i32 1>
|
||||
%t10 = xor <2 x i32> %t4.mask, <i32 1, i32 1>
|
||||
%t12 = and <2 x i32> %b, <i32 -2, i32 -2>
|
||||
%t13 = or <2 x i32> %t10, %t12
|
||||
ret <2 x i32> %t13
|
||||
}
|
||||
|
||||
define i32 @test34(i32 %A, i32 %B) {
|
||||
; CHECK-LABEL: @test34(
|
||||
; CHECK-NEXT: ret i32 %B
|
||||
; CHECK-NEXT: ret i32 [[B:%.*]]
|
||||
;
|
||||
%tmp.2 = or i32 %B, %A
|
||||
%tmp.4 = and i32 %tmp.2, %B
|
||||
ret i32 %tmp.4
|
||||
%t2 = or i32 %B, %A
|
||||
%t4 = and i32 %t2, %B
|
||||
ret i32 %t4
|
||||
}
|
||||
|
||||
; FIXME: This test should only need -instsimplify (ValueTracking / computeKnownBits), not -instcombine.
|
||||
@ -465,10 +468,11 @@ define <2 x i32> @PR24942(<2 x i32> %x) {
|
||||
|
||||
define i64 @test35(i32 %X) {
|
||||
; CHECK-LABEL: @test35(
|
||||
; CHECK-NEXT: %[[sub:.*]] = sub i32 0, %X
|
||||
; CHECK-NEXT: %[[and:.*]] = and i32 %[[sub]], 240
|
||||
; CHECK-NEXT: %[[cst:.*]] = zext i32 %[[and]] to i64
|
||||
; CHECK-NEXT: ret i64 %[[cst]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[X:%.*]]
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
|
||||
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
|
||||
; CHECK-NEXT: ret i64 [[RES]]
|
||||
;
|
||||
%zext = zext i32 %X to i64
|
||||
%zsub = sub i64 0, %zext
|
||||
%res = and i64 %zsub, 240
|
||||
@ -477,10 +481,11 @@ define i64 @test35(i32 %X) {
|
||||
|
||||
define i64 @test36(i32 %X) {
|
||||
; CHECK-LABEL: @test36(
|
||||
; CHECK-NEXT: %[[sub:.*]] = add i32 %X, 7
|
||||
; CHECK-NEXT: %[[and:.*]] = and i32 %[[sub]], 240
|
||||
; CHECK-NEXT: %[[cst:.*]] = zext i32 %[[and]] to i64
|
||||
; CHECK-NEXT: ret i64 %[[cst]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 7
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
|
||||
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
|
||||
; CHECK-NEXT: ret i64 [[RES]]
|
||||
;
|
||||
%zext = zext i32 %X to i64
|
||||
%zsub = add i64 %zext, 7
|
||||
%res = and i64 %zsub, 240
|
||||
@ -489,10 +494,11 @@ define i64 @test36(i32 %X) {
|
||||
|
||||
define i64 @test37(i32 %X) {
|
||||
; CHECK-LABEL: @test37(
|
||||
; CHECK-NEXT: %[[sub:.*]] = mul i32 %X, 7
|
||||
; CHECK-NEXT: %[[and:.*]] = and i32 %[[sub]], 240
|
||||
; CHECK-NEXT: %[[cst:.*]] = zext i32 %[[and]] to i64
|
||||
; CHECK-NEXT: ret i64 %[[cst]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[X:%.*]], 7
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
|
||||
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
|
||||
; CHECK-NEXT: ret i64 [[RES]]
|
||||
;
|
||||
%zext = zext i32 %X to i64
|
||||
%zsub = mul i64 %zext, 7
|
||||
%res = and i64 %zsub, 240
|
||||
@ -501,9 +507,10 @@ define i64 @test37(i32 %X) {
|
||||
|
||||
define i64 @test38(i32 %X) {
|
||||
; CHECK-LABEL: @test38(
|
||||
; CHECK-NEXT: %[[and:.*]] = and i32 %X, 240
|
||||
; CHECK-NEXT: %[[cst:.*]] = zext i32 %[[and]] to i64
|
||||
; CHECK-NEXT: ret i64 %[[cst]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 240
|
||||
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP1]] to i64
|
||||
; CHECK-NEXT: ret i64 [[RES]]
|
||||
;
|
||||
%zext = zext i32 %X to i64
|
||||
%zsub = xor i64 %zext, 7
|
||||
%res = and i64 %zsub, 240
|
||||
@ -512,9 +519,10 @@ define i64 @test38(i32 %X) {
|
||||
|
||||
define i64 @test39(i32 %X) {
|
||||
; CHECK-LABEL: @test39(
|
||||
; CHECK-NEXT: %[[and:.*]] = and i32 %X, 240
|
||||
; CHECK-NEXT: %[[cst:.*]] = zext i32 %[[and]] to i64
|
||||
; CHECK-NEXT: ret i64 %[[cst]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 240
|
||||
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP1]] to i64
|
||||
; CHECK-NEXT: ret i64 [[RES]]
|
||||
;
|
||||
%zext = zext i32 %X to i64
|
||||
%zsub = or i64 %zext, 7
|
||||
%res = and i64 %zsub, 240
|
||||
@ -836,3 +844,59 @@ define i1 @andn_or_cmp_4(i32 %a, i32 %b, i32 %c) {
|
||||
%and = and i1 %or, %x_inv
|
||||
ret i1 %and
|
||||
}
|
||||
|
||||
define i32 @lowbitmask_casted_shift(i8 %x) {
|
||||
; CHECK-LABEL: @lowbitmask_casted_shift(
|
||||
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 1
|
||||
; CHECK-NEXT: [[S:%.*]] = sext i8 [[A]] to i32
|
||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[S]], 2147483647
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%a = ashr i8 %x, 1
|
||||
%s = sext i8 %a to i32
|
||||
%r = and i32 %s, 2147483647
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
define i32 @lowbitmask_casted_shift_use1(i8 %x) {
|
||||
; CHECK-LABEL: @lowbitmask_casted_shift_use1(
|
||||
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 3
|
||||
; CHECK-NEXT: call void @use8(i8 [[A]])
|
||||
; CHECK-NEXT: [[S:%.*]] = sext i8 [[A]] to i32
|
||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[S]], 536870911
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%a = ashr i8 %x, 3
|
||||
call void @use8(i8 %a)
|
||||
%s = sext i8 %a to i32
|
||||
%r = and i32 %s, 536870911
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
define i32 @lowbitmask_casted_shift_use2(i8 %x) {
|
||||
; CHECK-LABEL: @lowbitmask_casted_shift_use2(
|
||||
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 3
|
||||
; CHECK-NEXT: [[S:%.*]] = sext i8 [[A]] to i32
|
||||
; CHECK-NEXT: call void @use32(i32 [[S]])
|
||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[S]], 536870911
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
%a = ashr i8 %x, 3
|
||||
%s = sext i8 %a to i32
|
||||
call void @use32(i32 %s)
|
||||
%r = and i32 %s, 536870911
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
define <2 x i59> @lowbitmask_casted_shift_vec_splat(<2 x i47> %x) {
|
||||
; CHECK-LABEL: @lowbitmask_casted_shift_vec_splat(
|
||||
; CHECK-NEXT: [[A:%.*]] = ashr <2 x i47> [[X:%.*]], <i47 5, i47 5>
|
||||
; CHECK-NEXT: [[S:%.*]] = sext <2 x i47> [[A]] to <2 x i59>
|
||||
; CHECK-NEXT: [[R:%.*]] = and <2 x i59> [[S]], <i59 18014398509481983, i59 18014398509481983>
|
||||
; CHECK-NEXT: ret <2 x i59> [[R]]
|
||||
;
|
||||
%a = ashr <2 x i47> %x, <i47 5, i47 5>
|
||||
%s = sext <2 x i47> %a to <2 x i59>
|
||||
%r = and <2 x i59> %s, <i59 18014398509481983, i59 18014398509481983> ; -1 u>> 5 == 0x3f_ffff_ffff_ffff
|
||||
ret <2 x i59> %r
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user