47
47
ret void
48
48
}
49
49
50
+ define void @ScalableVectorTestFullyOverlapping (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
51
+ ; CHECK-LABEL: @ScalableVectorTestFullyOverlapping(
52
+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I:%.*]], 1
53
+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
54
+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_1]]
55
+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_ARG_I_1]], align 4
56
+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
57
+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
58
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
59
+ ; CHECK-NEXT: ret void
60
+ ;
61
+ %i.1 = add nuw nsw i32 %i , 1
62
+ %ext.i.1 = zext i32 %i.1 to i64
63
+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
64
+ store float 0 .0 , ptr %gep.arg.i.1
65
+ %ext.i = zext i32 %i to i64
66
+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
67
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
68
+ ret void
69
+ }
70
+
71
+ define void @ScalableVectorTestFullyOverlapping2 (ptr %arg , i32 %i ) {
72
+ ; CHECK-LABEL: @ScalableVectorTestFullyOverlapping2(
73
+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I:%.*]], 1
74
+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
75
+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_1]]
76
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_1]], align 8
77
+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
78
+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
79
+ ; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 16
80
+ ; CHECK-NEXT: ret void
81
+ ;
82
+ %i.1 = add nuw nsw i32 %i , 1
83
+ %ext.i.1 = zext i32 %i.1 to i64
84
+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
85
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.1
86
+ %ext.i = zext i32 %i to i64
87
+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
88
+ store <vscale x 4 x float > zeroinitializer , ptr %gep.arg.i
89
+ ret void
90
+ }
91
+
92
+ define void @ScalableVectorTestNonOverlapping (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
93
+ ; CHECK-LABEL: @ScalableVectorTestNonOverlapping(
94
+ ; CHECK-NEXT: [[I_10:%.*]] = add nuw nsw i32 [[I:%.*]], 10
95
+ ; CHECK-NEXT: [[EXT_I_10:%.*]] = zext i32 [[I_10]] to i64
96
+ ; CHECK-NEXT: [[GEP_ARG_I_10:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_10]]
97
+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_ARG_I_10]], align 4
98
+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
99
+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
100
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
101
+ ; CHECK-NEXT: ret void
102
+ ;
103
+ %i.10 = add nuw nsw i32 %i , 10
104
+ %ext.i.10 = zext i32 %i.10 to i64
105
+ %gep.arg.i.10 = getelementptr inbounds float , ptr %arg , i64 %ext.i.10
106
+ store float 0 .0 , ptr %gep.arg.i.10
107
+ %ext.i = zext i32 %i to i64
108
+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
109
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
110
+ ret void
111
+ }
112
+
113
+ define void @ScalableVectorTestNonOverlapping2 (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
114
+ ; CHECK-LABEL: @ScalableVectorTestNonOverlapping2(
115
+ ; CHECK-NEXT: [[I_10:%.*]] = add nuw nsw i32 [[I:%.*]], 10
116
+ ; CHECK-NEXT: [[EXT_I_10:%.*]] = zext i32 [[I_10]] to i64
117
+ ; CHECK-NEXT: [[GEP_ARG_I_10:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_10]]
118
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_10]], align 8
119
+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
120
+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
121
+ ; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 16
122
+ ; CHECK-NEXT: ret void
123
+ ;
124
+ %i.10 = add nuw nsw i32 %i , 10
125
+ %ext.i.10 = zext i32 %i.10 to i64
126
+ %gep.arg.i.10 = getelementptr inbounds float , ptr %arg , i64 %ext.i.10
127
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.10
128
+ %ext.i = zext i32 %i to i64
129
+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
130
+ store <vscale x 4 x float > zeroinitializer , ptr %gep.arg.i
131
+ ret void
132
+ }
133
+
50
134
define void @ArrayTestPartiallyOverlapping (i64 %0 ) {
51
135
;
52
136
; The DSE pass will not kill the store because the overlap is partial
@@ -55,9 +139,9 @@ define void @ArrayTestPartiallyOverlapping(i64 %0) {
55
139
; CHECK-LABEL: @ArrayTestPartiallyOverlapping(
56
140
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0:%.*]], 10
57
141
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP2]]
58
- ; CHECK-NEXT: [[TMP5 :%.*]] = add i64 [[TMP0]], 15
59
- ; CHECK-NEXT: [[TMP6 :%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP5 ]]
60
- ; CHECK-NEXT: store i32 1, ptr [[TMP6 ]], align 4
142
+ ; CHECK-NEXT: [[TMP4 :%.*]] = add i64 [[TMP0]], 15
143
+ ; CHECK-NEXT: [[TMP5 :%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP4 ]]
144
+ ; CHECK-NEXT: store i32 1, ptr [[TMP5 ]], align 4
61
145
; CHECK-NEXT: store i64 0, ptr [[TMP3]], align 4
62
146
; CHECK-NEXT: ret void
63
147
;
97
181
ret void
98
182
}
99
183
184
+ define void @ScalableVectorTestPartiallyOverlapping (ptr %arg , i32 %i ) {
185
+ ;
186
+ ; The DSE pass will not kill the store because the overlap is partial
187
+ ; and won't fully clobber the original store.
188
+ ;
189
+ ; CHECK-LABEL: @ScalableVectorTestPartiallyOverlapping(
190
+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I:%.*]] to i64
191
+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I]]
192
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
193
+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I]], 1
194
+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
195
+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I_1]]
196
+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_1]], align 8
197
+ ; CHECK-NEXT: ret void
198
+ ;
199
+ %ext.i = zext i32 %i to i64
200
+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
201
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
202
+ %i.1 = add nuw nsw i32 %i , 1
203
+ %ext.i.1 = zext i32 %i.1 to i64
204
+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
205
+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.1
206
+ ret void
207
+ }
208
+
0 commit comments