|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5 |
1 | 2 | ; RUN: opt -passes=loop-vectorize -mtriple=x86_64-unknown-linux -force-vector-width=2 -force-vector-interleave=1 -S %s | FileCheck %s |
2 | 3 |
|
3 | 4 | define ptr @test(ptr noalias %src, ptr noalias %dst) { |
4 | | -; CHECK-LABEL: @test( |
5 | | -; CHECK-NEXT: entry: |
6 | | -; CHECK: vector.body: |
7 | | -; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %vector.ph ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE2:%.*]] ] |
8 | | -; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %vector.ph ], [ [[VEC_IND_NEXT:%.*]], [[PRED_LOAD_CONTINUE2]] ] |
| 5 | +; CHECK-LABEL: define ptr @test( |
| 6 | +; CHECK-SAME: ptr noalias [[SRC:%.*]], ptr noalias [[DST:%.*]]) { |
| 7 | +; CHECK-NEXT: [[ENTRY:.*]]: |
| 8 | +; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] |
| 9 | +; CHECK: [[VECTOR_PH]]: |
| 10 | +; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] |
| 11 | +; CHECK: [[VECTOR_BODY]]: |
| 12 | +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ] |
| 13 | +; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ] |
9 | 14 | ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 |
10 | 15 | ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1 |
11 | | -; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i64 [[TMP0]] |
| 16 | +; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[TMP0]] |
12 | 17 | ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[TMP1]] |
13 | 18 | ; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP6]], i32 0 |
14 | 19 | ; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x ptr> [[TMP16]], ptr [[TMP2]], i32 1 |
15 | 20 | ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq <2 x i64> [[VEC_IND]], zeroinitializer |
16 | 21 | ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true) |
17 | 22 | ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0 |
18 | | -; CHECK-NEXT: br i1 [[TMP5]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] |
19 | | -; CHECK: pred.load.if: |
| 23 | +; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]] |
| 24 | +; CHECK: [[PRED_LOAD_IF]]: |
20 | 25 | ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4 |
21 | 26 | ; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0 |
22 | | -; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] |
23 | | -; CHECK: pred.load.continue: |
24 | | -; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %vector.body ], [ [[TMP8]], [[PRED_LOAD_IF]] ] |
| 27 | +; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]] |
| 28 | +; CHECK: [[PRED_LOAD_CONTINUE]]: |
| 29 | +; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ] |
25 | 30 | ; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1 |
26 | | -; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2]] |
27 | | -; CHECK: pred.load.if1: |
| 31 | +; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]] |
| 32 | +; CHECK: [[PRED_LOAD_IF1]]: |
28 | 33 | ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP2]], align 4 |
29 | 34 | ; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP11]], i32 1 |
30 | | -; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] |
31 | | -; CHECK: pred.load.continue2: |
32 | | -; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], [[PRED_LOAD_IF1]] ] |
| 35 | +; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]] |
| 36 | +; CHECK: [[PRED_LOAD_CONTINUE2]]: |
| 37 | +; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP12]], %[[PRED_LOAD_IF1]] ] |
33 | 38 | ; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> zeroinitializer, <2 x i32> [[TMP13]] |
34 | | -; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[TMP0]] |
| 39 | +; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[TMP0]] |
35 | 40 | ; CHECK-NEXT: store <2 x i32> [[PREDPHI]], ptr [[TMP14]], align 4 |
36 | 41 | ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2 |
37 | 42 | ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2) |
38 | 43 | ; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000 |
39 | | -; CHECK-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK:%.*]], label %vector.body |
40 | | -; CHECK: middle.block: |
41 | | -; CHECK-NEXT: br label %exit |
42 | | -; CHECK: exit: |
43 | | -; CHECK-NEXT: [[GEP_LCSSA:%.*]] = phi ptr [ %gep.src, %loop.latch ], [ [[TMP2]], %middle.block ] |
| 44 | +; CHECK-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] |
| 45 | +; CHECK: [[MIDDLE_BLOCK]]: |
| 46 | +; CHECK-NEXT: br label %[[EXIT:.*]] |
| 47 | +; CHECK: [[SCALAR_PH]]: |
| 48 | +; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ] |
| 49 | +; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] |
| 50 | +; CHECK: [[LOOP_HEADER]]: |
| 51 | +; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] |
| 52 | +; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[IV]] |
| 53 | +; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[IV]], 0 |
| 54 | +; CHECK-NEXT: br i1 [[CMP_1]], label %[[LOOP_LATCH]], label %[[THEN:.*]] |
| 55 | +; CHECK: [[THEN]]: |
| 56 | +; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP_SRC]], align 4 |
| 57 | +; CHECK-NEXT: br label %[[LOOP_LATCH]] |
| 58 | +; CHECK: [[LOOP_LATCH]]: |
| 59 | +; CHECK-NEXT: [[M:%.*]] = phi i32 [ [[L]], %[[THEN]] ], [ 0, %[[LOOP_HEADER]] ] |
| 60 | +; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]] |
| 61 | +; CHECK-NEXT: store i32 [[M]], ptr [[GEP_DST]], align 4 |
| 62 | +; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1 |
| 63 | +; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i64 [[IV_NEXT]], 1000 |
| 64 | +; CHECK-NEXT: br i1 [[CMP_2]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP3:![0-9]+]] |
| 65 | +; CHECK: [[EXIT]]: |
| 66 | +; CHECK-NEXT: [[GEP_LCSSA:%.*]] = phi ptr [ [[GEP_SRC]], %[[LOOP_LATCH]] ], [ [[TMP2]], %[[MIDDLE_BLOCK]] ] |
44 | 67 | ; CHECK-NEXT: ret ptr [[GEP_LCSSA]] |
45 | 68 | ; |
46 | 69 | entry: |
|
0 commit comments