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
@@ -106,3 +143,4 @@ loop.body:
106
143
exit:
107
144
ret void
108
145
}
146
+
0 commit comments