Skip to content

Commit 074abdc

Browse files
committed
[InstCombine] Add tests for and of icmp ne zero and icmp uge (NFC)
Partially based on the conjugated or tests.
1 parent 9c00e3d commit 074abdc

File tree

1 file changed

+178
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+178
-0
lines changed

llvm/test/Transforms/InstCombine/icmp.ll

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,6 +2256,183 @@ define <2 x i1> @or_icmp_ne_A_0_icmp_ne_B_0_undef(<2 x i64> %a, <2 x i64> %b) {
22562256
ret <2 x i1> %3
22572257
}
22582258

2259+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B(i64 %a, i64 %b) {
2260+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B(
2261+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2262+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2263+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2264+
; CHECK-NEXT: ret i1 [[TMP3]]
2265+
;
2266+
%1 = icmp ne i64 %b, 0
2267+
%2 = icmp uge i64 %a, %b
2268+
%3 = and i1 %1, %2
2269+
ret i1 %3
2270+
}
2271+
2272+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_commuted1(i64 %a, i64 %b) {
2273+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_commuted1(
2274+
; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]]
2275+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[B]], 0
2276+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2277+
; CHECK-NEXT: ret i1 [[TMP3]]
2278+
;
2279+
%1 = icmp uge i64 %a, %b
2280+
%2 = icmp ne i64 %b, 0
2281+
%3 = and i1 %1, %2
2282+
ret i1 %3
2283+
}
2284+
2285+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_commuted2(i64 %a, i64 %b) {
2286+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_commuted2(
2287+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2288+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ule i64 [[B]], [[A:%.*]]
2289+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2290+
; CHECK-NEXT: ret i1 [[TMP3]]
2291+
;
2292+
%1 = icmp ne i64 %b, 0
2293+
%2 = icmp ule i64 %b, %a
2294+
%3 = and i1 %1, %2
2295+
ret i1 %3
2296+
}
2297+
2298+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use1(i64 %a, i64 %b) {
2299+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use1(
2300+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2301+
; CHECK-NEXT: call void @use_i1(i1 [[TMP1]])
2302+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2303+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2304+
; CHECK-NEXT: ret i1 [[TMP3]]
2305+
;
2306+
%1 = icmp ne i64 %b, 0
2307+
call void @use_i1(i1 %1)
2308+
%2 = icmp uge i64 %a, %b
2309+
%3 = and i1 %1, %2
2310+
ret i1 %3
2311+
}
2312+
2313+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use2(i64 %a, i64 %b) {
2314+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use2(
2315+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2316+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2317+
; CHECK-NEXT: call void @use_i1(i1 [[TMP2]])
2318+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2319+
; CHECK-NEXT: ret i1 [[TMP3]]
2320+
;
2321+
%1 = icmp ne i64 %b, 0
2322+
%2 = icmp uge i64 %a, %b
2323+
call void @use_i1(i1 %2)
2324+
%3 = and i1 %1, %2
2325+
ret i1 %3
2326+
}
2327+
2328+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_extra_use3(i64 %a, i64 %b) {
2329+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_extra_use3(
2330+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2331+
; CHECK-NEXT: call void @use_i1(i1 [[TMP1]])
2332+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2333+
; CHECK-NEXT: call void @use_i1(i1 [[TMP2]])
2334+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2335+
; CHECK-NEXT: ret i1 [[TMP3]]
2336+
;
2337+
%1 = icmp ne i64 %b, 0
2338+
call void @use_i1(i1 %1)
2339+
%2 = icmp uge i64 %a, %b
2340+
call void @use_i1(i1 %2)
2341+
%3 = and i1 %1, %2
2342+
ret i1 %3
2343+
}
2344+
2345+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred1(i64 %a, i64 %b) {
2346+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred1(
2347+
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i64 [[B:%.*]], 0
2348+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2349+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2350+
; CHECK-NEXT: ret i1 [[TMP3]]
2351+
;
2352+
%1 = icmp sgt i64 %b, 0
2353+
%2 = icmp uge i64 %a, %b
2354+
%3 = and i1 %1, %2
2355+
ret i1 %3
2356+
}
2357+
2358+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred2(i64 %a, i64 %b) {
2359+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_pred2(
2360+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2361+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt i64 [[A:%.*]], [[B]]
2362+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2363+
; CHECK-NEXT: ret i1 [[TMP3]]
2364+
;
2365+
%1 = icmp ne i64 %b, 0
2366+
%2 = icmp ugt i64 %a, %b
2367+
%3 = and i1 %1, %2
2368+
ret i1 %3
2369+
}
2370+
2371+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op1(i64 %a, i64 %b) {
2372+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op1(
2373+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 1
2374+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2375+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2376+
; CHECK-NEXT: ret i1 [[TMP3]]
2377+
;
2378+
%1 = icmp ne i64 %b, 1
2379+
%2 = icmp uge i64 %a, %b
2380+
%3 = and i1 %1, %2
2381+
ret i1 %3
2382+
}
2383+
2384+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op2(i64 %a, i64 %b, i64 %c) {
2385+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_wrong_op2(
2386+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2387+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[C:%.*]], [[B]]
2388+
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]]
2389+
; CHECK-NEXT: ret i1 [[TMP3]]
2390+
;
2391+
%1 = icmp ne i64 %b, 0
2392+
%2 = icmp uge i64 %c, %b
2393+
%3 = and i1 %1, %2
2394+
ret i1 %3
2395+
}
2396+
2397+
define i1 @and_icmp_ne_B_0_icmp_uge_A_B_logical(i64 %a, i64 %b) {
2398+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_logical(
2399+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[B:%.*]], 0
2400+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[A:%.*]], [[B]]
2401+
; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false
2402+
; CHECK-NEXT: ret i1 [[TMP3]]
2403+
;
2404+
%1 = icmp ne i64 %b, 0
2405+
%2 = icmp uge i64 %a, %b
2406+
%3 = select i1 %1, i1 %2, i1 false
2407+
ret i1 %3
2408+
}
2409+
2410+
define <2 x i1> @and_icmp_ne_B_0_icmp_uge_A_B_uniform(<2 x i64> %a, <2 x i64> %b) {
2411+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_uniform(
2412+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[B:%.*]], zeroinitializer
2413+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge <2 x i64> [[A:%.*]], [[B]]
2414+
; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i1> [[TMP1]], [[TMP2]]
2415+
; CHECK-NEXT: ret <2 x i1> [[TMP3]]
2416+
;
2417+
%1 = icmp ne <2 x i64> %b, zeroinitializer
2418+
%2 = icmp uge <2 x i64> %a, %b
2419+
%3 = and <2 x i1> %1, %2
2420+
ret <2 x i1> %3
2421+
}
2422+
2423+
define <2 x i1> @and_icmp_ne_B_0_icmp_uge_A_B_undef(<2 x i64> %a, <2 x i64> %b) {
2424+
; CHECK-LABEL: @and_icmp_ne_B_0_icmp_uge_A_B_undef(
2425+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[B:%.*]], <i64 0, i64 undef>
2426+
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge <2 x i64> [[A:%.*]], [[B]]
2427+
; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i1> [[TMP1]], [[TMP2]]
2428+
; CHECK-NEXT: ret <2 x i1> [[TMP3]]
2429+
;
2430+
%1 = icmp ne <2 x i64> %b, <i64 0, i64 undef>
2431+
%2 = icmp uge <2 x i64> %a, %b
2432+
%3 = and <2 x i1> %1, %2
2433+
ret <2 x i1> %3
2434+
}
2435+
22592436
define i1 @icmp_add_ult_2(i32 %X) {
22602437
; CHECK-LABEL: @icmp_add_ult_2(
22612438
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2
@@ -3807,6 +3984,7 @@ define <4 x i1> @signbit_bitcast_fpext_vec_wrong_bitcast(<2 x half> %x) {
38073984
ret <4 x i1> %r
38083985
}
38093986

3987+
declare void @use_i1(i1)
38103988
declare void @use_i64(i64)
38113989

38123990
define i1 @signbit_bitcast_fpext_extra_use(float %x, i64* %p) {

0 commit comments

Comments
 (0)