@@ -55,6 +55,54 @@ entry:
55
55
ret void
56
56
}
57
57
58
+ define void @test_add_udiv (ptr %arr1 , ptr %arr2 , i32 %a0 , i32 %a1 , i32 %a2 , i32 %a3 ) {
59
+ ; CHECK-LABEL: @test_add_udiv(
60
+ ; CHECK-NEXT: entry:
61
+ ; CHECK-NEXT: [[GEP1_2:%.*]] = getelementptr i32, ptr [[ARR1:%.*]], i32 2
62
+ ; CHECK-NEXT: [[GEP1_3:%.*]] = getelementptr i32, ptr [[ARR1]], i32 3
63
+ ; CHECK-NEXT: [[V2:%.*]] = load i32, ptr [[GEP1_2]], align 4
64
+ ; CHECK-NEXT: [[V3:%.*]] = load i32, ptr [[GEP1_3]], align 4
65
+ ; CHECK-NEXT: [[Y2:%.*]] = add nsw i32 [[A2:%.*]], 42
66
+ ; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr [[ARR1]], align 4
67
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> <i32 poison, i32 poison, i32 0, i32 poison>, i32 [[A0:%.*]], i32 0
68
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[A1:%.*]], i32 1
69
+ ; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> [[TMP2]], i32 [[A3:%.*]], i32 3
70
+ ; CHECK-NEXT: [[TMP4:%.*]] = add nsw <4 x i32> <i32 1146, i32 146, i32 0, i32 0>, [[TMP3]]
71
+ ; CHECK-NEXT: [[RES2:%.*]] = udiv i32 [[V2]], [[Y2]]
72
+ ; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> poison, i32 [[RES2]], i32 2
73
+ ; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[V3]], i32 3
74
+ ; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
75
+ ; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> [[TMP7]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>
76
+ ; CHECK-NEXT: [[TMP9:%.*]] = add nsw <4 x i32> [[TMP8]], [[TMP4]]
77
+ ; CHECK-NEXT: store <4 x i32> [[TMP9]], ptr [[ARR2:%.*]], align 4
78
+ ; CHECK-NEXT: ret void
79
+ ;
80
+ entry:
81
+ %gep1.1 = getelementptr i32 , ptr %arr1 , i32 1
82
+ %gep1.2 = getelementptr i32 , ptr %arr1 , i32 2
83
+ %gep1.3 = getelementptr i32 , ptr %arr1 , i32 3
84
+ %gep2.1 = getelementptr i32 , ptr %arr2 , i32 1
85
+ %gep2.2 = getelementptr i32 , ptr %arr2 , i32 2
86
+ %gep2.3 = getelementptr i32 , ptr %arr2 , i32 3
87
+ %v0 = load i32 , ptr %arr1
88
+ %v1 = load i32 , ptr %gep1.1
89
+ %v2 = load i32 , ptr %gep1.2
90
+ %v3 = load i32 , ptr %gep1.3
91
+ %y0 = add nsw i32 %a0 , 1146
92
+ %y1 = add nsw i32 %a1 , 146
93
+ %y2 = add nsw i32 %a2 , 42
94
+ %y3 = add nsw i32 %a3 , 0
95
+ %res0 = add nsw i32 %v0 , %y0
96
+ %res1 = add nsw i32 %v1 , %y1
97
+ %res2 = udiv i32 %v2 , %y2
98
+ %res3 = add nsw i32 %v3 , %y3
99
+ store i32 %res0 , ptr %arr2
100
+ store i32 %res1 , ptr %gep2.1
101
+ store i32 %res2 , ptr %gep2.2
102
+ store i32 %res3 , ptr %gep2.3
103
+ ret void
104
+ }
105
+
58
106
;; Similar test, but now div/rem is main opcode and not the alternate one. Same issue.
59
107
define void @test_urem_add (ptr %arr1 , ptr %arr2 , i32 %a0 , i32 %a1 , i32 %a2 , i32 %a3 ) {
60
108
; CHECK-LABEL: @test_urem_add(
@@ -114,3 +162,56 @@ entry:
114
162
store i32 %res3 , ptr %gep2.3
115
163
ret void
116
164
}
165
+
166
+ define void @test_srem_add (ptr %arr1 , ptr %arr2 , i32 %a0 , i32 %a1 , i32 %a2 , i32 %a3 ) {
167
+ ; CHECK-LABEL: @test_srem_add(
168
+ ; CHECK-NEXT: entry:
169
+ ; CHECK-NEXT: [[GEP1_1:%.*]] = getelementptr i32, ptr [[ARR1:%.*]], i32 1
170
+ ; CHECK-NEXT: [[GEP1_2:%.*]] = getelementptr i32, ptr [[ARR1]], i32 2
171
+ ; CHECK-NEXT: [[GEP1_3:%.*]] = getelementptr i32, ptr [[ARR1]], i32 3
172
+ ; CHECK-NEXT: [[GEP2_1:%.*]] = getelementptr i32, ptr [[ARR2:%.*]], i32 1
173
+ ; CHECK-NEXT: [[GEP2_2:%.*]] = getelementptr i32, ptr [[ARR2]], i32 2
174
+ ; CHECK-NEXT: [[GEP2_3:%.*]] = getelementptr i32, ptr [[ARR2]], i32 3
175
+ ; CHECK-NEXT: [[V0:%.*]] = load i32, ptr [[ARR1]], align 4
176
+ ; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[GEP1_1]], align 4
177
+ ; CHECK-NEXT: [[V2:%.*]] = load i32, ptr [[GEP1_2]], align 4
178
+ ; CHECK-NEXT: [[V3:%.*]] = load i32, ptr [[GEP1_3]], align 4
179
+ ; CHECK-NEXT: [[Y0:%.*]] = add nsw i32 [[A0:%.*]], 1146
180
+ ; CHECK-NEXT: [[Y1:%.*]] = add nsw i32 [[A1:%.*]], 146
181
+ ; CHECK-NEXT: [[Y2:%.*]] = add nsw i32 [[A2:%.*]], 42
182
+ ; CHECK-NEXT: [[Y3:%.*]] = add nsw i32 [[A3:%.*]], 0
183
+ ; CHECK-NEXT: [[RES0:%.*]] = srem i32 [[V0]], [[Y0]]
184
+ ; CHECK-NEXT: [[RES1:%.*]] = srem i32 [[V1]], [[Y1]]
185
+ ; CHECK-NEXT: [[RES2:%.*]] = srem i32 [[V2]], [[Y2]]
186
+ ; CHECK-NEXT: [[RES3:%.*]] = add nsw i32 [[V3]], [[Y3]]
187
+ ; CHECK-NEXT: store i32 [[RES0]], ptr [[ARR2]], align 4
188
+ ; CHECK-NEXT: store i32 [[RES1]], ptr [[GEP2_1]], align 4
189
+ ; CHECK-NEXT: store i32 [[RES2]], ptr [[GEP2_2]], align 4
190
+ ; CHECK-NEXT: store i32 [[RES3]], ptr [[GEP2_3]], align 4
191
+ ; CHECK-NEXT: ret void
192
+ ;
193
+ entry:
194
+ %gep1.1 = getelementptr i32 , ptr %arr1 , i32 1
195
+ %gep1.2 = getelementptr i32 , ptr %arr1 , i32 2
196
+ %gep1.3 = getelementptr i32 , ptr %arr1 , i32 3
197
+ %gep2.1 = getelementptr i32 , ptr %arr2 , i32 1
198
+ %gep2.2 = getelementptr i32 , ptr %arr2 , i32 2
199
+ %gep2.3 = getelementptr i32 , ptr %arr2 , i32 3
200
+ %v0 = load i32 , ptr %arr1
201
+ %v1 = load i32 , ptr %gep1.1
202
+ %v2 = load i32 , ptr %gep1.2
203
+ %v3 = load i32 , ptr %gep1.3
204
+ %y0 = add nsw i32 %a0 , 1146
205
+ %y1 = add nsw i32 %a1 , 146
206
+ %y2 = add nsw i32 %a2 , 42
207
+ %y3 = add nsw i32 %a3 , 0
208
+ %res0 = srem i32 %v0 , %y0
209
+ %res1 = srem i32 %v1 , %y1
210
+ %res2 = srem i32 %v2 , %y2
211
+ %res3 = add nsw i32 %v3 , %y3
212
+ store i32 %res0 , ptr %arr2
213
+ store i32 %res1 , ptr %gep2.1
214
+ store i32 %res2 , ptr %gep2.2
215
+ store i32 %res3 , ptr %gep2.3
216
+ ret void
217
+ }
0 commit comments