xref: /llvm-project/llvm/unittests/IR/IRBuilderTest.cpp (revision 57f5d0a885cf05d57da946cf5cf13ead2cb077b1)
1 //===- llvm/unittest/IR/IRBuilderTest.cpp - IRBuilder tests ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/IR/IRBuilder.h"
11 #include "llvm/IR/BasicBlock.h"
12 #include "llvm/IR/DIBuilder.h"
13 #include "llvm/IR/DataLayout.h"
14 #include "llvm/IR/Function.h"
15 #include "llvm/IR/IntrinsicInst.h"
16 #include "llvm/IR/LLVMContext.h"
17 #include "llvm/IR/MDBuilder.h"
18 #include "llvm/IR/Module.h"
19 #include "llvm/IR/NoFolder.h"
20 #include "llvm/IR/Verifier.h"
21 #include "gtest/gtest.h"
22 
23 using namespace llvm;
24 
25 namespace {
26 
27 class IRBuilderTest : public testing::Test {
28 protected:
29   void SetUp() override {
30     M.reset(new Module("MyModule", Ctx));
31     FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
32                                           /*isVarArg=*/false);
33     F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
34     BB = BasicBlock::Create(Ctx, "", F);
35     GV = new GlobalVariable(*M, Type::getFloatTy(Ctx), true,
36                             GlobalValue::ExternalLinkage, nullptr);
37   }
38 
39   void TearDown() override {
40     BB = nullptr;
41     M.reset();
42   }
43 
44   LLVMContext Ctx;
45   std::unique_ptr<Module> M;
46   Function *F;
47   BasicBlock *BB;
48   GlobalVariable *GV;
49 };
50 
51 TEST_F(IRBuilderTest, Intrinsics) {
52   IRBuilder<> Builder(BB);
53   Value *V;
54   Instruction *I;
55   CallInst *Call;
56   IntrinsicInst *II;
57 
58   V = Builder.CreateLoad(GV);
59   I = cast<Instruction>(Builder.CreateFAdd(V, V));
60   I->setHasNoInfs(true);
61   I->setHasNoNaNs(false);
62 
63   Call = Builder.CreateMinNum(V, V);
64   II = cast<IntrinsicInst>(Call);
65   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::minnum);
66 
67   Call = Builder.CreateMaxNum(V, V);
68   II = cast<IntrinsicInst>(Call);
69   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::maxnum);
70 
71   Call = Builder.CreateIntrinsic(Intrinsic::readcyclecounter, {}, {});
72   II = cast<IntrinsicInst>(Call);
73   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::readcyclecounter);
74 
75   Call = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, V);
76   II = cast<IntrinsicInst>(Call);
77   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs);
78   EXPECT_FALSE(II->hasNoInfs());
79   EXPECT_FALSE(II->hasNoNaNs());
80 
81   Call = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, V, I);
82   II = cast<IntrinsicInst>(Call);
83   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs);
84   EXPECT_TRUE(II->hasNoInfs());
85   EXPECT_FALSE(II->hasNoNaNs());
86 
87   Call = Builder.CreateBinaryIntrinsic(Intrinsic::pow, V, V);
88   II = cast<IntrinsicInst>(Call);
89   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::pow);
90   EXPECT_FALSE(II->hasNoInfs());
91   EXPECT_FALSE(II->hasNoNaNs());
92 
93   Call = Builder.CreateBinaryIntrinsic(Intrinsic::pow, V, V, I);
94   II = cast<IntrinsicInst>(Call);
95   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::pow);
96   EXPECT_TRUE(II->hasNoInfs());
97   EXPECT_FALSE(II->hasNoNaNs());
98 
99   Call = Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V});
100   II = cast<IntrinsicInst>(Call);
101   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma);
102   EXPECT_FALSE(II->hasNoInfs());
103   EXPECT_FALSE(II->hasNoNaNs());
104 
105   Call = Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}, I);
106   II = cast<IntrinsicInst>(Call);
107   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma);
108   EXPECT_TRUE(II->hasNoInfs());
109   EXPECT_FALSE(II->hasNoNaNs());
110 
111   Call = Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}, I);
112   II = cast<IntrinsicInst>(Call);
113   EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma);
114   EXPECT_TRUE(II->hasNoInfs());
115   EXPECT_FALSE(II->hasNoNaNs());
116 }
117 
118 TEST_F(IRBuilderTest, Lifetime) {
119   IRBuilder<> Builder(BB);
120   AllocaInst *Var1 = Builder.CreateAlloca(Builder.getInt8Ty());
121   AllocaInst *Var2 = Builder.CreateAlloca(Builder.getInt32Ty());
122   AllocaInst *Var3 = Builder.CreateAlloca(Builder.getInt8Ty(),
123                                           Builder.getInt32(123));
124 
125   CallInst *Start1 = Builder.CreateLifetimeStart(Var1);
126   CallInst *Start2 = Builder.CreateLifetimeStart(Var2);
127   CallInst *Start3 = Builder.CreateLifetimeStart(Var3, Builder.getInt64(100));
128 
129   EXPECT_EQ(Start1->getArgOperand(0), Builder.getInt64(-1));
130   EXPECT_EQ(Start2->getArgOperand(0), Builder.getInt64(-1));
131   EXPECT_EQ(Start3->getArgOperand(0), Builder.getInt64(100));
132 
133   EXPECT_EQ(Start1->getArgOperand(1), Var1);
134   EXPECT_NE(Start2->getArgOperand(1), Var2);
135   EXPECT_EQ(Start3->getArgOperand(1), Var3);
136 
137   Value *End1 = Builder.CreateLifetimeEnd(Var1);
138   Builder.CreateLifetimeEnd(Var2);
139   Builder.CreateLifetimeEnd(Var3);
140 
141   IntrinsicInst *II_Start1 = dyn_cast<IntrinsicInst>(Start1);
142   IntrinsicInst *II_End1 = dyn_cast<IntrinsicInst>(End1);
143   ASSERT_TRUE(II_Start1 != nullptr);
144   EXPECT_EQ(II_Start1->getIntrinsicID(), Intrinsic::lifetime_start);
145   ASSERT_TRUE(II_End1 != nullptr);
146   EXPECT_EQ(II_End1->getIntrinsicID(), Intrinsic::lifetime_end);
147 }
148 
149 TEST_F(IRBuilderTest, CreateCondBr) {
150   IRBuilder<> Builder(BB);
151   BasicBlock *TBB = BasicBlock::Create(Ctx, "", F);
152   BasicBlock *FBB = BasicBlock::Create(Ctx, "", F);
153 
154   BranchInst *BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB);
155   TerminatorInst *TI = BB->getTerminator();
156   EXPECT_EQ(BI, TI);
157   EXPECT_EQ(2u, TI->getNumSuccessors());
158   EXPECT_EQ(TBB, TI->getSuccessor(0));
159   EXPECT_EQ(FBB, TI->getSuccessor(1));
160 
161   BI->eraseFromParent();
162   MDNode *Weights = MDBuilder(Ctx).createBranchWeights(42, 13);
163   BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB, Weights);
164   TI = BB->getTerminator();
165   EXPECT_EQ(BI, TI);
166   EXPECT_EQ(2u, TI->getNumSuccessors());
167   EXPECT_EQ(TBB, TI->getSuccessor(0));
168   EXPECT_EQ(FBB, TI->getSuccessor(1));
169   EXPECT_EQ(Weights, TI->getMetadata(LLVMContext::MD_prof));
170 }
171 
172 TEST_F(IRBuilderTest, LandingPadName) {
173   IRBuilder<> Builder(BB);
174   LandingPadInst *LP = Builder.CreateLandingPad(Builder.getInt32Ty(), 0, "LP");
175   EXPECT_EQ(LP->getName(), "LP");
176 }
177 
178 TEST_F(IRBuilderTest, DataLayout) {
179   std::unique_ptr<Module> M(new Module("test", Ctx));
180   M->setDataLayout("e-n32");
181   EXPECT_TRUE(M->getDataLayout().isLegalInteger(32));
182   M->setDataLayout("e");
183   EXPECT_FALSE(M->getDataLayout().isLegalInteger(32));
184 }
185 
186 TEST_F(IRBuilderTest, GetIntTy) {
187   IRBuilder<> Builder(BB);
188   IntegerType *Ty1 = Builder.getInt1Ty();
189   EXPECT_EQ(Ty1, IntegerType::get(Ctx, 1));
190 
191   DataLayout* DL = new DataLayout(M.get());
192   IntegerType *IntPtrTy = Builder.getIntPtrTy(*DL);
193   unsigned IntPtrBitSize =  DL->getPointerSizeInBits(0);
194   EXPECT_EQ(IntPtrTy, IntegerType::get(Ctx, IntPtrBitSize));
195   delete DL;
196 }
197 
198 TEST_F(IRBuilderTest, FastMathFlags) {
199   IRBuilder<> Builder(BB);
200   Value *F, *FC;
201   Instruction *FDiv, *FAdd, *FCmp, *FCall;
202 
203   F = Builder.CreateLoad(GV);
204   F = Builder.CreateFAdd(F, F);
205 
206   EXPECT_FALSE(Builder.getFastMathFlags().any());
207   ASSERT_TRUE(isa<Instruction>(F));
208   FAdd = cast<Instruction>(F);
209   EXPECT_FALSE(FAdd->hasNoNaNs());
210 
211   FastMathFlags FMF;
212   Builder.setFastMathFlags(FMF);
213 
214   // By default, no flags are set.
215   F = Builder.CreateFAdd(F, F);
216   EXPECT_FALSE(Builder.getFastMathFlags().any());
217   ASSERT_TRUE(isa<Instruction>(F));
218   FAdd = cast<Instruction>(F);
219   EXPECT_FALSE(FAdd->hasNoNaNs());
220   EXPECT_FALSE(FAdd->hasNoInfs());
221   EXPECT_FALSE(FAdd->hasNoSignedZeros());
222   EXPECT_FALSE(FAdd->hasAllowReciprocal());
223   EXPECT_FALSE(FAdd->hasAllowContract());
224   EXPECT_FALSE(FAdd->hasAllowReassoc());
225   EXPECT_FALSE(FAdd->hasApproxFunc());
226 
227   // Set all flags in the instruction.
228   FAdd->setFast(true);
229   EXPECT_TRUE(FAdd->hasNoNaNs());
230   EXPECT_TRUE(FAdd->hasNoInfs());
231   EXPECT_TRUE(FAdd->hasNoSignedZeros());
232   EXPECT_TRUE(FAdd->hasAllowReciprocal());
233   EXPECT_TRUE(FAdd->hasAllowContract());
234   EXPECT_TRUE(FAdd->hasAllowReassoc());
235   EXPECT_TRUE(FAdd->hasApproxFunc());
236 
237   // All flags are set in the builder.
238   FMF.setFast();
239   Builder.setFastMathFlags(FMF);
240 
241   F = Builder.CreateFAdd(F, F);
242   EXPECT_TRUE(Builder.getFastMathFlags().any());
243   EXPECT_TRUE(Builder.getFastMathFlags().all());
244   ASSERT_TRUE(isa<Instruction>(F));
245   FAdd = cast<Instruction>(F);
246   EXPECT_TRUE(FAdd->hasNoNaNs());
247   EXPECT_TRUE(FAdd->isFast());
248 
249   // Now, try it with CreateBinOp
250   F = Builder.CreateBinOp(Instruction::FAdd, F, F);
251   EXPECT_TRUE(Builder.getFastMathFlags().any());
252   ASSERT_TRUE(isa<Instruction>(F));
253   FAdd = cast<Instruction>(F);
254   EXPECT_TRUE(FAdd->hasNoNaNs());
255   EXPECT_TRUE(FAdd->isFast());
256 
257   F = Builder.CreateFDiv(F, F);
258   EXPECT_TRUE(Builder.getFastMathFlags().all());
259   ASSERT_TRUE(isa<Instruction>(F));
260   FDiv = cast<Instruction>(F);
261   EXPECT_TRUE(FDiv->hasAllowReciprocal());
262 
263   // Clear all FMF in the builder.
264   Builder.clearFastMathFlags();
265 
266   F = Builder.CreateFDiv(F, F);
267   ASSERT_TRUE(isa<Instruction>(F));
268   FDiv = cast<Instruction>(F);
269   EXPECT_FALSE(FDiv->hasAllowReciprocal());
270 
271   // Try individual flags.
272   FMF.clear();
273   FMF.setAllowReciprocal();
274   Builder.setFastMathFlags(FMF);
275 
276   F = Builder.CreateFDiv(F, F);
277   EXPECT_TRUE(Builder.getFastMathFlags().any());
278   EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal);
279   ASSERT_TRUE(isa<Instruction>(F));
280   FDiv = cast<Instruction>(F);
281   EXPECT_TRUE(FDiv->hasAllowReciprocal());
282 
283   Builder.clearFastMathFlags();
284 
285   FC = Builder.CreateFCmpOEQ(F, F);
286   ASSERT_TRUE(isa<Instruction>(FC));
287   FCmp = cast<Instruction>(FC);
288   EXPECT_FALSE(FCmp->hasAllowReciprocal());
289 
290   FMF.clear();
291   FMF.setAllowReciprocal();
292   Builder.setFastMathFlags(FMF);
293 
294   FC = Builder.CreateFCmpOEQ(F, F);
295   EXPECT_TRUE(Builder.getFastMathFlags().any());
296   EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal);
297   ASSERT_TRUE(isa<Instruction>(FC));
298   FCmp = cast<Instruction>(FC);
299   EXPECT_TRUE(FCmp->hasAllowReciprocal());
300 
301   Builder.clearFastMathFlags();
302 
303   // Test FP-contract
304   FC = Builder.CreateFAdd(F, F);
305   ASSERT_TRUE(isa<Instruction>(FC));
306   FAdd = cast<Instruction>(FC);
307   EXPECT_FALSE(FAdd->hasAllowContract());
308 
309   FMF.clear();
310   FMF.setAllowContract(true);
311   Builder.setFastMathFlags(FMF);
312 
313   FC = Builder.CreateFAdd(F, F);
314   EXPECT_TRUE(Builder.getFastMathFlags().any());
315   EXPECT_TRUE(Builder.getFastMathFlags().AllowContract);
316   ASSERT_TRUE(isa<Instruction>(FC));
317   FAdd = cast<Instruction>(FC);
318   EXPECT_TRUE(FAdd->hasAllowContract());
319 
320   FMF.setApproxFunc();
321   Builder.clearFastMathFlags();
322   Builder.setFastMathFlags(FMF);
323   // Now 'aml' and 'contract' are set.
324   F = Builder.CreateFMul(F, F);
325   FAdd = cast<Instruction>(F);
326   EXPECT_TRUE(FAdd->hasApproxFunc());
327   EXPECT_TRUE(FAdd->hasAllowContract());
328   EXPECT_FALSE(FAdd->hasAllowReassoc());
329 
330   FMF.setAllowReassoc();
331   Builder.clearFastMathFlags();
332   Builder.setFastMathFlags(FMF);
333   // Now 'aml' and 'contract' and 'reassoc' are set.
334   F = Builder.CreateFMul(F, F);
335   FAdd = cast<Instruction>(F);
336   EXPECT_TRUE(FAdd->hasApproxFunc());
337   EXPECT_TRUE(FAdd->hasAllowContract());
338   EXPECT_TRUE(FAdd->hasAllowReassoc());
339 
340   // Test a call with FMF.
341   auto CalleeTy = FunctionType::get(Type::getFloatTy(Ctx),
342                                     /*isVarArg=*/false);
343   auto Callee =
344       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
345 
346   FCall = Builder.CreateCall(Callee, None);
347   EXPECT_FALSE(FCall->hasNoNaNs());
348 
349   Value *V =
350       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
351   FCall = Builder.CreateCall(V, None);
352   EXPECT_FALSE(FCall->hasNoNaNs());
353 
354   FMF.clear();
355   FMF.setNoNaNs();
356   Builder.setFastMathFlags(FMF);
357 
358   FCall = Builder.CreateCall(Callee, None);
359   EXPECT_TRUE(Builder.getFastMathFlags().any());
360   EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs);
361   EXPECT_TRUE(FCall->hasNoNaNs());
362 
363   FCall = Builder.CreateCall(V, None);
364   EXPECT_TRUE(Builder.getFastMathFlags().any());
365   EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs);
366   EXPECT_TRUE(FCall->hasNoNaNs());
367 
368   Builder.clearFastMathFlags();
369 
370   // To test a copy, make sure that a '0' and a '1' change state.
371   F = Builder.CreateFDiv(F, F);
372   ASSERT_TRUE(isa<Instruction>(F));
373   FDiv = cast<Instruction>(F);
374   EXPECT_FALSE(FDiv->getFastMathFlags().any());
375   FDiv->setHasAllowReciprocal(true);
376   FAdd->setHasAllowReciprocal(false);
377   FAdd->setHasNoNaNs(true);
378   FDiv->copyFastMathFlags(FAdd);
379   EXPECT_TRUE(FDiv->hasNoNaNs());
380   EXPECT_FALSE(FDiv->hasAllowReciprocal());
381 
382 }
383 
384 TEST_F(IRBuilderTest, WrapFlags) {
385   IRBuilder<NoFolder> Builder(BB);
386 
387   // Test instructions.
388   GlobalVariable *G = new GlobalVariable(*M, Builder.getInt32Ty(), true,
389                                          GlobalValue::ExternalLinkage, nullptr);
390   Value *V = Builder.CreateLoad(G);
391   EXPECT_TRUE(
392       cast<BinaryOperator>(Builder.CreateNSWAdd(V, V))->hasNoSignedWrap());
393   EXPECT_TRUE(
394       cast<BinaryOperator>(Builder.CreateNSWMul(V, V))->hasNoSignedWrap());
395   EXPECT_TRUE(
396       cast<BinaryOperator>(Builder.CreateNSWSub(V, V))->hasNoSignedWrap());
397   EXPECT_TRUE(cast<BinaryOperator>(
398                   Builder.CreateShl(V, V, "", /* NUW */ false, /* NSW */ true))
399                   ->hasNoSignedWrap());
400 
401   EXPECT_TRUE(
402       cast<BinaryOperator>(Builder.CreateNUWAdd(V, V))->hasNoUnsignedWrap());
403   EXPECT_TRUE(
404       cast<BinaryOperator>(Builder.CreateNUWMul(V, V))->hasNoUnsignedWrap());
405   EXPECT_TRUE(
406       cast<BinaryOperator>(Builder.CreateNUWSub(V, V))->hasNoUnsignedWrap());
407   EXPECT_TRUE(cast<BinaryOperator>(
408                   Builder.CreateShl(V, V, "", /* NUW */ true, /* NSW */ false))
409                   ->hasNoUnsignedWrap());
410 
411   // Test operators created with constants.
412   Constant *C = Builder.getInt32(42);
413   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWAdd(C, C))
414                   ->hasNoSignedWrap());
415   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWSub(C, C))
416                   ->hasNoSignedWrap());
417   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWMul(C, C))
418                   ->hasNoSignedWrap());
419   EXPECT_TRUE(cast<OverflowingBinaryOperator>(
420                   Builder.CreateShl(C, C, "", /* NUW */ false, /* NSW */ true))
421                   ->hasNoSignedWrap());
422 
423   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWAdd(C, C))
424                   ->hasNoUnsignedWrap());
425   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWSub(C, C))
426                   ->hasNoUnsignedWrap());
427   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWMul(C, C))
428                   ->hasNoUnsignedWrap());
429   EXPECT_TRUE(cast<OverflowingBinaryOperator>(
430                   Builder.CreateShl(C, C, "", /* NUW */ true, /* NSW */ false))
431                   ->hasNoUnsignedWrap());
432 }
433 
434 TEST_F(IRBuilderTest, RAIIHelpersTest) {
435   IRBuilder<> Builder(BB);
436   EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal());
437   MDBuilder MDB(M->getContext());
438 
439   MDNode *FPMathA = MDB.createFPMath(0.01f);
440   MDNode *FPMathB = MDB.createFPMath(0.1f);
441 
442   Builder.setDefaultFPMathTag(FPMathA);
443 
444   {
445     IRBuilder<>::FastMathFlagGuard Guard(Builder);
446     FastMathFlags FMF;
447     FMF.setAllowReciprocal();
448     Builder.setFastMathFlags(FMF);
449     Builder.setDefaultFPMathTag(FPMathB);
450     EXPECT_TRUE(Builder.getFastMathFlags().allowReciprocal());
451     EXPECT_EQ(FPMathB, Builder.getDefaultFPMathTag());
452   }
453 
454   EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal());
455   EXPECT_EQ(FPMathA, Builder.getDefaultFPMathTag());
456 
457   Value *F = Builder.CreateLoad(GV);
458 
459   {
460     IRBuilder<>::InsertPointGuard Guard(Builder);
461     Builder.SetInsertPoint(cast<Instruction>(F));
462     EXPECT_EQ(F, &*Builder.GetInsertPoint());
463   }
464 
465   EXPECT_EQ(BB->end(), Builder.GetInsertPoint());
466   EXPECT_EQ(BB, Builder.GetInsertBlock());
467 }
468 
469 TEST_F(IRBuilderTest, createFunction) {
470   IRBuilder<> Builder(BB);
471   DIBuilder DIB(*M);
472   auto File = DIB.createFile("error.swift", "/");
473   auto CU =
474       DIB.createCompileUnit(dwarf::DW_LANG_Swift, File, "swiftc", true, "", 0);
475   auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
476   auto NoErr = DIB.createFunction(CU, "noerr", "", File, 1, Type, false, true, 1,
477                                DINode::FlagZero, true);
478   EXPECT_TRUE(!NoErr->getThrownTypes());
479   auto Int = DIB.createBasicType("Int", 64, dwarf::DW_ATE_signed);
480   auto Error = DIB.getOrCreateArray({Int});
481   auto Err =
482       DIB.createFunction(CU, "err", "", File, 1, Type, false, true, 1,
483       DINode::FlagZero, true, nullptr, nullptr, Error.get());
484   EXPECT_TRUE(Err->getThrownTypes().get() == Error.get());
485   DIB.finalize();
486 }
487 
488 TEST_F(IRBuilderTest, DIBuilder) {
489   IRBuilder<> Builder(BB);
490   DIBuilder DIB(*M);
491   auto File = DIB.createFile("F.CBL", "/");
492   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74,
493                                   DIB.createFile("F.CBL", "/"), "llvm-cobol74",
494                                   true, "", 0);
495   auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
496   auto SP = DIB.createFunction(CU, "foo", "", File, 1, Type, false, true, 1,
497                                DINode::FlagZero, true);
498   F->setSubprogram(SP);
499   AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty());
500   auto BarSP = DIB.createFunction(CU, "bar", "", File, 1, Type, false, true, 1,
501                                   DINode::FlagZero, true);
502   auto BadScope = DIB.createLexicalBlockFile(BarSP, File, 0);
503   I->setDebugLoc(DebugLoc::get(2, 0, BadScope));
504   DIB.finalize();
505   EXPECT_TRUE(verifyModule(*M));
506 }
507 
508 TEST_F(IRBuilderTest, createArtificialSubprogram) {
509   IRBuilder<> Builder(BB);
510   DIBuilder DIB(*M);
511   auto File = DIB.createFile("main.c", "/");
512   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang",
513                                   /*isOptimized=*/true, /*Flags=*/"",
514                                   /*Runtime Version=*/0);
515   auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
516   auto SP = DIB.createFunction(CU, "foo", /*LinkageName=*/"", File,
517                                /*LineNo=*/1, Type, /*isLocalToUnit=*/false,
518                                /*isDefinition=*/true, /*ScopeLine=*/2,
519                                DINode::FlagZero, /*isOptimized=*/true);
520   EXPECT_TRUE(SP->isDistinct());
521 
522   F->setSubprogram(SP);
523   AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty());
524   ReturnInst *R = Builder.CreateRetVoid();
525   I->setDebugLoc(DebugLoc::get(3, 2, SP));
526   R->setDebugLoc(DebugLoc::get(4, 2, SP));
527   DIB.finalize();
528   EXPECT_FALSE(verifyModule(*M));
529 
530   Function *G = Function::Create(F->getFunctionType(),
531                                  Function::ExternalLinkage, "", M.get());
532   BasicBlock *GBB = BasicBlock::Create(Ctx, "", G);
533   Builder.SetInsertPoint(GBB);
534   I->removeFromParent();
535   Builder.Insert(I);
536   Builder.CreateRetVoid();
537   EXPECT_FALSE(verifyModule(*M));
538 
539   DISubprogram *GSP = DIBuilder::createArtificialSubprogram(F->getSubprogram());
540   EXPECT_EQ(SP->getFile(), GSP->getFile());
541   EXPECT_EQ(SP->getType(), GSP->getType());
542   EXPECT_EQ(SP->getLine(), GSP->getLine());
543   EXPECT_EQ(SP->getScopeLine(), GSP->getScopeLine());
544   EXPECT_TRUE(GSP->isDistinct());
545 
546   G->setSubprogram(GSP);
547   EXPECT_TRUE(verifyModule(*M));
548 
549   auto *InlinedAtNode =
550       DILocation::getDistinct(Ctx, GSP->getScopeLine(), 0, GSP);
551   DebugLoc DL = I->getDebugLoc();
552   DenseMap<const MDNode *, MDNode *> IANodes;
553   auto IA = DebugLoc::appendInlinedAt(DL, InlinedAtNode, Ctx, IANodes);
554   auto NewDL = DebugLoc::get(DL.getLine(), DL.getCol(), DL.getScope(), IA);
555   I->setDebugLoc(NewDL);
556   EXPECT_FALSE(verifyModule(*M));
557 
558   EXPECT_EQ("foo", SP->getName());
559   EXPECT_EQ("foo", GSP->getName());
560   EXPECT_FALSE(SP->isArtificial());
561   EXPECT_TRUE(GSP->isArtificial());
562 }
563 
564 TEST_F(IRBuilderTest, InsertExtractElement) {
565   IRBuilder<> Builder(BB);
566 
567   auto VecTy = VectorType::get(Builder.getInt64Ty(), 4);
568   auto Elt1 = Builder.getInt64(-1);
569   auto Elt2 = Builder.getInt64(-2);
570   Value *Vec = UndefValue::get(VecTy);
571   Vec = Builder.CreateInsertElement(Vec, Elt1, Builder.getInt8(1));
572   Vec = Builder.CreateInsertElement(Vec, Elt2, 2);
573   auto X1 = Builder.CreateExtractElement(Vec, 1);
574   auto X2 = Builder.CreateExtractElement(Vec, Builder.getInt32(2));
575   EXPECT_EQ(Elt1, X1);
576   EXPECT_EQ(Elt2, X2);
577 }
578 
579 TEST_F(IRBuilderTest, CreateGlobalStringPtr) {
580   IRBuilder<> Builder(BB);
581 
582   auto String1a = Builder.CreateGlobalStringPtr("TestString", "String1a");
583   auto String1b = Builder.CreateGlobalStringPtr("TestString", "String1b", 0);
584   auto String2 = Builder.CreateGlobalStringPtr("TestString", "String2", 1);
585   auto String3 = Builder.CreateGlobalString("TestString", "String3", 2);
586 
587   EXPECT_TRUE(String1a->getType()->getPointerAddressSpace() == 0);
588   EXPECT_TRUE(String1b->getType()->getPointerAddressSpace() == 0);
589   EXPECT_TRUE(String2->getType()->getPointerAddressSpace() == 1);
590   EXPECT_TRUE(String3->getType()->getPointerAddressSpace() == 2);
591 }
592 
593 TEST_F(IRBuilderTest, DebugLoc) {
594   auto CalleeTy = FunctionType::get(Type::getVoidTy(Ctx),
595                                     /*isVarArg=*/false);
596   auto Callee =
597       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
598 
599   DIBuilder DIB(*M);
600   auto File = DIB.createFile("tmp.cpp", "/");
601   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C_plus_plus_11,
602                                   DIB.createFile("tmp.cpp", "/"), "", true, "",
603                                   0);
604   auto SPType = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
605   auto SP =
606       DIB.createFunction(CU, "foo", "foo", File, 1, SPType, false, true, 1);
607   DebugLoc DL1 = DILocation::get(Ctx, 2, 0, SP);
608   DebugLoc DL2 = DILocation::get(Ctx, 3, 0, SP);
609 
610   auto BB2 = BasicBlock::Create(Ctx, "bb2", F);
611   auto Br = BranchInst::Create(BB2, BB);
612   Br->setDebugLoc(DL1);
613 
614   IRBuilder<> Builder(Ctx);
615   Builder.SetInsertPoint(Br);
616   EXPECT_EQ(DL1, Builder.getCurrentDebugLocation());
617   auto Call1 = Builder.CreateCall(Callee, None);
618   EXPECT_EQ(DL1, Call1->getDebugLoc());
619 
620   Call1->setDebugLoc(DL2);
621   Builder.SetInsertPoint(Call1->getParent(), Call1->getIterator());
622   EXPECT_EQ(DL2, Builder.getCurrentDebugLocation());
623   auto Call2 = Builder.CreateCall(Callee, None);
624   EXPECT_EQ(DL2, Call2->getDebugLoc());
625 
626   DIB.finalize();
627 }
628 
629 TEST_F(IRBuilderTest, DIImportedEntity) {
630   IRBuilder<> Builder(BB);
631   DIBuilder DIB(*M);
632   auto F = DIB.createFile("F.CBL", "/");
633   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74,
634                                   F, "llvm-cobol74",
635                                   true, "", 0);
636   DIB.createImportedDeclaration(CU, nullptr, F, 1);
637   DIB.createImportedDeclaration(CU, nullptr, F, 1);
638   DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2);
639   DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2);
640   DIB.finalize();
641   EXPECT_TRUE(verifyModule(*M));
642   EXPECT_TRUE(CU->getImportedEntities().size() == 2);
643 }
644 
645 //  0: #define M0 V0          <-- command line definition
646 //  0: main.c                 <-- main file
647 //     3:   #define M1 V1     <-- M1 definition in main.c
648 //     5:   #include "file.h" <-- inclusion of file.h from main.c
649 //          1: #define M2     <-- M2 definition in file.h with no value
650 //     7:   #undef M1 V1      <-- M1 un-definition in main.c
651 TEST_F(IRBuilderTest, DIBuilderMacro) {
652   IRBuilder<> Builder(BB);
653   DIBuilder DIB(*M);
654   auto File1 = DIB.createFile("main.c", "/");
655   auto File2 = DIB.createFile("file.h", "/");
656   auto CU = DIB.createCompileUnit(
657       dwarf::DW_LANG_C, DIB.createFile("main.c", "/"), "llvm-c", true, "", 0);
658   auto MDef0 =
659       DIB.createMacro(nullptr, 0, dwarf::DW_MACINFO_define, "M0", "V0");
660   auto TMF1 = DIB.createTempMacroFile(nullptr, 0, File1);
661   auto MDef1 = DIB.createMacro(TMF1, 3, dwarf::DW_MACINFO_define, "M1", "V1");
662   auto TMF2 = DIB.createTempMacroFile(TMF1, 5, File2);
663   auto MDef2 = DIB.createMacro(TMF2, 1, dwarf::DW_MACINFO_define, "M2");
664   auto MUndef1 = DIB.createMacro(TMF1, 7, dwarf::DW_MACINFO_undef, "M1");
665 
666   EXPECT_EQ(dwarf::DW_MACINFO_define, MDef1->getMacinfoType());
667   EXPECT_EQ(3u, MDef1->getLine());
668   EXPECT_EQ("M1", MDef1->getName());
669   EXPECT_EQ("V1", MDef1->getValue());
670 
671   EXPECT_EQ(dwarf::DW_MACINFO_undef, MUndef1->getMacinfoType());
672   EXPECT_EQ(7u, MUndef1->getLine());
673   EXPECT_EQ("M1", MUndef1->getName());
674   EXPECT_EQ("", MUndef1->getValue());
675 
676   EXPECT_EQ(dwarf::DW_MACINFO_start_file, TMF2->getMacinfoType());
677   EXPECT_EQ(5u, TMF2->getLine());
678   EXPECT_EQ(File2, TMF2->getFile());
679 
680   DIB.finalize();
681 
682   SmallVector<Metadata *, 4> Elements;
683   Elements.push_back(MDef2);
684   auto MF2 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 5, File2,
685                               DIB.getOrCreateMacroArray(Elements));
686 
687   Elements.clear();
688   Elements.push_back(MDef1);
689   Elements.push_back(MF2);
690   Elements.push_back(MUndef1);
691   auto MF1 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 0, File1,
692                               DIB.getOrCreateMacroArray(Elements));
693 
694   Elements.clear();
695   Elements.push_back(MDef0);
696   Elements.push_back(MF1);
697   auto MN0 = MDTuple::get(Ctx, Elements);
698   EXPECT_EQ(MN0, CU->getRawMacros());
699 
700   Elements.clear();
701   Elements.push_back(MDef1);
702   Elements.push_back(MF2);
703   Elements.push_back(MUndef1);
704   auto MN1 = MDTuple::get(Ctx, Elements);
705   EXPECT_EQ(MN1, MF1->getRawElements());
706 
707   Elements.clear();
708   Elements.push_back(MDef2);
709   auto MN2 = MDTuple::get(Ctx, Elements);
710   EXPECT_EQ(MN2, MF2->getRawElements());
711   EXPECT_TRUE(verifyModule(*M));
712 }
713 }
714