xref: /aosp_15_r20/external/llvm/unittests/IR/IRBuilderTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/IR/IRBuilderTest.cpp - IRBuilder tests ---------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRBuilder.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/BasicBlock.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DIBuilder.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IntrinsicInst.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/MDBuilder.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/NoFolder.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Verifier.h"
21*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker namespace {
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker class IRBuilderTest : public testing::Test {
28*9880d681SAndroid Build Coastguard Worker protected:
SetUp()29*9880d681SAndroid Build Coastguard Worker   void SetUp() override {
30*9880d681SAndroid Build Coastguard Worker     M.reset(new Module("MyModule", Ctx));
31*9880d681SAndroid Build Coastguard Worker     FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
32*9880d681SAndroid Build Coastguard Worker                                           /*isVarArg=*/false);
33*9880d681SAndroid Build Coastguard Worker     F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
34*9880d681SAndroid Build Coastguard Worker     BB = BasicBlock::Create(Ctx, "", F);
35*9880d681SAndroid Build Coastguard Worker     GV = new GlobalVariable(*M, Type::getFloatTy(Ctx), true,
36*9880d681SAndroid Build Coastguard Worker                             GlobalValue::ExternalLinkage, nullptr);
37*9880d681SAndroid Build Coastguard Worker   }
38*9880d681SAndroid Build Coastguard Worker 
TearDown()39*9880d681SAndroid Build Coastguard Worker   void TearDown() override {
40*9880d681SAndroid Build Coastguard Worker     BB = nullptr;
41*9880d681SAndroid Build Coastguard Worker     M.reset();
42*9880d681SAndroid Build Coastguard Worker   }
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker   LLVMContext Ctx;
45*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M;
46*9880d681SAndroid Build Coastguard Worker   Function *F;
47*9880d681SAndroid Build Coastguard Worker   BasicBlock *BB;
48*9880d681SAndroid Build Coastguard Worker   GlobalVariable *GV;
49*9880d681SAndroid Build Coastguard Worker };
50*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,Lifetime)51*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, Lifetime) {
52*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
53*9880d681SAndroid Build Coastguard Worker   AllocaInst *Var1 = Builder.CreateAlloca(Builder.getInt8Ty());
54*9880d681SAndroid Build Coastguard Worker   AllocaInst *Var2 = Builder.CreateAlloca(Builder.getInt32Ty());
55*9880d681SAndroid Build Coastguard Worker   AllocaInst *Var3 = Builder.CreateAlloca(Builder.getInt8Ty(),
56*9880d681SAndroid Build Coastguard Worker                                           Builder.getInt32(123));
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   CallInst *Start1 = Builder.CreateLifetimeStart(Var1);
59*9880d681SAndroid Build Coastguard Worker   CallInst *Start2 = Builder.CreateLifetimeStart(Var2);
60*9880d681SAndroid Build Coastguard Worker   CallInst *Start3 = Builder.CreateLifetimeStart(Var3, Builder.getInt64(100));
61*9880d681SAndroid Build Coastguard Worker 
62*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Start1->getArgOperand(0), Builder.getInt64(-1));
63*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Start2->getArgOperand(0), Builder.getInt64(-1));
64*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Start3->getArgOperand(0), Builder.getInt64(100));
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Start1->getArgOperand(1), Var1);
67*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(Start2->getArgOperand(1), Var2);
68*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Start3->getArgOperand(1), Var3);
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker   Value *End1 = Builder.CreateLifetimeEnd(Var1);
71*9880d681SAndroid Build Coastguard Worker   Builder.CreateLifetimeEnd(Var2);
72*9880d681SAndroid Build Coastguard Worker   Builder.CreateLifetimeEnd(Var3);
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker   IntrinsicInst *II_Start1 = dyn_cast<IntrinsicInst>(Start1);
75*9880d681SAndroid Build Coastguard Worker   IntrinsicInst *II_End1 = dyn_cast<IntrinsicInst>(End1);
76*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(II_Start1 != nullptr);
77*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(II_Start1->getIntrinsicID(), Intrinsic::lifetime_start);
78*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(II_End1 != nullptr);
79*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(II_End1->getIntrinsicID(), Intrinsic::lifetime_end);
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,CreateCondBr)82*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, CreateCondBr) {
83*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
84*9880d681SAndroid Build Coastguard Worker   BasicBlock *TBB = BasicBlock::Create(Ctx, "", F);
85*9880d681SAndroid Build Coastguard Worker   BasicBlock *FBB = BasicBlock::Create(Ctx, "", F);
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker   BranchInst *BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB);
88*9880d681SAndroid Build Coastguard Worker   TerminatorInst *TI = BB->getTerminator();
89*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BI, TI);
90*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, TI->getNumSuccessors());
91*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TBB, TI->getSuccessor(0));
92*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(FBB, TI->getSuccessor(1));
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker   BI->eraseFromParent();
95*9880d681SAndroid Build Coastguard Worker   MDNode *Weights = MDBuilder(Ctx).createBranchWeights(42, 13);
96*9880d681SAndroid Build Coastguard Worker   BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB, Weights);
97*9880d681SAndroid Build Coastguard Worker   TI = BB->getTerminator();
98*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BI, TI);
99*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, TI->getNumSuccessors());
100*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TBB, TI->getSuccessor(0));
101*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(FBB, TI->getSuccessor(1));
102*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Weights, TI->getMetadata(LLVMContext::MD_prof));
103*9880d681SAndroid Build Coastguard Worker }
104*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,LandingPadName)105*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, LandingPadName) {
106*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
107*9880d681SAndroid Build Coastguard Worker   LandingPadInst *LP = Builder.CreateLandingPad(Builder.getInt32Ty(), 0, "LP");
108*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(LP->getName(), "LP");
109*9880d681SAndroid Build Coastguard Worker }
110*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,DataLayout)111*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, DataLayout) {
112*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M(new Module("test", Ctx));
113*9880d681SAndroid Build Coastguard Worker   M->setDataLayout("e-n32");
114*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getDataLayout().isLegalInteger(32));
115*9880d681SAndroid Build Coastguard Worker   M->setDataLayout("e");
116*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getDataLayout().isLegalInteger(32));
117*9880d681SAndroid Build Coastguard Worker }
118*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,GetIntTy)119*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, GetIntTy) {
120*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
121*9880d681SAndroid Build Coastguard Worker   IntegerType *Ty1 = Builder.getInt1Ty();
122*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Ty1, IntegerType::get(Ctx, 1));
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   DataLayout* DL = new DataLayout(M.get());
125*9880d681SAndroid Build Coastguard Worker   IntegerType *IntPtrTy = Builder.getIntPtrTy(*DL);
126*9880d681SAndroid Build Coastguard Worker   unsigned IntPtrBitSize =  DL->getPointerSizeInBits(0);
127*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IntPtrTy, IntegerType::get(Ctx, IntPtrBitSize));
128*9880d681SAndroid Build Coastguard Worker   delete DL;
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,FastMathFlags)131*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, FastMathFlags) {
132*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
133*9880d681SAndroid Build Coastguard Worker   Value *F, *FC;
134*9880d681SAndroid Build Coastguard Worker   Instruction *FDiv, *FAdd, *FCmp, *FCall;
135*9880d681SAndroid Build Coastguard Worker 
136*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateLoad(GV);
137*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFAdd(F, F);
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Builder.getFastMathFlags().any());
140*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
141*9880d681SAndroid Build Coastguard Worker   FAdd = cast<Instruction>(F);
142*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FAdd->hasNoNaNs());
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker   FastMathFlags FMF;
145*9880d681SAndroid Build Coastguard Worker   Builder.setFastMathFlags(FMF);
146*9880d681SAndroid Build Coastguard Worker 
147*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFAdd(F, F);
148*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Builder.getFastMathFlags().any());
149*9880d681SAndroid Build Coastguard Worker 
150*9880d681SAndroid Build Coastguard Worker   FMF.setUnsafeAlgebra();
151*9880d681SAndroid Build Coastguard Worker   Builder.setFastMathFlags(FMF);
152*9880d681SAndroid Build Coastguard Worker 
153*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFAdd(F, F);
154*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
155*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
156*9880d681SAndroid Build Coastguard Worker   FAdd = cast<Instruction>(F);
157*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FAdd->hasNoNaNs());
158*9880d681SAndroid Build Coastguard Worker 
159*9880d681SAndroid Build Coastguard Worker   // Now, try it with CreateBinOp
160*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateBinOp(Instruction::FAdd, F, F);
161*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
162*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
163*9880d681SAndroid Build Coastguard Worker   FAdd = cast<Instruction>(F);
164*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FAdd->hasNoNaNs());
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFDiv(F, F);
167*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
168*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().UnsafeAlgebra);
169*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
170*9880d681SAndroid Build Coastguard Worker   FDiv = cast<Instruction>(F);
171*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FDiv->hasAllowReciprocal());
172*9880d681SAndroid Build Coastguard Worker 
173*9880d681SAndroid Build Coastguard Worker   Builder.clearFastMathFlags();
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFDiv(F, F);
176*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
177*9880d681SAndroid Build Coastguard Worker   FDiv = cast<Instruction>(F);
178*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FDiv->hasAllowReciprocal());
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker   FMF.clear();
181*9880d681SAndroid Build Coastguard Worker   FMF.setAllowReciprocal();
182*9880d681SAndroid Build Coastguard Worker   Builder.setFastMathFlags(FMF);
183*9880d681SAndroid Build Coastguard Worker 
184*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFDiv(F, F);
185*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
186*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal);
187*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
188*9880d681SAndroid Build Coastguard Worker   FDiv = cast<Instruction>(F);
189*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FDiv->hasAllowReciprocal());
190*9880d681SAndroid Build Coastguard Worker 
191*9880d681SAndroid Build Coastguard Worker   Builder.clearFastMathFlags();
192*9880d681SAndroid Build Coastguard Worker 
193*9880d681SAndroid Build Coastguard Worker   FC = Builder.CreateFCmpOEQ(F, F);
194*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(FC));
195*9880d681SAndroid Build Coastguard Worker   FCmp = cast<Instruction>(FC);
196*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FCmp->hasAllowReciprocal());
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker   FMF.clear();
199*9880d681SAndroid Build Coastguard Worker   FMF.setAllowReciprocal();
200*9880d681SAndroid Build Coastguard Worker   Builder.setFastMathFlags(FMF);
201*9880d681SAndroid Build Coastguard Worker 
202*9880d681SAndroid Build Coastguard Worker   FC = Builder.CreateFCmpOEQ(F, F);
203*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
204*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal);
205*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(FC));
206*9880d681SAndroid Build Coastguard Worker   FCmp = cast<Instruction>(FC);
207*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FCmp->hasAllowReciprocal());
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   Builder.clearFastMathFlags();
210*9880d681SAndroid Build Coastguard Worker 
211*9880d681SAndroid Build Coastguard Worker   // Test a call with FMF.
212*9880d681SAndroid Build Coastguard Worker   auto CalleeTy = FunctionType::get(Type::getFloatTy(Ctx),
213*9880d681SAndroid Build Coastguard Worker                                     /*isVarArg=*/false);
214*9880d681SAndroid Build Coastguard Worker   auto Callee =
215*9880d681SAndroid Build Coastguard Worker       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
216*9880d681SAndroid Build Coastguard Worker 
217*9880d681SAndroid Build Coastguard Worker   FCall = Builder.CreateCall(Callee, None);
218*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FCall->hasNoNaNs());
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker   Value *V =
221*9880d681SAndroid Build Coastguard Worker       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
222*9880d681SAndroid Build Coastguard Worker   FCall = Builder.CreateCall(V, None);
223*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FCall->hasNoNaNs());
224*9880d681SAndroid Build Coastguard Worker 
225*9880d681SAndroid Build Coastguard Worker   FMF.clear();
226*9880d681SAndroid Build Coastguard Worker   FMF.setNoNaNs();
227*9880d681SAndroid Build Coastguard Worker   Builder.setFastMathFlags(FMF);
228*9880d681SAndroid Build Coastguard Worker 
229*9880d681SAndroid Build Coastguard Worker   FCall = Builder.CreateCall(Callee, None);
230*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
231*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs);
232*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FCall->hasNoNaNs());
233*9880d681SAndroid Build Coastguard Worker 
234*9880d681SAndroid Build Coastguard Worker   FCall = Builder.CreateCall(V, None);
235*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().any());
236*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs);
237*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FCall->hasNoNaNs());
238*9880d681SAndroid Build Coastguard Worker 
239*9880d681SAndroid Build Coastguard Worker   Builder.clearFastMathFlags();
240*9880d681SAndroid Build Coastguard Worker 
241*9880d681SAndroid Build Coastguard Worker   // To test a copy, make sure that a '0' and a '1' change state.
242*9880d681SAndroid Build Coastguard Worker   F = Builder.CreateFDiv(F, F);
243*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(isa<Instruction>(F));
244*9880d681SAndroid Build Coastguard Worker   FDiv = cast<Instruction>(F);
245*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FDiv->getFastMathFlags().any());
246*9880d681SAndroid Build Coastguard Worker   FDiv->setHasAllowReciprocal(true);
247*9880d681SAndroid Build Coastguard Worker   FAdd->setHasAllowReciprocal(false);
248*9880d681SAndroid Build Coastguard Worker   FDiv->copyFastMathFlags(FAdd);
249*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(FDiv->hasNoNaNs());
250*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(FDiv->hasAllowReciprocal());
251*9880d681SAndroid Build Coastguard Worker 
252*9880d681SAndroid Build Coastguard Worker }
253*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,WrapFlags)254*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, WrapFlags) {
255*9880d681SAndroid Build Coastguard Worker   IRBuilder<NoFolder> Builder(BB);
256*9880d681SAndroid Build Coastguard Worker 
257*9880d681SAndroid Build Coastguard Worker   // Test instructions.
258*9880d681SAndroid Build Coastguard Worker   GlobalVariable *G = new GlobalVariable(*M, Builder.getInt32Ty(), true,
259*9880d681SAndroid Build Coastguard Worker                                          GlobalValue::ExternalLinkage, nullptr);
260*9880d681SAndroid Build Coastguard Worker   Value *V = Builder.CreateLoad(G);
261*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
262*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNSWAdd(V, V))->hasNoSignedWrap());
263*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
264*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNSWMul(V, V))->hasNoSignedWrap());
265*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
266*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNSWSub(V, V))->hasNoSignedWrap());
267*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<BinaryOperator>(
268*9880d681SAndroid Build Coastguard Worker                   Builder.CreateShl(V, V, "", /* NUW */ false, /* NSW */ true))
269*9880d681SAndroid Build Coastguard Worker                   ->hasNoSignedWrap());
270*9880d681SAndroid Build Coastguard Worker 
271*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
272*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNUWAdd(V, V))->hasNoUnsignedWrap());
273*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
274*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNUWMul(V, V))->hasNoUnsignedWrap());
275*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
276*9880d681SAndroid Build Coastguard Worker       cast<BinaryOperator>(Builder.CreateNUWSub(V, V))->hasNoUnsignedWrap());
277*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<BinaryOperator>(
278*9880d681SAndroid Build Coastguard Worker                   Builder.CreateShl(V, V, "", /* NUW */ true, /* NSW */ false))
279*9880d681SAndroid Build Coastguard Worker                   ->hasNoUnsignedWrap());
280*9880d681SAndroid Build Coastguard Worker 
281*9880d681SAndroid Build Coastguard Worker   // Test operators created with constants.
282*9880d681SAndroid Build Coastguard Worker   Constant *C = Builder.getInt32(42);
283*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWAdd(C, C))
284*9880d681SAndroid Build Coastguard Worker                   ->hasNoSignedWrap());
285*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWSub(C, C))
286*9880d681SAndroid Build Coastguard Worker                   ->hasNoSignedWrap());
287*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWMul(C, C))
288*9880d681SAndroid Build Coastguard Worker                   ->hasNoSignedWrap());
289*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(
290*9880d681SAndroid Build Coastguard Worker                   Builder.CreateShl(C, C, "", /* NUW */ false, /* NSW */ true))
291*9880d681SAndroid Build Coastguard Worker                   ->hasNoSignedWrap());
292*9880d681SAndroid Build Coastguard Worker 
293*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWAdd(C, C))
294*9880d681SAndroid Build Coastguard Worker                   ->hasNoUnsignedWrap());
295*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWSub(C, C))
296*9880d681SAndroid Build Coastguard Worker                   ->hasNoUnsignedWrap());
297*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWMul(C, C))
298*9880d681SAndroid Build Coastguard Worker                   ->hasNoUnsignedWrap());
299*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(cast<OverflowingBinaryOperator>(
300*9880d681SAndroid Build Coastguard Worker                   Builder.CreateShl(C, C, "", /* NUW */ true, /* NSW */ false))
301*9880d681SAndroid Build Coastguard Worker                   ->hasNoUnsignedWrap());
302*9880d681SAndroid Build Coastguard Worker }
303*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,RAIIHelpersTest)304*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, RAIIHelpersTest) {
305*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
306*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal());
307*9880d681SAndroid Build Coastguard Worker   MDBuilder MDB(M->getContext());
308*9880d681SAndroid Build Coastguard Worker 
309*9880d681SAndroid Build Coastguard Worker   MDNode *FPMathA = MDB.createFPMath(0.01f);
310*9880d681SAndroid Build Coastguard Worker   MDNode *FPMathB = MDB.createFPMath(0.1f);
311*9880d681SAndroid Build Coastguard Worker 
312*9880d681SAndroid Build Coastguard Worker   Builder.setDefaultFPMathTag(FPMathA);
313*9880d681SAndroid Build Coastguard Worker 
314*9880d681SAndroid Build Coastguard Worker   {
315*9880d681SAndroid Build Coastguard Worker     IRBuilder<>::FastMathFlagGuard Guard(Builder);
316*9880d681SAndroid Build Coastguard Worker     FastMathFlags FMF;
317*9880d681SAndroid Build Coastguard Worker     FMF.setAllowReciprocal();
318*9880d681SAndroid Build Coastguard Worker     Builder.setFastMathFlags(FMF);
319*9880d681SAndroid Build Coastguard Worker     Builder.setDefaultFPMathTag(FPMathB);
320*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Builder.getFastMathFlags().allowReciprocal());
321*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(FPMathB, Builder.getDefaultFPMathTag());
322*9880d681SAndroid Build Coastguard Worker   }
323*9880d681SAndroid Build Coastguard Worker 
324*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal());
325*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(FPMathA, Builder.getDefaultFPMathTag());
326*9880d681SAndroid Build Coastguard Worker 
327*9880d681SAndroid Build Coastguard Worker   Value *F = Builder.CreateLoad(GV);
328*9880d681SAndroid Build Coastguard Worker 
329*9880d681SAndroid Build Coastguard Worker   {
330*9880d681SAndroid Build Coastguard Worker     IRBuilder<>::InsertPointGuard Guard(Builder);
331*9880d681SAndroid Build Coastguard Worker     Builder.SetInsertPoint(cast<Instruction>(F));
332*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(F, &*Builder.GetInsertPoint());
333*9880d681SAndroid Build Coastguard Worker   }
334*9880d681SAndroid Build Coastguard Worker 
335*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BB->end(), Builder.GetInsertPoint());
336*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BB, Builder.GetInsertBlock());
337*9880d681SAndroid Build Coastguard Worker }
338*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,DIBuilder)339*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, DIBuilder) {
340*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
341*9880d681SAndroid Build Coastguard Worker   DIBuilder DIB(*M);
342*9880d681SAndroid Build Coastguard Worker   auto File = DIB.createFile("F.CBL", "/");
343*9880d681SAndroid Build Coastguard Worker   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, "F.CBL", "/",
344*9880d681SAndroid Build Coastguard Worker                                   "llvm-cobol74", true, "", 0);
345*9880d681SAndroid Build Coastguard Worker   auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
346*9880d681SAndroid Build Coastguard Worker   auto SP =
347*9880d681SAndroid Build Coastguard Worker       DIB.createFunction(CU, "foo", "", File, 1, Type, false, true, 1, 0, true);
348*9880d681SAndroid Build Coastguard Worker   F->setSubprogram(SP);
349*9880d681SAndroid Build Coastguard Worker   AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty());
350*9880d681SAndroid Build Coastguard Worker   auto BarSP =
351*9880d681SAndroid Build Coastguard Worker       DIB.createFunction(CU, "bar", "", File, 1, Type, false, true, 1, 0, true);
352*9880d681SAndroid Build Coastguard Worker   auto BadScope = DIB.createLexicalBlockFile(BarSP, File, 0);
353*9880d681SAndroid Build Coastguard Worker   I->setDebugLoc(DebugLoc::get(2, 0, BadScope));
354*9880d681SAndroid Build Coastguard Worker   DIB.finalize();
355*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(verifyModule(*M));
356*9880d681SAndroid Build Coastguard Worker }
357*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,InsertExtractElement)358*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, InsertExtractElement) {
359*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker   auto VecTy = VectorType::get(Builder.getInt64Ty(), 4);
362*9880d681SAndroid Build Coastguard Worker   auto Elt1 = Builder.getInt64(-1);
363*9880d681SAndroid Build Coastguard Worker   auto Elt2 = Builder.getInt64(-2);
364*9880d681SAndroid Build Coastguard Worker   Value *Vec = UndefValue::get(VecTy);
365*9880d681SAndroid Build Coastguard Worker   Vec = Builder.CreateInsertElement(Vec, Elt1, Builder.getInt8(1));
366*9880d681SAndroid Build Coastguard Worker   Vec = Builder.CreateInsertElement(Vec, Elt2, 2);
367*9880d681SAndroid Build Coastguard Worker   auto X1 = Builder.CreateExtractElement(Vec, 1);
368*9880d681SAndroid Build Coastguard Worker   auto X2 = Builder.CreateExtractElement(Vec, Builder.getInt32(2));
369*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Elt1, X1);
370*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Elt2, X2);
371*9880d681SAndroid Build Coastguard Worker }
372*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,CreateGlobalStringPtr)373*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, CreateGlobalStringPtr) {
374*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
375*9880d681SAndroid Build Coastguard Worker 
376*9880d681SAndroid Build Coastguard Worker   auto String1a = Builder.CreateGlobalStringPtr("TestString", "String1a");
377*9880d681SAndroid Build Coastguard Worker   auto String1b = Builder.CreateGlobalStringPtr("TestString", "String1b", 0);
378*9880d681SAndroid Build Coastguard Worker   auto String2 = Builder.CreateGlobalStringPtr("TestString", "String2", 1);
379*9880d681SAndroid Build Coastguard Worker   auto String3 = Builder.CreateGlobalString("TestString", "String3", 2);
380*9880d681SAndroid Build Coastguard Worker 
381*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(String1a->getType()->getPointerAddressSpace() == 0);
382*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(String1b->getType()->getPointerAddressSpace() == 0);
383*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(String2->getType()->getPointerAddressSpace() == 1);
384*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(String3->getType()->getPointerAddressSpace() == 2);
385*9880d681SAndroid Build Coastguard Worker }
386*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,DebugLoc)387*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, DebugLoc) {
388*9880d681SAndroid Build Coastguard Worker   auto CalleeTy = FunctionType::get(Type::getVoidTy(Ctx),
389*9880d681SAndroid Build Coastguard Worker                                     /*isVarArg=*/false);
390*9880d681SAndroid Build Coastguard Worker   auto Callee =
391*9880d681SAndroid Build Coastguard Worker       Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get());
392*9880d681SAndroid Build Coastguard Worker 
393*9880d681SAndroid Build Coastguard Worker   DIBuilder DIB(*M);
394*9880d681SAndroid Build Coastguard Worker   auto File = DIB.createFile("tmp.cpp", "/");
395*9880d681SAndroid Build Coastguard Worker   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C_plus_plus_11, "tmp.cpp", "/",
396*9880d681SAndroid Build Coastguard Worker                                   "", true, "", 0);
397*9880d681SAndroid Build Coastguard Worker   auto SPType = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
398*9880d681SAndroid Build Coastguard Worker   auto SP =
399*9880d681SAndroid Build Coastguard Worker       DIB.createFunction(CU, "foo", "foo", File, 1, SPType, false, true, 1);
400*9880d681SAndroid Build Coastguard Worker   DebugLoc DL1 = DILocation::get(Ctx, 2, 0, SP);
401*9880d681SAndroid Build Coastguard Worker   DebugLoc DL2 = DILocation::get(Ctx, 3, 0, SP);
402*9880d681SAndroid Build Coastguard Worker 
403*9880d681SAndroid Build Coastguard Worker   auto BB2 = BasicBlock::Create(Ctx, "bb2", F);
404*9880d681SAndroid Build Coastguard Worker   auto Br = BranchInst::Create(BB2, BB);
405*9880d681SAndroid Build Coastguard Worker   Br->setDebugLoc(DL1);
406*9880d681SAndroid Build Coastguard Worker 
407*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(Ctx);
408*9880d681SAndroid Build Coastguard Worker   Builder.SetInsertPoint(Br);
409*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DL1, Builder.getCurrentDebugLocation());
410*9880d681SAndroid Build Coastguard Worker   auto Call1 = Builder.CreateCall(Callee, None);
411*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DL1, Call1->getDebugLoc());
412*9880d681SAndroid Build Coastguard Worker 
413*9880d681SAndroid Build Coastguard Worker   Call1->setDebugLoc(DL2);
414*9880d681SAndroid Build Coastguard Worker   Builder.SetInsertPoint(Call1->getParent(), Call1->getIterator());
415*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DL2, Builder.getCurrentDebugLocation());
416*9880d681SAndroid Build Coastguard Worker   auto Call2 = Builder.CreateCall(Callee, None);
417*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DL2, Call2->getDebugLoc());
418*9880d681SAndroid Build Coastguard Worker 
419*9880d681SAndroid Build Coastguard Worker   DIB.finalize();
420*9880d681SAndroid Build Coastguard Worker }
421*9880d681SAndroid Build Coastguard Worker 
TEST_F(IRBuilderTest,DIImportedEntity)422*9880d681SAndroid Build Coastguard Worker TEST_F(IRBuilderTest, DIImportedEntity) {
423*9880d681SAndroid Build Coastguard Worker   IRBuilder<> Builder(BB);
424*9880d681SAndroid Build Coastguard Worker   DIBuilder DIB(*M);
425*9880d681SAndroid Build Coastguard Worker   auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, "F.CBL", "/",
426*9880d681SAndroid Build Coastguard Worker     "llvm-cobol74", true, "", 0);
427*9880d681SAndroid Build Coastguard Worker   DIB.createImportedDeclaration(CU, nullptr, 1);
428*9880d681SAndroid Build Coastguard Worker   DIB.createImportedDeclaration(CU, nullptr, 1);
429*9880d681SAndroid Build Coastguard Worker   DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, 2);
430*9880d681SAndroid Build Coastguard Worker   DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, 2);
431*9880d681SAndroid Build Coastguard Worker   DIB.finalize();
432*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(verifyModule(*M));
433*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(CU->getImportedEntities().size() == 2);
434*9880d681SAndroid Build Coastguard Worker }
435*9880d681SAndroid Build Coastguard Worker }
436