@@ -251,6 +251,104 @@ TEST_F(CloneInstruction, DuplicateInstructionsToSplit) {
251
251
delete F;
252
252
}
253
253
254
+ TEST_F (CloneInstruction, DuplicateInstructionsToSplitBlocksEq1) {
255
+ Type *ArgTy1[] = {Type::getInt32PtrTy (context)};
256
+ FunctionType *FT = FunctionType::get (Type::getVoidTy (context), ArgTy1, false );
257
+ V = new Argument (Type::getInt32Ty (context));
258
+
259
+ Function *F = Function::Create (FT, Function::ExternalLinkage);
260
+
261
+ BasicBlock *BB1 = BasicBlock::Create (context, " " , F);
262
+ IRBuilder<> Builder1 (BB1);
263
+
264
+ BasicBlock *BB2 = BasicBlock::Create (context, " " , F);
265
+ IRBuilder<> Builder2 (BB2);
266
+
267
+ Builder1.CreateBr (BB2);
268
+
269
+ Instruction *AddInst = cast<Instruction>(Builder2.CreateAdd (V, V));
270
+ Instruction *MulInst = cast<Instruction>(Builder2.CreateMul (AddInst, V));
271
+ Instruction *SubInst = cast<Instruction>(Builder2.CreateSub (MulInst, V));
272
+ Builder2.CreateBr (BB2);
273
+
274
+ ValueToValueMapTy Mapping;
275
+
276
+ auto Split = DuplicateInstructionsInSplitBetween (BB2, BB2, BB2->getTerminator (), Mapping);
277
+
278
+ EXPECT_TRUE (Split);
279
+ EXPECT_EQ (Mapping.size (), 3u );
280
+ EXPECT_TRUE (Mapping.find (AddInst) != Mapping.end ());
281
+ EXPECT_TRUE (Mapping.find (MulInst) != Mapping.end ());
282
+ EXPECT_TRUE (Mapping.find (SubInst) != Mapping.end ());
283
+
284
+ auto AddSplit = dyn_cast<Instruction>(Mapping[AddInst]);
285
+ EXPECT_TRUE (AddSplit);
286
+ EXPECT_EQ (AddSplit->getOperand (0 ), V);
287
+ EXPECT_EQ (AddSplit->getOperand (1 ), V);
288
+ EXPECT_EQ (AddSplit->getParent (), Split);
289
+
290
+ auto MulSplit = dyn_cast<Instruction>(Mapping[MulInst]);
291
+ EXPECT_TRUE (MulSplit);
292
+ EXPECT_EQ (MulSplit->getOperand (0 ), AddSplit);
293
+ EXPECT_EQ (MulSplit->getOperand (1 ), V);
294
+ EXPECT_EQ (MulSplit->getParent (), Split);
295
+
296
+ auto SubSplit = dyn_cast<Instruction>(Mapping[SubInst]);
297
+ EXPECT_EQ (MulSplit->getNextNode (), SubSplit);
298
+ EXPECT_EQ (SubSplit->getNextNode (), Split->getTerminator ());
299
+ EXPECT_EQ (Split->getSingleSuccessor (), BB2);
300
+ EXPECT_EQ (BB2->getSingleSuccessor (), Split);
301
+
302
+ delete F;
303
+ }
304
+
305
+ TEST_F (CloneInstruction, DuplicateInstructionsToSplitBlocksEq2) {
306
+ Type *ArgTy1[] = {Type::getInt32PtrTy (context)};
307
+ FunctionType *FT = FunctionType::get (Type::getVoidTy (context), ArgTy1, false );
308
+ V = new Argument (Type::getInt32Ty (context));
309
+
310
+ Function *F = Function::Create (FT, Function::ExternalLinkage);
311
+
312
+ BasicBlock *BB1 = BasicBlock::Create (context, " " , F);
313
+ IRBuilder<> Builder1 (BB1);
314
+
315
+ BasicBlock *BB2 = BasicBlock::Create (context, " " , F);
316
+ IRBuilder<> Builder2 (BB2);
317
+
318
+ Builder1.CreateBr (BB2);
319
+
320
+ Instruction *AddInst = cast<Instruction>(Builder2.CreateAdd (V, V));
321
+ Instruction *MulInst = cast<Instruction>(Builder2.CreateMul (AddInst, V));
322
+ Instruction *SubInst = cast<Instruction>(Builder2.CreateSub (MulInst, V));
323
+ Builder2.CreateBr (BB2);
324
+
325
+ ValueToValueMapTy Mapping;
326
+
327
+ auto Split = DuplicateInstructionsInSplitBetween (BB2, BB2, SubInst, Mapping);
328
+
329
+ EXPECT_TRUE (Split);
330
+ EXPECT_EQ (Mapping.size (), 2u );
331
+ EXPECT_TRUE (Mapping.find (AddInst) != Mapping.end ());
332
+ EXPECT_TRUE (Mapping.find (MulInst) != Mapping.end ());
333
+
334
+ auto AddSplit = dyn_cast<Instruction>(Mapping[AddInst]);
335
+ EXPECT_TRUE (AddSplit);
336
+ EXPECT_EQ (AddSplit->getOperand (0 ), V);
337
+ EXPECT_EQ (AddSplit->getOperand (1 ), V);
338
+ EXPECT_EQ (AddSplit->getParent (), Split);
339
+
340
+ auto MulSplit = dyn_cast<Instruction>(Mapping[MulInst]);
341
+ EXPECT_TRUE (MulSplit);
342
+ EXPECT_EQ (MulSplit->getOperand (0 ), AddSplit);
343
+ EXPECT_EQ (MulSplit->getOperand (1 ), V);
344
+ EXPECT_EQ (MulSplit->getParent (), Split);
345
+ EXPECT_EQ (MulSplit->getNextNode (), Split->getTerminator ());
346
+ EXPECT_EQ (Split->getSingleSuccessor (), BB2);
347
+ EXPECT_EQ (BB2->getSingleSuccessor (), Split);
348
+
349
+ delete F;
350
+ }
351
+
254
352
class CloneFunc : public ::testing::Test {
255
353
protected:
256
354
void SetUp () override {
0 commit comments