Skip to content

Commit 29661fe

Browse files
committed
[InstCombine] add tests for logical-and / logical-or folds; NFC
1 parent 880b37f commit 29661fe

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

llvm/test/Transforms/InstCombine/select-safe-transforms.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,40 @@ define i1 @and_orn_cmp_1_logical(i32 %a, i32 %b, i1 %y) {
144144
ret i1 %and
145145
}
146146

147+
define i1 @and_orn_cmp_1_partial_logical(i32 %a, i32 %b, i1 %y) {
148+
; CHECK-LABEL: @and_orn_cmp_1_partial_logical(
149+
; CHECK-NEXT: [[X:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
150+
; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i32 [[A]], [[B]]
151+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_INV]], [[Y:%.*]]
152+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[X]], i1 [[OR]], i1 false
153+
; CHECK-NEXT: ret i1 [[AND]]
154+
;
155+
%x = icmp sgt i32 %a, %b
156+
%x_inv = icmp sle i32 %a, %b
157+
%or = or i1 %x_inv, %y
158+
%and = select i1 %x, i1 %or, i1 false
159+
ret i1 %and
160+
}
161+
162+
define i1 @and_orn_cmp_1_partial_logical_commute(i32 %a, i32 %b) {
163+
; CHECK-LABEL: @and_orn_cmp_1_partial_logical_commute(
164+
; CHECK-NEXT: [[Y:%.*]] = call i1 @gen1()
165+
; CHECK-NEXT: [[X:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
166+
; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i32 [[A]], [[B]]
167+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[Y]], [[X_INV]]
168+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[X]], i1 [[OR]], i1 false
169+
; CHECK-NEXT: ret i1 [[AND]]
170+
;
171+
%y = call i1 @gen1() ; thwart complexity-based canonicalization
172+
%x = icmp sgt i32 %a, %b
173+
%x_inv = icmp sle i32 %a, %b
174+
%or = or i1 %y, %x_inv
175+
%and = select i1 %x, i1 %or, i1 false
176+
ret i1 %and
177+
}
178+
179+
; TODO: This does not require poison-safe (select) logical-and.
180+
147181
define i1 @andn_or_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
148182
; CHECK-LABEL: @andn_or_cmp_2_logical(
149183
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
@@ -157,6 +191,47 @@ define i1 @andn_or_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
157191
ret i1 %and
158192
}
159193

194+
define i1 @andn_or_cmp_2_partial_logical(i16 %a, i16 %b, i1 %y) {
195+
; CHECK-LABEL: @andn_or_cmp_2_partial_logical(
196+
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
197+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_INV]], [[Y:%.*]]
198+
; CHECK-NEXT: ret i1 [[AND]]
199+
;
200+
%x = icmp sge i16 %a, %b
201+
%x_inv = icmp slt i16 %a, %b
202+
%or = or i1 %x, %y
203+
%and = select i1 %or, i1 %x_inv, i1 false
204+
ret i1 %and
205+
}
206+
207+
define i1 @andn_or_cmp_2_partial_logical_commute(i16 %a, i16 %b) {
208+
; CHECK-LABEL: @andn_or_cmp_2_partial_logical_commute(
209+
; CHECK-NEXT: [[Y:%.*]] = call i1 @gen1()
210+
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
211+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[Y]], [[X_INV]]
212+
; CHECK-NEXT: ret i1 [[AND]]
213+
;
214+
%y = call i1 @gen1() ; thwart complexity-based canonicalization
215+
%x = icmp sge i16 %a, %b
216+
%x_inv = icmp slt i16 %a, %b
217+
%or = or i1 %y, %x
218+
%and = select i1 %or, i1 %x_inv, i1 false
219+
ret i1 %and
220+
}
221+
222+
define <2 x i1> @not_logical_or2(i1 %b, <2 x i32> %a) {
223+
; CHECK-LABEL: @not_logical_or2(
224+
; CHECK-NEXT: [[COND:%.*]] = icmp ult <2 x i32> [[A:%.*]], <i32 3, i32 3>
225+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[B:%.*]], <2 x i1> [[COND]], <2 x i1> zeroinitializer
226+
; CHECK-NEXT: ret <2 x i1> [[AND]]
227+
;
228+
%cond = icmp ult <2 x i32> %a, <i32 3, i32 3>
229+
%implied = icmp slt <2 x i32> %a, <i32 -1, i32 -1>
230+
%or = select i1 %b, <2 x i1> <i1 true, i1 true>, <2 x i1> %implied
231+
%and = select <2 x i1> %or, <2 x i1> %cond, <2 x i1> zeroinitializer
232+
ret <2 x i1> %and
233+
}
234+
160235
define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) {
161236
; CHECK-LABEL: @bools_logical_commute0(
162237
; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]]
@@ -589,6 +664,23 @@ define i1 @orn_and_cmp_1_logical(i37 %a, i37 %b, i1 %y) {
589664
ret i1 %or
590665
}
591666

667+
define i1 @orn_and_cmp_1_partial_logical(i37 %a, i37 %b, i1 %y) {
668+
; CHECK-LABEL: @orn_and_cmp_1_partial_logical(
669+
; CHECK-NEXT: [[X:%.*]] = icmp sgt i37 [[A:%.*]], [[B:%.*]]
670+
; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i37 [[A]], [[B]]
671+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[X]], [[Y:%.*]]
672+
; CHECK-NEXT: [[OR:%.*]] = select i1 [[X_INV]], i1 true, i1 [[AND]]
673+
; CHECK-NEXT: ret i1 [[OR]]
674+
;
675+
%x = icmp sgt i37 %a, %b
676+
%x_inv = icmp sle i37 %a, %b
677+
%and = and i1 %y, %x
678+
%or = select i1 %x_inv, i1 true, i1 %and
679+
ret i1 %or
680+
}
681+
682+
; TODO: This does not require poison-safe (select) logical-or.
683+
592684
define i1 @orn_and_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
593685
; CHECK-LABEL: @orn_and_cmp_2_logical(
594686
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
@@ -601,3 +693,16 @@ define i1 @orn_and_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
601693
%or = select i1 %and, i1 true, i1 %x_inv
602694
ret i1 %or
603695
}
696+
697+
define i1 @orn_and_cmp_2_partial_logical(i16 %a, i16 %b, i1 %y) {
698+
; CHECK-LABEL: @orn_and_cmp_2_partial_logical(
699+
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
700+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_INV]], [[Y:%.*]]
701+
; CHECK-NEXT: ret i1 [[OR]]
702+
;
703+
%x = icmp sge i16 %a, %b
704+
%x_inv = icmp slt i16 %a, %b
705+
%and = and i1 %y, %x
706+
%or = select i1 %and, i1 true, i1 %x_inv
707+
ret i1 %or
708+
}

0 commit comments

Comments
 (0)