|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter-out-after "^for.body:" --filter-out-after "^while.body:" |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
2 | 2 | ; RUN: opt -S -hints-allow-reordering=false -passes=loop-vectorize -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue \
|
3 | 3 | ; RUN: < %s | FileCheck %s --check-prefix=CHECK
|
4 | 4 | ; RUN: opt -S -hints-allow-reordering=false -passes=loop-vectorize -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue \
|
@@ -49,6 +49,17 @@ define i32 @add_reduction_i32(ptr %ptr, i64 %n) #0 {
|
49 | 49 | ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP19]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
|
50 | 50 | ; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
|
51 | 51 | ; CHECK: while.body:
|
| 52 | +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] |
| 53 | +; CHECK-NEXT: [[RED:%.*]] = phi i32 [ [[RED_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ] |
| 54 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[INDEX]] |
| 55 | +; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[GEP]], align 4 |
| 56 | +; CHECK-NEXT: [[RED_NEXT]] = add i32 [[RED]], [[VAL]] |
| 57 | +; CHECK-NEXT: [[INDEX_NEXT]] = add nsw i64 [[INDEX]], 1 |
| 58 | +; CHECK-NEXT: [[CMP10:%.*]] = icmp ult i64 [[INDEX_NEXT]], [[N]] |
| 59 | +; CHECK-NEXT: br i1 [[CMP10]], label [[WHILE_BODY]], label [[WHILE_END_LOOPEXIT]], !llvm.loop [[LOOP3:![0-9]+]] |
| 60 | +; CHECK: while.end.loopexit: |
| 61 | +; CHECK-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi i32 [ [[RED_NEXT]], [[WHILE_BODY]] ], [ [[TMP19]], [[MIDDLE_BLOCK]] ] |
| 62 | +; CHECK-NEXT: ret i32 [[RED_NEXT_LCSSA]] |
52 | 63 | ;
|
53 | 64 | ; CHECK-IN-LOOP-LABEL: @add_reduction_i32(
|
54 | 65 | ; CHECK-IN-LOOP-NEXT: entry:
|
@@ -92,6 +103,17 @@ define i32 @add_reduction_i32(ptr %ptr, i64 %n) #0 {
|
92 | 103 | ; CHECK-IN-LOOP-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP15]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
|
93 | 104 | ; CHECK-IN-LOOP-NEXT: br label [[WHILE_BODY:%.*]]
|
94 | 105 | ; CHECK-IN-LOOP: while.body:
|
| 106 | +; CHECK-IN-LOOP-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] |
| 107 | +; CHECK-IN-LOOP-NEXT: [[RED:%.*]] = phi i32 [ [[RED_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ] |
| 108 | +; CHECK-IN-LOOP-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[INDEX]] |
| 109 | +; CHECK-IN-LOOP-NEXT: [[VAL:%.*]] = load i32, ptr [[GEP]], align 4 |
| 110 | +; CHECK-IN-LOOP-NEXT: [[RED_NEXT]] = add i32 [[RED]], [[VAL]] |
| 111 | +; CHECK-IN-LOOP-NEXT: [[INDEX_NEXT]] = add nsw i64 [[INDEX]], 1 |
| 112 | +; CHECK-IN-LOOP-NEXT: [[CMP10:%.*]] = icmp ult i64 [[INDEX_NEXT]], [[N]] |
| 113 | +; CHECK-IN-LOOP-NEXT: br i1 [[CMP10]], label [[WHILE_BODY]], label [[WHILE_END_LOOPEXIT]], !llvm.loop [[LOOP3:![0-9]+]] |
| 114 | +; CHECK-IN-LOOP: while.end.loopexit: |
| 115 | +; CHECK-IN-LOOP-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi i32 [ [[RED_NEXT]], [[WHILE_BODY]] ], [ [[TMP15]], [[MIDDLE_BLOCK]] ] |
| 116 | +; CHECK-IN-LOOP-NEXT: ret i32 [[RED_NEXT_LCSSA]] |
95 | 117 | ;
|
96 | 118 | entry:
|
97 | 119 | br label %while.body
|
@@ -152,6 +174,17 @@ define float @add_reduction_f32(ptr %ptr, i64 %n) #0 {
|
152 | 174 | ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP14]], [[MIDDLE_BLOCK]] ], [ 0.000000e+00, [[ENTRY]] ]
|
153 | 175 | ; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
|
154 | 176 | ; CHECK: while.body:
|
| 177 | +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] |
| 178 | +; CHECK-NEXT: [[RED:%.*]] = phi float [ [[RED_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ] |
| 179 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr float, ptr [[PTR]], i64 [[INDEX]] |
| 180 | +; CHECK-NEXT: [[VAL:%.*]] = load float, ptr [[GEP]], align 4 |
| 181 | +; CHECK-NEXT: [[RED_NEXT]] = fadd float [[RED]], [[VAL]] |
| 182 | +; CHECK-NEXT: [[INDEX_NEXT]] = add nsw i64 [[INDEX]], 1 |
| 183 | +; CHECK-NEXT: [[CMP10:%.*]] = icmp ult i64 [[INDEX_NEXT]], [[N]] |
| 184 | +; CHECK-NEXT: br i1 [[CMP10]], label [[WHILE_BODY]], label [[WHILE_END_LOOPEXIT]], !llvm.loop [[LOOP5:![0-9]+]] |
| 185 | +; CHECK: while.end.loopexit: |
| 186 | +; CHECK-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi float [ [[RED_NEXT]], [[WHILE_BODY]] ], [ [[TMP14]], [[MIDDLE_BLOCK]] ] |
| 187 | +; CHECK-NEXT: ret float [[RED_NEXT_LCSSA]] |
155 | 188 | ;
|
156 | 189 | ; CHECK-IN-LOOP-LABEL: @add_reduction_f32(
|
157 | 190 | ; CHECK-IN-LOOP-NEXT: entry:
|
@@ -194,6 +227,17 @@ define float @add_reduction_f32(ptr %ptr, i64 %n) #0 {
|
194 | 227 | ; CHECK-IN-LOOP-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP14]], [[MIDDLE_BLOCK]] ], [ 0.000000e+00, [[ENTRY]] ]
|
195 | 228 | ; CHECK-IN-LOOP-NEXT: br label [[WHILE_BODY:%.*]]
|
196 | 229 | ; CHECK-IN-LOOP: while.body:
|
| 230 | +; CHECK-IN-LOOP-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] |
| 231 | +; CHECK-IN-LOOP-NEXT: [[RED:%.*]] = phi float [ [[RED_NEXT:%.*]], [[WHILE_BODY]] ], [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ] |
| 232 | +; CHECK-IN-LOOP-NEXT: [[GEP:%.*]] = getelementptr float, ptr [[PTR]], i64 [[INDEX]] |
| 233 | +; CHECK-IN-LOOP-NEXT: [[VAL:%.*]] = load float, ptr [[GEP]], align 4 |
| 234 | +; CHECK-IN-LOOP-NEXT: [[RED_NEXT]] = fadd float [[RED]], [[VAL]] |
| 235 | +; CHECK-IN-LOOP-NEXT: [[INDEX_NEXT]] = add nsw i64 [[INDEX]], 1 |
| 236 | +; CHECK-IN-LOOP-NEXT: [[CMP10:%.*]] = icmp ult i64 [[INDEX_NEXT]], [[N]] |
| 237 | +; CHECK-IN-LOOP-NEXT: br i1 [[CMP10]], label [[WHILE_BODY]], label [[WHILE_END_LOOPEXIT]], !llvm.loop [[LOOP5:![0-9]+]] |
| 238 | +; CHECK-IN-LOOP: while.end.loopexit: |
| 239 | +; CHECK-IN-LOOP-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi float [ [[RED_NEXT]], [[WHILE_BODY]] ], [ [[TMP14]], [[MIDDLE_BLOCK]] ] |
| 240 | +; CHECK-IN-LOOP-NEXT: ret float [[RED_NEXT_LCSSA]] |
197 | 241 | ;
|
198 | 242 | entry:
|
199 | 243 | br label %while.body
|
@@ -260,6 +304,25 @@ define i32 @cond_xor_reduction(ptr noalias %a, ptr noalias %cond, i64 %N) #0 {
|
260 | 304 | ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP25]], [[MIDDLE_BLOCK]] ], [ 7, [[ENTRY]] ]
|
261 | 305 | ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
262 | 306 | ; CHECK: for.body:
|
| 307 | +; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_INC:%.*]] ] |
| 308 | +; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[RES:%.*]], [[FOR_INC]] ] |
| 309 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[COND]], i64 [[IV]] |
| 310 | +; CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 |
| 311 | +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP26]], 5 |
| 312 | +; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[FOR_INC]] |
| 313 | +; CHECK: if.then: |
| 314 | +; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IV]] |
| 315 | +; CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4 |
| 316 | +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[RDX]], [[TMP27]] |
| 317 | +; CHECK-NEXT: br label [[FOR_INC]] |
| 318 | +; CHECK: for.inc: |
| 319 | +; CHECK-NEXT: [[RES]] = phi i32 [ [[RDX]], [[FOR_BODY]] ], [ [[XOR]], [[IF_THEN]] ] |
| 320 | +; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1 |
| 321 | +; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] |
| 322 | +; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]] |
| 323 | +; CHECK: for.end: |
| 324 | +; CHECK-NEXT: [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_INC]] ], [ [[TMP25]], [[MIDDLE_BLOCK]] ] |
| 325 | +; CHECK-NEXT: ret i32 [[RES_LCSSA]] |
263 | 326 | ;
|
264 | 327 | ; CHECK-IN-LOOP-LABEL: @cond_xor_reduction(
|
265 | 328 | ; CHECK-IN-LOOP-NEXT: entry:
|
@@ -307,6 +370,25 @@ define i32 @cond_xor_reduction(ptr noalias %a, ptr noalias %cond, i64 %N) #0 {
|
307 | 370 | ; CHECK-IN-LOOP-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP19]], [[MIDDLE_BLOCK]] ], [ 7, [[ENTRY]] ]
|
308 | 371 | ; CHECK-IN-LOOP-NEXT: br label [[FOR_BODY:%.*]]
|
309 | 372 | ; CHECK-IN-LOOP: for.body:
|
| 373 | +; CHECK-IN-LOOP-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[FOR_INC:%.*]] ] |
| 374 | +; CHECK-IN-LOOP-NEXT: [[RDX:%.*]] = phi i32 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[RES:%.*]], [[FOR_INC]] ] |
| 375 | +; CHECK-IN-LOOP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[COND]], i64 [[IV]] |
| 376 | +; CHECK-IN-LOOP-NEXT: [[TMP24:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 |
| 377 | +; CHECK-IN-LOOP-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP24]], 5 |
| 378 | +; CHECK-IN-LOOP-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[FOR_INC]] |
| 379 | +; CHECK-IN-LOOP: if.then: |
| 380 | +; CHECK-IN-LOOP-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IV]] |
| 381 | +; CHECK-IN-LOOP-NEXT: [[TMP25:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4 |
| 382 | +; CHECK-IN-LOOP-NEXT: [[XOR:%.*]] = xor i32 [[RDX]], [[TMP25]] |
| 383 | +; CHECK-IN-LOOP-NEXT: br label [[FOR_INC]] |
| 384 | +; CHECK-IN-LOOP: for.inc: |
| 385 | +; CHECK-IN-LOOP-NEXT: [[RES]] = phi i32 [ [[RDX]], [[FOR_BODY]] ], [ [[XOR]], [[IF_THEN]] ] |
| 386 | +; CHECK-IN-LOOP-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1 |
| 387 | +; CHECK-IN-LOOP-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] |
| 388 | +; CHECK-IN-LOOP-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]] |
| 389 | +; CHECK-IN-LOOP: for.end: |
| 390 | +; CHECK-IN-LOOP-NEXT: [[RES_LCSSA:%.*]] = phi i32 [ [[RES]], [[FOR_INC]] ], [ [[TMP19]], [[MIDDLE_BLOCK]] ] |
| 391 | +; CHECK-IN-LOOP-NEXT: ret i32 [[RES_LCSSA]] |
310 | 392 | ;
|
311 | 393 | entry:
|
312 | 394 | br label %for.body
|
|
0 commit comments