@@ -110,147 +110,6 @@ TEST_F(ScalarEvolutionsTest, SCEVUnknownRAUW) {
110
110
EXPECT_EQ (cast<SCEVUnknown>(M2->getOperand (1 ))->getValue (), V0);
111
111
}
112
112
113
- TEST_F (ScalarEvolutionsTest, SCEVMultiplyAddRecs) {
114
- Type *Ty = Type::getInt32Ty (Context);
115
- SmallVector<Type *, 10 > Types;
116
- Types.append (10 , Ty);
117
- FunctionType *FTy = FunctionType::get (Type::getVoidTy (Context), Types, false );
118
- Function *F = cast<Function>(M.getOrInsertFunction (" f" , FTy));
119
- BasicBlock *BB = BasicBlock::Create (Context, " entry" , F);
120
- ReturnInst::Create (Context, nullptr , BB);
121
-
122
- ScalarEvolution SE = buildSE (*F);
123
-
124
- // It's possible to produce an empty loop through the default constructor,
125
- // but you can't add any blocks to it without a LoopInfo pass.
126
- Loop L;
127
- const_cast <std::vector<BasicBlock*>&>(L.getBlocks ()).push_back (BB);
128
-
129
- Function::arg_iterator AI = F->arg_begin ();
130
- SmallVector<const SCEV *, 5 > A;
131
- A.push_back (SE.getSCEV (&*AI++));
132
- A.push_back (SE.getSCEV (&*AI++));
133
- A.push_back (SE.getSCEV (&*AI++));
134
- A.push_back (SE.getSCEV (&*AI++));
135
- A.push_back (SE.getSCEV (&*AI++));
136
- const SCEV *A_rec = SE.getAddRecExpr (A, &L, SCEV::FlagAnyWrap);
137
-
138
- SmallVector<const SCEV *, 5 > B;
139
- B.push_back (SE.getSCEV (&*AI++));
140
- B.push_back (SE.getSCEV (&*AI++));
141
- B.push_back (SE.getSCEV (&*AI++));
142
- B.push_back (SE.getSCEV (&*AI++));
143
- B.push_back (SE.getSCEV (&*AI++));
144
- const SCEV *B_rec = SE.getAddRecExpr (B, &L, SCEV::FlagAnyWrap);
145
-
146
- /* Spot check that we perform this transformation:
147
- {A0,+,A1,+,A2,+,A3,+,A4} * {B0,+,B1,+,B2,+,B3,+,B4} =
148
- {A0*B0,+,
149
- A1*B0 + A0*B1 + A1*B1,+,
150
- A2*B0 + 2A1*B1 + A0*B2 + 2A2*B1 + 2A1*B2 + A2*B2,+,
151
- A3*B0 + 3A2*B1 + 3A1*B2 + A0*B3 + 3A3*B1 + 6A2*B2 + 3A1*B3 + 3A3*B2 +
152
- 3A2*B3 + A3*B3,+,
153
- A4*B0 + 4A3*B1 + 6A2*B2 + 4A1*B3 + A0*B4 + 4A4*B1 + 12A3*B2 + 12A2*B3 +
154
- 4A1*B4 + 6A4*B2 + 12A3*B3 + 6A2*B4 + 4A4*B3 + 4A3*B4 + A4*B4,+,
155
- 5A4*B1 + 10A3*B2 + 10A2*B3 + 5A1*B4 + 20A4*B2 + 30A3*B3 + 20A2*B4 +
156
- 30A4*B3 + 30A3*B4 + 20A4*B4,+,
157
- 15A4*B2 + 20A3*B3 + 15A2*B4 + 60A4*B3 + 60A3*B4 + 90A4*B4,+,
158
- 35A4*B3 + 35A3*B4 + 140A4*B4,+,
159
- 70A4*B4}
160
- */
161
-
162
- const SCEVAddRecExpr *Product =
163
- dyn_cast<SCEVAddRecExpr>(SE.getMulExpr (A_rec, B_rec));
164
- ASSERT_TRUE (Product);
165
- ASSERT_EQ (Product->getNumOperands (), 9u );
166
-
167
- SmallVector<const SCEV *, 16 > Sum;
168
- Sum.push_back (SE.getMulExpr (A[0 ], B[0 ]));
169
- EXPECT_EQ (Product->getOperand (0 ), SE.getAddExpr (Sum));
170
- Sum.clear ();
171
-
172
- // SCEV produces different an equal but different expression for these.
173
- // Re-enable when PR11052 is fixed.
174
- #if 0
175
- Sum.push_back(SE.getMulExpr(A[1], B[0]));
176
- Sum.push_back(SE.getMulExpr(A[0], B[1]));
177
- Sum.push_back(SE.getMulExpr(A[1], B[1]));
178
- EXPECT_EQ(Product->getOperand(1), SE.getAddExpr(Sum));
179
- Sum.clear();
180
-
181
- Sum.push_back(SE.getMulExpr(A[2], B[0]));
182
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 2), A[1], B[1]));
183
- Sum.push_back(SE.getMulExpr(A[0], B[2]));
184
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 2), A[2], B[1]));
185
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 2), A[1], B[2]));
186
- Sum.push_back(SE.getMulExpr(A[2], B[2]));
187
- EXPECT_EQ(Product->getOperand(2), SE.getAddExpr(Sum));
188
- Sum.clear();
189
-
190
- Sum.push_back(SE.getMulExpr(A[3], B[0]));
191
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[2], B[1]));
192
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[1], B[2]));
193
- Sum.push_back(SE.getMulExpr(A[0], B[3]));
194
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[3], B[1]));
195
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 6), A[2], B[2]));
196
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[1], B[3]));
197
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[3], B[2]));
198
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 3), A[2], B[3]));
199
- Sum.push_back(SE.getMulExpr(A[3], B[3]));
200
- EXPECT_EQ(Product->getOperand(3), SE.getAddExpr(Sum));
201
- Sum.clear();
202
-
203
- Sum.push_back(SE.getMulExpr(A[4], B[0]));
204
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[3], B[1]));
205
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 6), A[2], B[2]));
206
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[1], B[3]));
207
- Sum.push_back(SE.getMulExpr(A[0], B[4]));
208
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[4], B[1]));
209
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 12), A[3], B[2]));
210
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 12), A[2], B[3]));
211
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[1], B[4]));
212
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 6), A[4], B[2]));
213
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 12), A[3], B[3]));
214
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 6), A[2], B[4]));
215
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[4], B[3]));
216
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 4), A[3], B[4]));
217
- Sum.push_back(SE.getMulExpr(A[4], B[4]));
218
- EXPECT_EQ(Product->getOperand(4), SE.getAddExpr(Sum));
219
- Sum.clear();
220
-
221
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 5), A[4], B[1]));
222
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 10), A[3], B[2]));
223
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 10), A[2], B[3]));
224
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 5), A[1], B[4]));
225
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 20), A[4], B[2]));
226
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 30), A[3], B[3]));
227
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 20), A[2], B[4]));
228
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 30), A[4], B[3]));
229
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 30), A[3], B[4]));
230
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 20), A[4], B[4]));
231
- EXPECT_EQ(Product->getOperand(5), SE.getAddExpr(Sum));
232
- Sum.clear();
233
-
234
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 15), A[4], B[2]));
235
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 20), A[3], B[3]));
236
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 15), A[2], B[4]));
237
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 60), A[4], B[3]));
238
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 60), A[3], B[4]));
239
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 90), A[4], B[4]));
240
- EXPECT_EQ(Product->getOperand(6), SE.getAddExpr(Sum));
241
- Sum.clear();
242
-
243
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 35), A[4], B[3]));
244
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 35), A[3], B[4]));
245
- Sum.push_back(SE.getMulExpr(SE.getConstant(Ty, 140), A[4], B[4]));
246
- EXPECT_EQ(Product->getOperand(7), SE.getAddExpr(Sum));
247
- Sum.clear();
248
- #endif
249
-
250
- Sum.push_back (SE.getMulExpr (SE.getConstant (Ty, 70 ), A[4 ], B[4 ]));
251
- EXPECT_EQ (Product->getOperand (8 ), SE.getAddExpr (Sum));
252
- }
253
-
254
113
TEST_F (ScalarEvolutionsTest, SimplifiedPHI) {
255
114
FunctionType *FTy = FunctionType::get (Type::getVoidTy (Context),
256
115
std::vector<Type *>(), false );
0 commit comments