Skip to content

Commit 9542631

Browse files
committed
address review comments
- only apply on OR reconstruction - rename values in test
1 parent 6f0a946 commit 9542631

File tree

2 files changed

+66
-40
lines changed

2 files changed

+66
-40
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,9 @@ Value *InstCombinerImpl::SimplifySelectsFeedingBinaryOp(BinaryOperator &I,
13551355
// -> (Cond ? (V1 op zext V2) : ((X & Mask) op zext trunc X))
13561356
auto foldReconstruction = [&](Value *V1, Value *Masked,
13571357
Value *ZExtSel) -> Value * {
1358+
if (Opcode != Instruction::Or)
1359+
return nullptr;
1360+
13581361
Value *X;
13591362
if (!match(Masked, m_OneUse(m_And(m_Value(X), m_Constant()))))
13601363
return nullptr;

llvm/test/Transforms/InstCombine/select-reconstruction.ll

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2222
define 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

4040
define 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

5959
define 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

7777
define <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

Comments
 (0)