Skip to content

Commit ae15931

Browse files
committed
[CodeGenPrepare][X86] Add test for or disjoint offset; NFC
1 parent 69a0af7 commit ae15931

File tree

2 files changed

+110
-20
lines changed

2 files changed

+110
-20
lines changed

llvm/test/CodeGen/X86/fold-loop-of-urem.ll

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,8 +1245,8 @@ for.body:
12451245
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
12461246
}
12471247

1248-
define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {
1249-
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw:
1248+
define void @simple_urem_to_sel_non_zero_start_through_dis_or(i32 %N, i32 %rem_amt_in) nounwind {
1249+
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_dis_or:
12501250
; CHECK: # %bb.0: # %entry
12511251
; CHECK-NEXT: cmpl $3, %edi
12521252
; CHECK-NEXT: jb .LBB22_4
@@ -1258,7 +1258,7 @@ define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32
12581258
; CHECK-NEXT: movl %edi, %r14d
12591259
; CHECK-NEXT: orl $16, %ebx
12601260
; CHECK-NEXT: negl %r14d
1261-
; CHECK-NEXT: movl $7, %r15d
1261+
; CHECK-NEXT: movl $10, %r15d
12621262
; CHECK-NEXT: .p2align 4, 0x90
12631263
; CHECK-NEXT: .LBB22_2: # %for.body
12641264
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
@@ -1270,7 +1270,7 @@ define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32
12701270
; CHECK-NEXT: leal 1(%r14,%r15), %eax
12711271
; CHECK-NEXT: movl %r15d, %ecx
12721272
; CHECK-NEXT: incl %ecx
1273-
; CHECK-NEXT: cmpl $5, %eax
1273+
; CHECK-NEXT: cmpl $8, %eax
12741274
; CHECK-NEXT: movl %ecx, %r15d
12751275
; CHECK-NEXT: jne .LBB22_2
12761276
; CHECK-NEXT: # %bb.3:
@@ -1289,16 +1289,16 @@ for.cond.cleanup:
12891289

12901290
for.body:
12911291
%i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
1292-
%i_with_off = add i32 %i.04, 5
1292+
%i_with_off = or disjoint i32 %i.04, 8
12931293
%rem = urem i32 %i_with_off, %rem_amt
12941294
tail call void @use.i32(i32 %rem)
12951295
%inc = add nuw i32 %i.04, 1
12961296
%exitcond.not = icmp eq i32 %inc, %N
12971297
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
12981298
}
12991299

1300-
define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {
1301-
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem:
1300+
define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {
1301+
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw:
13021302
; CHECK: # %bb.0: # %entry
13031303
; CHECK-NEXT: cmpl $3, %edi
13041304
; CHECK-NEXT: jb .LBB23_4
@@ -1308,6 +1308,7 @@ define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(
13081308
; CHECK-NEXT: pushq %rbx
13091309
; CHECK-NEXT: movl %esi, %ebx
13101310
; CHECK-NEXT: movl %edi, %r14d
1311+
; CHECK-NEXT: orl $16, %ebx
13111312
; CHECK-NEXT: negl %r14d
13121313
; CHECK-NEXT: movl $7, %r15d
13131314
; CHECK-NEXT: .p2align 4, 0x90
@@ -1330,6 +1331,57 @@ define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(
13301331
; CHECK-NEXT: popq %r15
13311332
; CHECK-NEXT: .LBB23_4: # %for.cond.cleanup
13321333
; CHECK-NEXT: retq
1334+
entry:
1335+
%rem_amt = or i32 %rem_amt_in, 16
1336+
%cmp3.not = icmp ult i32 %N, 3
1337+
br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1338+
1339+
for.cond.cleanup:
1340+
ret void
1341+
1342+
for.body:
1343+
%i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
1344+
%i_with_off = add i32 %i.04, 5
1345+
%rem = urem i32 %i_with_off, %rem_amt
1346+
tail call void @use.i32(i32 %rem)
1347+
%inc = add nuw i32 %i.04, 1
1348+
%exitcond.not = icmp eq i32 %inc, %N
1349+
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1350+
}
1351+
1352+
define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {
1353+
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem:
1354+
; CHECK: # %bb.0: # %entry
1355+
; CHECK-NEXT: cmpl $3, %edi
1356+
; CHECK-NEXT: jb .LBB24_4
1357+
; CHECK-NEXT: # %bb.1: # %for.body.preheader
1358+
; CHECK-NEXT: pushq %r15
1359+
; CHECK-NEXT: pushq %r14
1360+
; CHECK-NEXT: pushq %rbx
1361+
; CHECK-NEXT: movl %esi, %ebx
1362+
; CHECK-NEXT: movl %edi, %r14d
1363+
; CHECK-NEXT: negl %r14d
1364+
; CHECK-NEXT: movl $7, %r15d
1365+
; CHECK-NEXT: .p2align 4, 0x90
1366+
; CHECK-NEXT: .LBB24_2: # %for.body
1367+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
1368+
; CHECK-NEXT: movl %r15d, %eax
1369+
; CHECK-NEXT: xorl %edx, %edx
1370+
; CHECK-NEXT: divl %ebx
1371+
; CHECK-NEXT: movl %edx, %edi
1372+
; CHECK-NEXT: callq use.i32@PLT
1373+
; CHECK-NEXT: leal 1(%r14,%r15), %eax
1374+
; CHECK-NEXT: movl %r15d, %ecx
1375+
; CHECK-NEXT: incl %ecx
1376+
; CHECK-NEXT: cmpl $5, %eax
1377+
; CHECK-NEXT: movl %ecx, %r15d
1378+
; CHECK-NEXT: jne .LBB24_2
1379+
; CHECK-NEXT: # %bb.3:
1380+
; CHECK-NEXT: popq %rbx
1381+
; CHECK-NEXT: popq %r14
1382+
; CHECK-NEXT: popq %r15
1383+
; CHECK-NEXT: .LBB24_4: # %for.cond.cleanup
1384+
; CHECK-NEXT: retq
13331385
entry:
13341386
%cmp3.not = icmp ult i32 %N, 3
13351387
br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
@@ -1357,14 +1409,14 @@ define void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt,
13571409
; CHECK-NEXT: pushq %rbx
13581410
; CHECK-NEXT: movl %edi, %ebp
13591411
; CHECK-NEXT: subl %edx, %ebp
1360-
; CHECK-NEXT: jbe .LBB24_3
1412+
; CHECK-NEXT: jbe .LBB25_3
13611413
; CHECK-NEXT: # %bb.1: # %for.body.preheader
13621414
; CHECK-NEXT: movl %esi, %ebx
13631415
; CHECK-NEXT: xorl %r15d, %r15d
13641416
; CHECK-NEXT: xorl %r14d, %r14d
13651417
; CHECK-NEXT: xorl %r12d, %r12d
13661418
; CHECK-NEXT: .p2align 4, 0x90
1367-
; CHECK-NEXT: .LBB24_2: # %for.body
1419+
; CHECK-NEXT: .LBB25_2: # %for.body
13681420
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
13691421
; CHECK-NEXT: movl %r14d, %edi
13701422
; CHECK-NEXT: callq use.i32@PLT
@@ -1373,8 +1425,8 @@ define void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt,
13731425
; CHECK-NEXT: cmovel %r15d, %r14d
13741426
; CHECK-NEXT: incl %r12d
13751427
; CHECK-NEXT: cmpl %r12d, %ebp
1376-
; CHECK-NEXT: jne .LBB24_2
1377-
; CHECK-NEXT: .LBB24_3: # %for.cond.cleanup
1428+
; CHECK-NEXT: jne .LBB25_2
1429+
; CHECK-NEXT: .LBB25_3: # %for.cond.cleanup
13781430
; CHECK-NEXT: popq %rbx
13791431
; CHECK-NEXT: popq %r12
13801432
; CHECK-NEXT: popq %r14
@@ -1402,7 +1454,7 @@ define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i3
14021454
; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_sub_no_simplfy:
14031455
; CHECK: # %bb.0: # %entry
14041456
; CHECK-NEXT: cmpl %edx, %edi
1405-
; CHECK-NEXT: jbe .LBB25_4
1457+
; CHECK-NEXT: jbe .LBB26_4
14061458
; CHECK-NEXT: # %bb.1: # %for.body.preheader
14071459
; CHECK-NEXT: pushq %r15
14081460
; CHECK-NEXT: pushq %r14
@@ -1413,7 +1465,7 @@ define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i3
14131465
; CHECK-NEXT: negl %r14d
14141466
; CHECK-NEXT: addl $-2, %r15d
14151467
; CHECK-NEXT: .p2align 4, 0x90
1416-
; CHECK-NEXT: .LBB25_2: # %for.body
1468+
; CHECK-NEXT: .LBB26_2: # %for.body
14171469
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
14181470
; CHECK-NEXT: movl %r15d, %eax
14191471
; CHECK-NEXT: xorl %edx, %edx
@@ -1425,12 +1477,12 @@ define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i3
14251477
; CHECK-NEXT: incl %ecx
14261478
; CHECK-NEXT: cmpl $-2, %eax
14271479
; CHECK-NEXT: movl %ecx, %r15d
1428-
; CHECK-NEXT: jne .LBB25_2
1480+
; CHECK-NEXT: jne .LBB26_2
14291481
; CHECK-NEXT: # %bb.3:
14301482
; CHECK-NEXT: popq %rbx
14311483
; CHECK-NEXT: popq %r14
14321484
; CHECK-NEXT: popq %r15
1433-
; CHECK-NEXT: .LBB25_4: # %for.cond.cleanup
1485+
; CHECK-NEXT: .LBB26_4: # %for.cond.cleanup
14341486
; CHECK-NEXT: retq
14351487
entry:
14361488
%cmp3.not = icmp ule i32 %N, %start

llvm/test/Transforms/CodeGenPrepare/X86/fold-loop-of-urem.ll

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -319,20 +319,20 @@ for.body.tail:
319319
define void @simple_urem_to_sel_vec(<2 x i64> %rem_amt) nounwind {
320320
; CHECK-LABEL: define void @simple_urem_to_sel_vec(
321321
; CHECK-SAME: <2 x i64> [[REM_AMT:%.*]]) #[[ATTR0]] {
322-
; CHECK-NEXT: [[FOR_COND_CLEANUP:.*]]:
322+
; CHECK-NEXT: [[ENTRY:.*]]:
323323
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
324-
; CHECK: [[ENTRY:.*]]:
324+
; CHECK: [[FOR_COND_CLEANUP:.*]]:
325325
; CHECK-NEXT: ret void
326326
; CHECK: [[FOR_BODY]]:
327-
; CHECK-NEXT: [[REM:%.*]] = phi <2 x i64> [ zeroinitializer, %[[FOR_COND_CLEANUP]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
328-
; CHECK-NEXT: [[I_04:%.*]] = phi <2 x i64> [ [[INC:%.*]], %[[FOR_BODY]] ], [ zeroinitializer, %[[FOR_COND_CLEANUP]] ]
327+
; CHECK-NEXT: [[REM:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
328+
; CHECK-NEXT: [[I_04:%.*]] = phi <2 x i64> [ [[INC:%.*]], %[[FOR_BODY]] ], [ zeroinitializer, %[[ENTRY]] ]
329329
; CHECK-NEXT: tail call void @use.2xi64(<2 x i64> [[REM]])
330330
; CHECK-NEXT: [[TMP1:%.*]] = add nuw <2 x i64> [[REM]], <i64 1, i64 1>
331331
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], [[REM_AMT]]
332332
; CHECK-NEXT: [[TMP3]] = select <2 x i1> [[TMP2]], <2 x i64> zeroinitializer, <2 x i64> [[TMP1]]
333333
; CHECK-NEXT: [[INC]] = add nuw <2 x i64> [[I_04]], <i64 1, i64 1>
334334
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = call i1 @get.i1()
335-
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[ENTRY]], label %[[FOR_BODY]]
335+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
336336
;
337337
entry:
338338
br label %for.body
@@ -918,6 +918,44 @@ for.body:
918918
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
919919
}
920920

921+
define void @simple_urem_to_sel_non_zero_start_through_dis_or(i32 %N, i32 %rem_amt_in) nounwind {
922+
; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_dis_or(
923+
; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
924+
; CHECK-NEXT: [[ENTRY:.*:]]
925+
; CHECK-NEXT: [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
926+
; CHECK-NEXT: [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
927+
; CHECK-NEXT: br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
928+
; CHECK: [[FOR_BODY_PREHEADER]]:
929+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
930+
; CHECK: [[FOR_COND_CLEANUP]]:
931+
; CHECK-NEXT: ret void
932+
; CHECK: [[FOR_BODY]]:
933+
; CHECK-NEXT: [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
934+
; CHECK-NEXT: [[I_WITH_OFF:%.*]] = or disjoint i32 [[I_04]], 8
935+
; CHECK-NEXT: [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
936+
; CHECK-NEXT: tail call void @use.i32(i32 [[REM]])
937+
; CHECK-NEXT: [[INC]] = add nuw i32 [[I_04]], 1
938+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
939+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
940+
;
941+
entry:
942+
%rem_amt = or i32 %rem_amt_in, 16
943+
%cmp3.not = icmp ult i32 %N, 3
944+
br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
945+
946+
for.cond.cleanup:
947+
ret void
948+
949+
for.body:
950+
%i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
951+
%i_with_off = or disjoint i32 %i.04, 8
952+
%rem = urem i32 %i_with_off, %rem_amt
953+
tail call void @use.i32(i32 %rem)
954+
%inc = add nuw i32 %i.04, 1
955+
%exitcond.not = icmp eq i32 %inc, %N
956+
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
957+
}
958+
921959
define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {
922960
; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(
923961
; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {

0 commit comments

Comments
 (0)