|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5 |
1 | 2 | ; REQUIRES: asserts
|
2 | 3 |
|
3 | 4 | ; RUN: opt -passes=loop-vectorize -mtriple=arm64-apple-ios %s -S -debug -disable-output 2>&1 | FileCheck --check-prefix=CM %s
|
|
22 | 23 |
|
23 | 24 | ; Check that the extractvalue operands are actually free in vector code.
|
24 | 25 |
|
25 |
| -; FORCED: [[E1:%.+]] = extractvalue { i64, i64 } %sv, 0 |
26 |
| -; FORCED-NEXT: %broadcast.splatinsert = insertelement <2 x i64> poison, i64 [[E1]], i64 0 |
27 |
| -; FORCED-NEXT: %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer |
28 |
| -; FORCED-NEXT: [[E2:%.+]] = extractvalue { i64, i64 } %sv, 1 |
29 |
| -; FORCED-NEXT: %broadcast.splatinsert1 = insertelement <2 x i64> poison, i64 [[E2]], i64 0 |
30 |
| -; FORCED-NEXT: %broadcast.splat2 = shufflevector <2 x i64> %broadcast.splatinsert1, <2 x i64> poison, <2 x i32> zeroinitializer |
31 |
| -; FORCED-NEXT: [[ADD:%.+]] = add <2 x i64> %broadcast.splat, %broadcast.splat2 |
32 |
| - |
33 |
| -; FORCED-LABEL: vector.body: ; preds = %vector.body, %vector.ph |
34 |
| -; FORCED-NEXT: %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ] |
35 |
| -; FORCED-NEXT: [[GEP:%.+]] = getelementptr i64, ptr %dst, i32 %index |
36 |
| -; FORCED-NEXT: store <2 x i64> [[ADD]], ptr [[GEP]], align 4 |
37 |
| -; FORCED-NEXT: %index.next = add nuw i32 %index, 2 |
38 |
| -; FORCED-NEXT: [[C:%.+]] = icmp eq i32 %index.next, 1000 |
39 |
| -; FORCED-NEXT: br i1 [[C]], label %middle.block, label %vector.body |
40 |
| - |
41 | 26 | define void @test1(ptr %dst, {i64, i64} %sv) {
|
| 27 | +; FORCED-LABEL: define void @test1( |
| 28 | +; FORCED-SAME: ptr [[DST:%.*]], { i64, i64 } [[SV:%.*]]) { |
| 29 | +; FORCED-NEXT: [[ENTRY:.*]]: |
| 30 | +; FORCED-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] |
| 31 | +; FORCED: [[VECTOR_PH]]: |
| 32 | +; FORCED-NEXT: [[TMP0:%.*]] = extractvalue { i64, i64 } [[SV]], 0 |
| 33 | +; FORCED-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[TMP0]], i64 0 |
| 34 | +; FORCED-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i64> [[BROADCAST_SPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer |
| 35 | +; FORCED-NEXT: [[TMP1:%.*]] = add <2 x i64> [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT]] |
| 36 | +; FORCED-NEXT: br label %[[VECTOR_BODY:.*]] |
| 37 | +; FORCED: [[VECTOR_BODY]]: |
| 38 | +; FORCED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| 39 | +; FORCED-NEXT: [[TMP2:%.*]] = getelementptr i64, ptr [[DST]], i32 [[INDEX]] |
| 40 | +; FORCED-NEXT: store <2 x i64> [[TMP1]], ptr [[TMP2]], align 4 |
| 41 | +; FORCED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 |
| 42 | +; FORCED-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 |
| 43 | +; FORCED-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] |
| 44 | +; FORCED: [[MIDDLE_BLOCK]]: |
| 45 | +; FORCED-NEXT: br label %[[EXIT:.*]] |
| 46 | +; FORCED: [[SCALAR_PH]]: |
| 47 | +; FORCED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ] |
| 48 | +; FORCED-NEXT: br label %[[LOOP_BODY:.*]] |
| 49 | +; FORCED: [[LOOP_BODY]]: |
| 50 | +; FORCED-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_BODY]] ] |
| 51 | +; FORCED-NEXT: [[A:%.*]] = extractvalue { i64, i64 } [[SV]], 0 |
| 52 | +; FORCED-NEXT: [[B:%.*]] = extractvalue { i64, i64 } [[SV]], 1 |
| 53 | +; FORCED-NEXT: [[ADDR:%.*]] = getelementptr i64, ptr [[DST]], i32 [[IV]] |
| 54 | +; FORCED-NEXT: [[ADD:%.*]] = add i64 [[A]], [[B]] |
| 55 | +; FORCED-NEXT: store i64 [[ADD]], ptr [[ADDR]], align 4 |
| 56 | +; FORCED-NEXT: [[IV_NEXT]] = add nsw i32 [[IV]], 1 |
| 57 | +; FORCED-NEXT: [[COND:%.*]] = icmp ne i32 [[IV_NEXT]], 1000 |
| 58 | +; FORCED-NEXT: br i1 [[COND]], label %[[LOOP_BODY]], label %[[EXIT]], !llvm.loop [[LOOP3:![0-9]+]] |
| 59 | +; FORCED: [[EXIT]]: |
| 60 | +; FORCED-NEXT: ret void |
| 61 | +; |
42 | 62 | entry:
|
43 | 63 | br label %loop.body
|
44 | 64 |
|
@@ -70,25 +90,42 @@ declare float @powf(float, float) readnone nounwind
|
70 | 90 |
|
71 | 91 | ; CM: LV: Scalar loop costs: 14.
|
72 | 92 |
|
73 |
| -; FORCED-LABEL: define void @test_getVectorCallCost |
74 |
| - |
75 |
| -; FORCED: [[E1:%.+]] = extractvalue { float, float } %sv, 0 |
76 |
| -; FORCED-NEXT: %broadcast.splatinsert = insertelement <2 x float> poison, float [[E1]], i64 0 |
77 |
| -; FORCED-NEXT: %broadcast.splat = shufflevector <2 x float> %broadcast.splatinsert, <2 x float> poison, <2 x i32> zeroinitializer |
78 |
| -; FORCED-NEXT: [[E2:%.+]] = extractvalue { float, float } %sv, 1 |
79 |
| -; FORCED-NEXT: %broadcast.splatinsert1 = insertelement <2 x float> poison, float [[E2]], i64 0 |
80 |
| -; FORCED-NEXT: %broadcast.splat2 = shufflevector <2 x float> %broadcast.splatinsert1, <2 x float> poison, <2 x i32> zeroinitializer |
81 |
| - |
82 |
| -; FORCED-LABEL: vector.body: ; preds = %vector.body, %vector.ph |
83 |
| -; FORCED-NEXT: %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ] |
84 |
| -; FORCED-NEXT: [[GEP1:%.+]] = getelementptr float, ptr %dst, i32 %index |
85 |
| -; FORCED-NEXT: [[POW:%.+]] = call <2 x float> @llvm.pow.v2f32(<2 x float> %broadcast.splat, <2 x float> %broadcast.splat2) |
86 |
| -; FORCED-NEXT: store <2 x float> [[POW]], ptr [[GEP1]], align 4 |
87 |
| -; FORCED-NEXT: %index.next = add nuw i32 %index, 2 |
88 |
| -; FORCED-NEXT: [[C:%.+]] = icmp eq i32 %index.next, 1000 |
89 |
| -; FORCED-NEXT: br i1 [[C]], label %middle.block, label %vector.body |
90 |
| - |
91 | 93 | define void @test_getVectorCallCost(ptr %dst, {float, float} %sv) {
|
| 94 | +; FORCED-LABEL: define void @test_getVectorCallCost( |
| 95 | +; FORCED-SAME: ptr [[DST:%.*]], { float, float } [[SV:%.*]]) { |
| 96 | +; FORCED-NEXT: [[ENTRY:.*]]: |
| 97 | +; FORCED-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] |
| 98 | +; FORCED: [[VECTOR_PH]]: |
| 99 | +; FORCED-NEXT: [[TMP0:%.*]] = extractvalue { float, float } [[SV]], 0 |
| 100 | +; FORCED-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[TMP0]], i64 0 |
| 101 | +; FORCED-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x float> [[BROADCAST_SPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer |
| 102 | +; FORCED-NEXT: br label %[[VECTOR_BODY:.*]] |
| 103 | +; FORCED: [[VECTOR_BODY]]: |
| 104 | +; FORCED-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| 105 | +; FORCED-NEXT: [[TMP1:%.*]] = getelementptr float, ptr [[DST]], i32 [[INDEX]] |
| 106 | +; FORCED-NEXT: [[TMP2:%.*]] = call <2 x float> @llvm.pow.v2f32(<2 x float> [[BROADCAST_SPLAT]], <2 x float> [[BROADCAST_SPLAT]]) |
| 107 | +; FORCED-NEXT: store <2 x float> [[TMP2]], ptr [[TMP1]], align 4 |
| 108 | +; FORCED-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2 |
| 109 | +; FORCED-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000 |
| 110 | +; FORCED-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] |
| 111 | +; FORCED: [[MIDDLE_BLOCK]]: |
| 112 | +; FORCED-NEXT: br label %[[EXIT:.*]] |
| 113 | +; FORCED: [[SCALAR_PH]]: |
| 114 | +; FORCED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ] |
| 115 | +; FORCED-NEXT: br label %[[LOOP_BODY:.*]] |
| 116 | +; FORCED: [[LOOP_BODY]]: |
| 117 | +; FORCED-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_BODY]] ] |
| 118 | +; FORCED-NEXT: [[A:%.*]] = extractvalue { float, float } [[SV]], 0 |
| 119 | +; FORCED-NEXT: [[B:%.*]] = extractvalue { float, float } [[SV]], 1 |
| 120 | +; FORCED-NEXT: [[ADDR:%.*]] = getelementptr float, ptr [[DST]], i32 [[IV]] |
| 121 | +; FORCED-NEXT: [[P:%.*]] = call float @powf(float [[A]], float [[B]]) |
| 122 | +; FORCED-NEXT: store float [[P]], ptr [[ADDR]], align 4 |
| 123 | +; FORCED-NEXT: [[IV_NEXT]] = add nsw i32 [[IV]], 1 |
| 124 | +; FORCED-NEXT: [[COND:%.*]] = icmp ne i32 [[IV_NEXT]], 1000 |
| 125 | +; FORCED-NEXT: br i1 [[COND]], label %[[LOOP_BODY]], label %[[EXIT]], !llvm.loop [[LOOP5:![0-9]+]] |
| 126 | +; FORCED: [[EXIT]]: |
| 127 | +; FORCED-NEXT: ret void |
| 128 | +; |
92 | 129 | entry:
|
93 | 130 | br label %loop.body
|
94 | 131 |
|
|
0 commit comments