|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
|
2 |
| -; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization | FileCheck %s |
| 2 | +; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization -force-vector-width=4 | FileCheck %s |
3 | 3 |
|
4 | 4 | declare void @init_mem(ptr, i64);
|
5 | 5 |
|
@@ -527,24 +527,50 @@ define i64 @diff_exit_block_pre_inc_use2() {
|
527 | 527 | ; CHECK-NEXT: [[P2:%.*]] = alloca [1024 x i8], align 1
|
528 | 528 | ; CHECK-NEXT: call void @init_mem(ptr [[P1]], i64 1024)
|
529 | 529 | ; CHECK-NEXT: call void @init_mem(ptr [[P2]], i64 1024)
|
| 530 | +; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] |
| 531 | +; CHECK: vector.ph: |
530 | 532 | ; CHECK-NEXT: br label [[LOOP:%.*]]
|
| 533 | +; CHECK: vector.body: |
| 534 | +; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT3:%.*]], [[LOOP]] ] |
| 535 | +; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]] |
| 536 | +; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[OFFSET_IDX]], 0 |
| 537 | +; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[TMP0]] |
| 538 | +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i32 0 |
| 539 | +; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP2]], align 1 |
| 540 | +; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[TMP0]] |
| 541 | +; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[TMP3]], i32 0 |
| 542 | +; CHECK-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1 |
| 543 | +; CHECK-NEXT: [[TMP5:%.*]] = icmp eq <4 x i8> [[WIDE_LOAD]], [[WIDE_LOAD2]] |
| 544 | +; CHECK-NEXT: [[INDEX_NEXT3]] = add nuw i64 [[INDEX1]], 4 |
| 545 | +; CHECK-NEXT: [[TMP6:%.*]] = xor <4 x i1> [[TMP5]], splat (i1 true) |
| 546 | +; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]]) |
| 547 | +; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64 |
| 548 | +; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]] |
| 549 | +; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[LOOP]], !llvm.loop [[LOOP0:![0-9]+]] |
| 550 | +; CHECK: middle.split: |
| 551 | +; CHECK-NEXT: br i1 [[TMP7]], label [[LOOP_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]] |
| 552 | +; CHECK: middle.block: |
| 553 | +; CHECK-NEXT: br i1 true, label [[LOOP_END:%.*]], label [[SCALAR_PH]] |
| 554 | +; CHECK: scalar.ph: |
| 555 | +; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 67, [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ] |
| 556 | +; CHECK-NEXT: br label [[LOOP1:%.*]] |
531 | 557 | ; CHECK: loop:
|
532 |
| -; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ] |
| 558 | +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] |
533 | 559 | ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
|
534 | 560 | ; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
535 | 561 | ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
|
536 | 562 | ; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
|
537 | 563 | ; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
|
538 |
| -; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_EARLY_EXIT:%.*]] |
| 564 | +; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_EARLY_EXIT]] |
539 | 565 | ; CHECK: loop.inc:
|
540 | 566 | ; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
|
541 | 567 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
|
542 |
| -; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END:%.*]] |
| 568 | +; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP1]], label [[LOOP_END]], !llvm.loop [[LOOP3:![0-9]+]] |
543 | 569 | ; CHECK: loop.early.exit:
|
544 |
| -; CHECK-NEXT: [[RETVAL1:%.*]] = phi i64 [ 67, [[LOOP]] ] |
| 570 | +; CHECK-NEXT: [[RETVAL1:%.*]] = phi i64 [ 67, [[LOOP1]] ], [ 67, [[MIDDLE_SPLIT]] ] |
545 | 571 | ; CHECK-NEXT: ret i64 [[RETVAL1]]
|
546 | 572 | ; CHECK: loop.end:
|
547 |
| -; CHECK-NEXT: [[RETVAL2:%.*]] = phi i64 [ [[INDEX]], [[LOOP_INC]] ] |
| 573 | +; CHECK-NEXT: [[RETVAL2:%.*]] = phi i64 [ [[INDEX]], [[LOOP_INC]] ], [ 66, [[MIDDLE_BLOCK]] ] |
548 | 574 | ; CHECK-NEXT: ret i64 [[RETVAL2]]
|
549 | 575 | ;
|
550 | 576 | entry:
|
@@ -995,3 +1021,9 @@ declare i32 @foo(i32) readonly
|
995 | 1021 | declare <vscale x 4 x i32> @foo_vec(<vscale x 4 x i32>)
|
996 | 1022 |
|
997 | 1023 | attributes #0 = { "vector-function-abi-variant"="_ZGVsNxv_foo(foo_vec)" }
|
| 1024 | +;. |
| 1025 | +; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]} |
| 1026 | +; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1} |
| 1027 | +; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"} |
| 1028 | +; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]} |
| 1029 | +;. |
0 commit comments