@@ -9,14 +9,14 @@ define i40 @select_reconstruction_i40(i40 %arg0) {
99; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i40 0, i40 [[ARG0]]
1010; CHECK-NEXT: ret i40 [[TMP3]]
1111;
12- %1 = trunc i40 %arg0 to i8
13- %2 = icmp eq i8 %1 , 2
14- %3 = and i40 %arg0 , -256
15- %4 = select i1 %2 , i8 0 , i8 %1
16- %5 = select i1 %2 , i40 0 , i40 %3
17- %6 = zext i8 %4 to i40
18- %7 = or disjoint i40 %5 , %6
19- ret i40 %7
12+ %low = trunc i40 %arg0 to i8
13+ %is_low_two = icmp eq i8 %low , 2
14+ %high = and i40 %arg0 , -256
15+ %select_low = select i1 %is_low_two , i8 0 , i8 %low
16+ %select_high = select i1 %is_low_two , i40 0 , i40 %high
17+ %zext_low = zext i8 %select_low to i40
18+ %recomb = or disjoint i40 %select_high , %zext_low
19+ ret i40 %recomb
2020}
2121
2222define i40 @select_reconstruction_any_cmp_val (i40 %arg0 , i8 %arg1 ) {
@@ -27,14 +27,14 @@ define i40 @select_reconstruction_any_cmp_val(i40 %arg0, i8 %arg1) {
2727; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i40 0, i40 [[ARG0]]
2828; CHECK-NEXT: ret i40 [[TMP3]]
2929;
30- %1 = trunc i40 %arg0 to i8
31- %2 = icmp eq i8 %1 , %arg1
32- %3 = and i40 %arg0 , -256
33- %4 = select i1 %2 , i8 0 , i8 %1
34- %5 = select i1 %2 , i40 0 , i40 %3
35- %6 = zext i8 %4 to i40
36- %7 = or disjoint i40 %5 , %6
37- ret i40 %7
30+ %low = trunc i40 %arg0 to i8
31+ %is_low_arg1 = icmp eq i8 %low , %arg1
32+ %high = and i40 %arg0 , -256
33+ %select_low = select i1 %is_low_arg1 , i8 0 , i8 %low
34+ %select_high = select i1 %is_low_arg1 , i40 0 , i40 %high
35+ %zext_low = zext i8 %select_low to i40
36+ %recomb = or disjoint i40 %select_high , %zext_low
37+ ret i40 %recomb
3838}
3939
4040define i40 @select_reconstruction_257_mask (i40 %arg0 ) {
@@ -46,14 +46,14 @@ define i40 @select_reconstruction_257_mask(i40 %arg0) {
4646; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP3]]
4747; CHECK-NEXT: ret i40 [[TMP4]]
4848;
49- %1 = trunc i40 %arg0 to i8
50- %2 = icmp eq i8 %1 , 2
51- %3 = and i40 %arg0 , -257
52- %4 = select i1 %2 , i8 0 , i8 %1
53- %5 = select i1 %2 , i40 0 , i40 %3
54- %6 = zext i8 %4 to i40
55- %7 = or disjoint i40 %5 , %6
56- ret i40 %7
49+ %low = trunc i40 %arg0 to i8
50+ %is_low_two = icmp eq i8 %low , 2
51+ %high = and i40 %arg0 , -257
52+ %select_low = select i1 %is_low_two , i8 0 , i8 %low
53+ %select_high = select i1 %is_low_two , i40 0 , i40 %high
54+ %zext_low = zext i8 %select_low to i40
55+ %recomb = or disjoint i40 %select_high , %zext_low
56+ ret i40 %recomb
5757}
5858
5959define i40 @select_reconstruction_i16_mask (i40 %arg0 ) {
@@ -64,14 +64,14 @@ define i40 @select_reconstruction_i16_mask(i40 %arg0) {
6464; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i40 0, i40 [[ARG0]]
6565; CHECK-NEXT: ret i40 [[TMP3]]
6666;
67- %1 = trunc i40 %arg0 to i16
68- %2 = icmp eq i16 %1 , 2
69- %3 = and i40 %arg0 , -65356
70- %4 = select i1 %2 , i16 0 , i16 %1
71- %5 = select i1 %2 , i40 0 , i40 %3
72- %6 = zext i16 %4 to i40
73- %7 = or disjoint i40 %5 , %6
74- ret i40 %7
67+ %low = trunc i40 %arg0 to i16
68+ %is_low_two = icmp eq i16 %low , 2
69+ %high = and i40 %arg0 , -65536
70+ %select_low = select i1 %is_low_two , i16 0 , i16 %low
71+ %select_high = select i1 %is_low_two , i40 0 , i40 %high
72+ %zext_low = zext i16 %select_low to i40
73+ %recomb = or disjoint i40 %select_high , %zext_low
74+ ret i40 %recomb
7575}
7676
7777define <2 x i32 > @select_reconstruction_vec_any_cmp_val (<2 x i32 > %arg0 , <2 x i8 > %arg1 ) {
@@ -82,12 +82,35 @@ define <2 x i32> @select_reconstruction_vec_any_cmp_val(<2 x i32> %arg0, <2 x i8
8282; CHECK-NEXT: [[TMP7:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> zeroinitializer, <2 x i32> [[ARG0]]
8383; CHECK-NEXT: ret <2 x i32> [[TMP7]]
8484;
85- %1 = trunc <2 x i32 > %arg0 to <2 x i8 >
86- %2 = icmp eq <2 x i8 > %1 , %arg1
87- %3 = and <2 x i32 > %arg0 , <i32 -256 , i32 -256 >
88- %4 = select <2 x i1 > %2 , <2 x i8 > <i8 0 , i8 0 >, <2 x i8 > %1
89- %5 = select <2 x i1 > %2 , <2 x i32 > <i32 0 , i32 0 >, <2 x i32 > %3
90- %6 = zext <2 x i8 > %4 to <2 x i32 >
91- %7 = or <2 x i32 > %5 , %6
92- ret <2 x i32 > %7
85+ %low = trunc <2 x i32 > %arg0 to <2 x i8 >
86+ %is_low_arg1 = icmp eq <2 x i8 > %low , %arg1
87+ %high = and <2 x i32 > %arg0 , <i32 -256 , i32 -256 >
88+ %select_low = select <2 x i1 > %is_low_arg1 , <2 x i8 > <i8 0 , i8 0 >, <2 x i8 > %low
89+ %select_high = select <2 x i1 > %is_low_arg1 , <2 x i32 > <i32 0 , i32 0 >, <2 x i32 > %high
90+ %zext_low = zext <2 x i8 > %select_low to <2 x i32 >
91+ %recomb = or <2 x i32 > %select_high , %zext_low
92+ ret <2 x i32 > %recomb
93+ }
94+
95+ ; negative test
96+ define i40 @select_reconstruction_impure_i16_mask_and (i40 %arg0 ) {
97+ ; CHECK-LABEL: define i40 @select_reconstruction_impure_i16_mask_and(
98+ ; CHECK-SAME: i40 [[ARG0:%.*]]) {
99+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[ARG0]] to i16
100+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i16 [[TMP1]], 2
101+ ; CHECK-NEXT: [[TMP3:%.*]] = and i40 [[ARG0]], 180
102+ ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]]
103+ ; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP3]]
104+ ; CHECK-NEXT: [[TMP6:%.*]] = zext i16 [[TMP4]] to i40
105+ ; CHECK-NEXT: [[TMP7:%.*]] = and i40 [[TMP5]], [[TMP6]]
106+ ; CHECK-NEXT: ret i40 [[TMP7]]
107+ ;
108+ %low = trunc i40 %arg0 to i16
109+ %is_low_two = icmp eq i16 %low , 2
110+ %high = and i40 %arg0 , -65356
111+ %select_low = select i1 %is_low_two , i16 0 , i16 %low
112+ %select_high = select i1 %is_low_two , i40 0 , i40 %high
113+ %zext_low = zext i16 %select_low to i40
114+ %recomb = and i40 %select_high , %zext_low
115+ ret i40 %recomb
93116}
0 commit comments