@@ -55,6 +55,54 @@ entry:
5555 ret void
5656}
5757
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+
58106;; Similar test, but now div/rem is main opcode and not the alternate one. Same issue.
59107define void @test_urem_add (ptr %arr1 , ptr %arr2 , i32 %a0 , i32 %a1 , i32 %a2 , i32 %a3 ) {
60108; CHECK-LABEL: @test_urem_add(
@@ -114,3 +162,56 @@ entry:
114162 store i32 %res3 , ptr %gep2.3
115163 ret void
116164}
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