1 //===- llvm/unittest/IR/IRBuilderTest.cpp - IRBuilder tests ---------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Analysis/InstSimplifyFolder.h" 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/IntrinsicsAArch64.h" 17 #include "llvm/IR/LLVMContext.h" 18 #include "llvm/IR/MDBuilder.h" 19 #include "llvm/IR/Module.h" 20 #include "llvm/IR/NoFolder.h" 21 #include "llvm/IR/Verifier.h" 22 #include "gmock/gmock.h" 23 #include "gtest/gtest.h" 24 25 #include <type_traits> 26 27 using namespace llvm; 28 using ::testing::UnorderedElementsAre; 29 30 namespace { 31 32 class IRBuilderTest : public testing::Test { 33 protected: 34 void SetUp() override { 35 M.reset(new Module("MyModule", Ctx)); 36 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), 37 /*isVarArg=*/false); 38 F = Function::Create(FTy, Function::ExternalLinkage, "", M.get()); 39 BB = BasicBlock::Create(Ctx, "", F); 40 GV = new GlobalVariable(*M, Type::getFloatTy(Ctx), true, 41 GlobalValue::ExternalLinkage, nullptr); 42 } 43 44 void TearDown() override { 45 BB = nullptr; 46 M.reset(); 47 } 48 49 LLVMContext Ctx; 50 std::unique_ptr<Module> M; 51 Function *F; 52 BasicBlock *BB; 53 GlobalVariable *GV; 54 }; 55 56 TEST_F(IRBuilderTest, Intrinsics) { 57 IRBuilder<> Builder(BB); 58 Value *V; 59 Instruction *I; 60 Value *Result; 61 IntrinsicInst *II; 62 63 V = Builder.CreateLoad(GV->getValueType(), GV); 64 I = cast<Instruction>(Builder.CreateFAdd(V, V)); 65 I->setHasNoInfs(true); 66 I->setHasNoNaNs(false); 67 68 Result = Builder.CreateMinNum(V, V); 69 II = cast<IntrinsicInst>(Result); 70 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::minnum); 71 72 Result = Builder.CreateMaxNum(V, V); 73 II = cast<IntrinsicInst>(Result); 74 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::maxnum); 75 76 Result = Builder.CreateMinimum(V, V); 77 II = cast<IntrinsicInst>(Result); 78 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::minimum); 79 80 Result = Builder.CreateMaximum(V, V); 81 II = cast<IntrinsicInst>(Result); 82 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::maximum); 83 84 Result = Builder.CreateIntrinsic(Intrinsic::readcyclecounter, {}, {}); 85 II = cast<IntrinsicInst>(Result); 86 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::readcyclecounter); 87 88 Result = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, V); 89 II = cast<IntrinsicInst>(Result); 90 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs); 91 EXPECT_FALSE(II->hasNoInfs()); 92 EXPECT_FALSE(II->hasNoNaNs()); 93 94 Result = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, V, I); 95 II = cast<IntrinsicInst>(Result); 96 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs); 97 EXPECT_TRUE(II->hasNoInfs()); 98 EXPECT_FALSE(II->hasNoNaNs()); 99 100 Result = Builder.CreateBinaryIntrinsic(Intrinsic::pow, V, V); 101 II = cast<IntrinsicInst>(Result); 102 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::pow); 103 EXPECT_FALSE(II->hasNoInfs()); 104 EXPECT_FALSE(II->hasNoNaNs()); 105 106 Result = Builder.CreateBinaryIntrinsic(Intrinsic::pow, V, V, I); 107 II = cast<IntrinsicInst>(Result); 108 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::pow); 109 EXPECT_TRUE(II->hasNoInfs()); 110 EXPECT_FALSE(II->hasNoNaNs()); 111 112 Result = Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}); 113 II = cast<IntrinsicInst>(Result); 114 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma); 115 EXPECT_FALSE(II->hasNoInfs()); 116 EXPECT_FALSE(II->hasNoNaNs()); 117 118 Result = 119 Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}, I); 120 II = cast<IntrinsicInst>(Result); 121 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma); 122 EXPECT_TRUE(II->hasNoInfs()); 123 EXPECT_FALSE(II->hasNoNaNs()); 124 125 Result = 126 Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}, I); 127 II = cast<IntrinsicInst>(Result); 128 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma); 129 EXPECT_TRUE(II->hasNoInfs()); 130 EXPECT_FALSE(II->hasNoNaNs()); 131 132 Result = Builder.CreateUnaryIntrinsic(Intrinsic::roundeven, V); 133 II = cast<IntrinsicInst>(Result); 134 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::roundeven); 135 EXPECT_FALSE(II->hasNoInfs()); 136 EXPECT_FALSE(II->hasNoNaNs()); 137 138 Result = Builder.CreateIntrinsic( 139 Intrinsic::set_rounding, {}, 140 {Builder.getInt32(static_cast<uint32_t>(RoundingMode::TowardZero))}); 141 II = cast<IntrinsicInst>(Result); 142 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::set_rounding); 143 } 144 145 TEST_F(IRBuilderTest, IntrinsicMangling) { 146 IRBuilder<> Builder(BB); 147 Type *VoidTy = Builder.getVoidTy(); 148 Type *Int64Ty = Builder.getInt64Ty(); 149 Value *Int64Val = Builder.getInt64(0); 150 Value *DoubleVal = PoisonValue::get(Builder.getDoubleTy()); 151 CallInst *Call; 152 153 // Mangled return type, no arguments. 154 Call = Builder.CreateIntrinsic(Int64Ty, Intrinsic::coro_size, {}); 155 EXPECT_EQ(Call->getCalledFunction()->getName(), "llvm.coro.size.i64"); 156 157 // Void return type, mangled argument type. 158 Call = 159 Builder.CreateIntrinsic(VoidTy, Intrinsic::set_loop_iterations, Int64Val); 160 EXPECT_EQ(Call->getCalledFunction()->getName(), 161 "llvm.set.loop.iterations.i64"); 162 163 // Mangled return type and argument type. 164 Call = Builder.CreateIntrinsic(Int64Ty, Intrinsic::lround, DoubleVal); 165 EXPECT_EQ(Call->getCalledFunction()->getName(), "llvm.lround.i64.f64"); 166 } 167 168 TEST_F(IRBuilderTest, IntrinsicsWithScalableVectors) { 169 IRBuilder<> Builder(BB); 170 CallInst *Call; 171 FunctionType *FTy; 172 173 // Test scalable flag isn't dropped for intrinsic that is explicitly defined 174 // with scalable vectors, e.g. LLVMType<nxv4i32>. 175 Type *SrcVecTy = VectorType::get(Builder.getHalfTy(), 8, true); 176 Type *DstVecTy = VectorType::get(Builder.getInt32Ty(), 4, true); 177 Type *PredTy = VectorType::get(Builder.getInt1Ty(), 4, true); 178 179 SmallVector<Value*, 3> ArgTys; 180 ArgTys.push_back(UndefValue::get(DstVecTy)); 181 ArgTys.push_back(UndefValue::get(PredTy)); 182 ArgTys.push_back(UndefValue::get(SrcVecTy)); 183 184 Call = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_fcvtzs_i32f16, {}, 185 ArgTys, nullptr, "aarch64.sve.fcvtzs.i32f16"); 186 FTy = Call->getFunctionType(); 187 EXPECT_EQ(FTy->getReturnType(), DstVecTy); 188 for (unsigned i = 0; i != ArgTys.size(); ++i) 189 EXPECT_EQ(FTy->getParamType(i), ArgTys[i]->getType()); 190 191 // Test scalable flag isn't dropped for intrinsic defined with 192 // LLVMScalarOrSameVectorWidth. 193 194 Type *VecTy = VectorType::get(Builder.getInt32Ty(), 4, true); 195 Type *PtrToVecTy = Builder.getPtrTy(); 196 PredTy = VectorType::get(Builder.getInt1Ty(), 4, true); 197 198 ArgTys.clear(); 199 ArgTys.push_back(UndefValue::get(PtrToVecTy)); 200 ArgTys.push_back(UndefValue::get(Builder.getInt32Ty())); 201 ArgTys.push_back(UndefValue::get(PredTy)); 202 ArgTys.push_back(UndefValue::get(VecTy)); 203 204 Call = Builder.CreateIntrinsic(Intrinsic::masked_load, 205 {VecTy, PtrToVecTy}, ArgTys, 206 nullptr, "masked.load"); 207 FTy = Call->getFunctionType(); 208 EXPECT_EQ(FTy->getReturnType(), VecTy); 209 for (unsigned i = 0; i != ArgTys.size(); ++i) 210 EXPECT_EQ(FTy->getParamType(i), ArgTys[i]->getType()); 211 } 212 213 TEST_F(IRBuilderTest, CreateVScale) { 214 IRBuilder<> Builder(BB); 215 216 Constant *Zero = Builder.getInt32(0); 217 Value *VScale = Builder.CreateVScale(Zero); 218 EXPECT_TRUE(isa<ConstantInt>(VScale) && cast<ConstantInt>(VScale)->isZero()); 219 } 220 221 TEST_F(IRBuilderTest, CreateStepVector) { 222 IRBuilder<> Builder(BB); 223 224 // Fixed width vectors 225 Type *DstVecTy = VectorType::get(Builder.getInt32Ty(), 4, false); 226 Value *StepVec = Builder.CreateStepVector(DstVecTy); 227 EXPECT_TRUE(isa<Constant>(StepVec)); 228 EXPECT_EQ(StepVec->getType(), DstVecTy); 229 230 const auto *VectorValue = cast<Constant>(StepVec); 231 for (unsigned i = 0; i < 4; i++) { 232 EXPECT_TRUE(isa<ConstantInt>(VectorValue->getAggregateElement(i))); 233 ConstantInt *El = cast<ConstantInt>(VectorValue->getAggregateElement(i)); 234 EXPECT_EQ(El->getValue(), i); 235 } 236 237 // Scalable vectors 238 DstVecTy = VectorType::get(Builder.getInt32Ty(), 4, true); 239 StepVec = Builder.CreateStepVector(DstVecTy); 240 EXPECT_TRUE(isa<CallInst>(StepVec)); 241 CallInst *Call = cast<CallInst>(StepVec); 242 FunctionType *FTy = Call->getFunctionType(); 243 EXPECT_EQ(FTy->getReturnType(), DstVecTy); 244 EXPECT_EQ(Call->getIntrinsicID(), Intrinsic::stepvector); 245 } 246 247 TEST_F(IRBuilderTest, CreateStepVectorI3) { 248 IRBuilder<> Builder(BB); 249 250 // Scalable vectors 251 Type *DstVecTy = VectorType::get(IntegerType::get(Ctx, 3), 2, true); 252 Type *VecI8Ty = VectorType::get(Builder.getInt8Ty(), 2, true); 253 Value *StepVec = Builder.CreateStepVector(DstVecTy); 254 EXPECT_TRUE(isa<TruncInst>(StepVec)); 255 TruncInst *Trunc = cast<TruncInst>(StepVec); 256 EXPECT_EQ(Trunc->getDestTy(), DstVecTy); 257 EXPECT_EQ(Trunc->getSrcTy(), VecI8Ty); 258 EXPECT_TRUE(isa<CallInst>(Trunc->getOperand(0))); 259 260 CallInst *Call = cast<CallInst>(Trunc->getOperand(0)); 261 FunctionType *FTy = Call->getFunctionType(); 262 EXPECT_EQ(FTy->getReturnType(), VecI8Ty); 263 EXPECT_EQ(Call->getIntrinsicID(), Intrinsic::stepvector); 264 } 265 266 TEST_F(IRBuilderTest, ConstrainedFP) { 267 IRBuilder<> Builder(BB); 268 Value *V; 269 Value *VDouble; 270 Value *VInt; 271 CallInst *Call; 272 IntrinsicInst *II; 273 GlobalVariable *GVDouble = new GlobalVariable(*M, Type::getDoubleTy(Ctx), 274 true, GlobalValue::ExternalLinkage, nullptr); 275 276 V = Builder.CreateLoad(GV->getValueType(), GV); 277 VDouble = Builder.CreateLoad(GVDouble->getValueType(), GVDouble); 278 279 // See if we get constrained intrinsics instead of non-constrained 280 // instructions. 281 Builder.setIsFPConstrained(true); 282 auto Parent = BB->getParent(); 283 Parent->addFnAttr(Attribute::StrictFP); 284 285 V = Builder.CreateFAdd(V, V); 286 ASSERT_TRUE(isa<IntrinsicInst>(V)); 287 II = cast<IntrinsicInst>(V); 288 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fadd); 289 290 V = Builder.CreateFSub(V, V); 291 ASSERT_TRUE(isa<IntrinsicInst>(V)); 292 II = cast<IntrinsicInst>(V); 293 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fsub); 294 295 V = Builder.CreateFMul(V, V); 296 ASSERT_TRUE(isa<IntrinsicInst>(V)); 297 II = cast<IntrinsicInst>(V); 298 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fmul); 299 300 V = Builder.CreateFDiv(V, V); 301 ASSERT_TRUE(isa<IntrinsicInst>(V)); 302 II = cast<IntrinsicInst>(V); 303 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fdiv); 304 305 V = Builder.CreateFRem(V, V); 306 ASSERT_TRUE(isa<IntrinsicInst>(V)); 307 II = cast<IntrinsicInst>(V); 308 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_frem); 309 310 VInt = Builder.CreateFPToUI(VDouble, Builder.getInt32Ty()); 311 ASSERT_TRUE(isa<IntrinsicInst>(VInt)); 312 II = cast<IntrinsicInst>(VInt); 313 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptoui); 314 315 VInt = Builder.CreateFPToSI(VDouble, Builder.getInt32Ty()); 316 ASSERT_TRUE(isa<IntrinsicInst>(VInt)); 317 II = cast<IntrinsicInst>(VInt); 318 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptosi); 319 320 VDouble = Builder.CreateUIToFP(VInt, Builder.getDoubleTy()); 321 ASSERT_TRUE(isa<IntrinsicInst>(VDouble)); 322 II = cast<IntrinsicInst>(VDouble); 323 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_uitofp); 324 325 VDouble = Builder.CreateSIToFP(VInt, Builder.getDoubleTy()); 326 ASSERT_TRUE(isa<IntrinsicInst>(VDouble)); 327 II = cast<IntrinsicInst>(VDouble); 328 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_sitofp); 329 330 V = Builder.CreateFPTrunc(VDouble, Type::getFloatTy(Ctx)); 331 ASSERT_TRUE(isa<IntrinsicInst>(V)); 332 II = cast<IntrinsicInst>(V); 333 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptrunc); 334 335 VDouble = Builder.CreateFPExt(V, Type::getDoubleTy(Ctx)); 336 ASSERT_TRUE(isa<IntrinsicInst>(VDouble)); 337 II = cast<IntrinsicInst>(VDouble); 338 EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fpext); 339 340 // Verify attributes on the call are created automatically. 341 AttributeSet CallAttrs = II->getAttributes().getFnAttrs(); 342 EXPECT_EQ(CallAttrs.hasAttribute(Attribute::StrictFP), true); 343 344 // Verify attributes on the containing function are created when requested. 345 Builder.setConstrainedFPFunctionAttr(); 346 AttributeList Attrs = BB->getParent()->getAttributes(); 347 AttributeSet FnAttrs = Attrs.getFnAttrs(); 348 EXPECT_EQ(FnAttrs.hasAttribute(Attribute::StrictFP), true); 349 350 // Verify the codepaths for setting and overriding the default metadata. 351 V = Builder.CreateFAdd(V, V); 352 ASSERT_TRUE(isa<ConstrainedFPIntrinsic>(V)); 353 auto *CII = cast<ConstrainedFPIntrinsic>(V); 354 EXPECT_EQ(fp::ebStrict, CII->getExceptionBehavior()); 355 EXPECT_EQ(RoundingMode::Dynamic, CII->getRoundingMode()); 356 357 Builder.setDefaultConstrainedExcept(fp::ebIgnore); 358 Builder.setDefaultConstrainedRounding(RoundingMode::TowardPositive); 359 V = Builder.CreateFAdd(V, V); 360 CII = cast<ConstrainedFPIntrinsic>(V); 361 EXPECT_EQ(fp::ebIgnore, CII->getExceptionBehavior()); 362 EXPECT_EQ(CII->getRoundingMode(), RoundingMode::TowardPositive); 363 364 Builder.setDefaultConstrainedExcept(fp::ebIgnore); 365 Builder.setDefaultConstrainedRounding(RoundingMode::NearestTiesToEven); 366 V = Builder.CreateFAdd(V, V); 367 CII = cast<ConstrainedFPIntrinsic>(V); 368 EXPECT_EQ(fp::ebIgnore, CII->getExceptionBehavior()); 369 EXPECT_EQ(RoundingMode::NearestTiesToEven, CII->getRoundingMode()); 370 371 Builder.setDefaultConstrainedExcept(fp::ebMayTrap); 372 Builder.setDefaultConstrainedRounding(RoundingMode::TowardNegative); 373 V = Builder.CreateFAdd(V, V); 374 CII = cast<ConstrainedFPIntrinsic>(V); 375 EXPECT_EQ(fp::ebMayTrap, CII->getExceptionBehavior()); 376 EXPECT_EQ(RoundingMode::TowardNegative, CII->getRoundingMode()); 377 378 Builder.setDefaultConstrainedExcept(fp::ebStrict); 379 Builder.setDefaultConstrainedRounding(RoundingMode::TowardZero); 380 V = Builder.CreateFAdd(V, V); 381 CII = cast<ConstrainedFPIntrinsic>(V); 382 EXPECT_EQ(fp::ebStrict, CII->getExceptionBehavior()); 383 EXPECT_EQ(RoundingMode::TowardZero, CII->getRoundingMode()); 384 385 Builder.setDefaultConstrainedExcept(fp::ebIgnore); 386 Builder.setDefaultConstrainedRounding(RoundingMode::Dynamic); 387 V = Builder.CreateFAdd(V, V); 388 CII = cast<ConstrainedFPIntrinsic>(V); 389 EXPECT_EQ(fp::ebIgnore, CII->getExceptionBehavior()); 390 EXPECT_EQ(RoundingMode::Dynamic, CII->getRoundingMode()); 391 392 // Now override the defaults. 393 Call = Builder.CreateConstrainedFPBinOp( 394 Intrinsic::experimental_constrained_fadd, V, V, nullptr, "", nullptr, 395 RoundingMode::TowardNegative, fp::ebMayTrap); 396 CII = cast<ConstrainedFPIntrinsic>(Call); 397 EXPECT_EQ(CII->getIntrinsicID(), Intrinsic::experimental_constrained_fadd); 398 EXPECT_EQ(fp::ebMayTrap, CII->getExceptionBehavior()); 399 EXPECT_EQ(RoundingMode::TowardNegative, CII->getRoundingMode()); 400 401 Builder.CreateRetVoid(); 402 EXPECT_FALSE(verifyModule(*M)); 403 } 404 405 TEST_F(IRBuilderTest, ConstrainedFPIntrinsics) { 406 IRBuilder<> Builder(BB); 407 Value *V; 408 Value *VDouble; 409 ConstrainedFPIntrinsic *CII; 410 GlobalVariable *GVDouble = new GlobalVariable( 411 *M, Type::getDoubleTy(Ctx), true, GlobalValue::ExternalLinkage, nullptr); 412 VDouble = Builder.CreateLoad(GVDouble->getValueType(), GVDouble); 413 414 Builder.setDefaultConstrainedExcept(fp::ebStrict); 415 Builder.setDefaultConstrainedRounding(RoundingMode::TowardZero); 416 Function *Fn = Intrinsic::getDeclaration(M.get(), 417 Intrinsic::experimental_constrained_roundeven, { Type::getDoubleTy(Ctx) }); 418 V = Builder.CreateConstrainedFPCall(Fn, { VDouble }); 419 CII = cast<ConstrainedFPIntrinsic>(V); 420 EXPECT_EQ(Intrinsic::experimental_constrained_roundeven, CII->getIntrinsicID()); 421 EXPECT_EQ(fp::ebStrict, CII->getExceptionBehavior()); 422 } 423 424 TEST_F(IRBuilderTest, ConstrainedFPFunctionCall) { 425 IRBuilder<> Builder(BB); 426 427 // Create an empty constrained FP function. 428 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), 429 /*isVarArg=*/false); 430 Function *Callee = 431 Function::Create(FTy, Function::ExternalLinkage, "", M.get()); 432 BasicBlock *CalleeBB = BasicBlock::Create(Ctx, "", Callee); 433 IRBuilder<> CalleeBuilder(CalleeBB); 434 CalleeBuilder.setIsFPConstrained(true); 435 CalleeBuilder.setConstrainedFPFunctionAttr(); 436 CalleeBuilder.CreateRetVoid(); 437 438 // Now call the empty constrained FP function. 439 Builder.setIsFPConstrained(true); 440 Builder.setConstrainedFPFunctionAttr(); 441 CallInst *FCall = Builder.CreateCall(Callee, {}); 442 443 // Check the attributes to verify the strictfp attribute is on the call. 444 EXPECT_TRUE( 445 FCall->getAttributes().getFnAttrs().hasAttribute(Attribute::StrictFP)); 446 447 Builder.CreateRetVoid(); 448 EXPECT_FALSE(verifyModule(*M)); 449 } 450 451 TEST_F(IRBuilderTest, Lifetime) { 452 IRBuilder<> Builder(BB); 453 AllocaInst *Var1 = Builder.CreateAlloca(Builder.getInt8Ty()); 454 AllocaInst *Var2 = Builder.CreateAlloca(Builder.getInt32Ty()); 455 AllocaInst *Var3 = Builder.CreateAlloca(Builder.getInt8Ty(), 456 Builder.getInt32(123)); 457 458 CallInst *Start1 = Builder.CreateLifetimeStart(Var1); 459 CallInst *Start2 = Builder.CreateLifetimeStart(Var2); 460 CallInst *Start3 = Builder.CreateLifetimeStart(Var3, Builder.getInt64(100)); 461 462 EXPECT_EQ(Start1->getArgOperand(0), Builder.getInt64(-1)); 463 EXPECT_EQ(Start2->getArgOperand(0), Builder.getInt64(-1)); 464 EXPECT_EQ(Start3->getArgOperand(0), Builder.getInt64(100)); 465 466 EXPECT_EQ(Start1->getArgOperand(1), Var1); 467 EXPECT_EQ(Start2->getArgOperand(1)->stripPointerCasts(), Var2); 468 EXPECT_EQ(Start3->getArgOperand(1), Var3); 469 470 Value *End1 = Builder.CreateLifetimeEnd(Var1); 471 Builder.CreateLifetimeEnd(Var2); 472 Builder.CreateLifetimeEnd(Var3); 473 474 IntrinsicInst *II_Start1 = dyn_cast<IntrinsicInst>(Start1); 475 IntrinsicInst *II_End1 = dyn_cast<IntrinsicInst>(End1); 476 ASSERT_TRUE(II_Start1 != nullptr); 477 EXPECT_EQ(II_Start1->getIntrinsicID(), Intrinsic::lifetime_start); 478 ASSERT_TRUE(II_End1 != nullptr); 479 EXPECT_EQ(II_End1->getIntrinsicID(), Intrinsic::lifetime_end); 480 } 481 482 TEST_F(IRBuilderTest, CreateCondBr) { 483 IRBuilder<> Builder(BB); 484 BasicBlock *TBB = BasicBlock::Create(Ctx, "", F); 485 BasicBlock *FBB = BasicBlock::Create(Ctx, "", F); 486 487 BranchInst *BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB); 488 Instruction *TI = BB->getTerminator(); 489 EXPECT_EQ(BI, TI); 490 EXPECT_EQ(2u, TI->getNumSuccessors()); 491 EXPECT_EQ(TBB, TI->getSuccessor(0)); 492 EXPECT_EQ(FBB, TI->getSuccessor(1)); 493 494 BI->eraseFromParent(); 495 MDNode *Weights = MDBuilder(Ctx).createBranchWeights(42, 13); 496 BI = Builder.CreateCondBr(Builder.getTrue(), TBB, FBB, Weights); 497 TI = BB->getTerminator(); 498 EXPECT_EQ(BI, TI); 499 EXPECT_EQ(2u, TI->getNumSuccessors()); 500 EXPECT_EQ(TBB, TI->getSuccessor(0)); 501 EXPECT_EQ(FBB, TI->getSuccessor(1)); 502 EXPECT_EQ(Weights, TI->getMetadata(LLVMContext::MD_prof)); 503 } 504 505 TEST_F(IRBuilderTest, LandingPadName) { 506 IRBuilder<> Builder(BB); 507 LandingPadInst *LP = Builder.CreateLandingPad(Builder.getInt32Ty(), 0, "LP"); 508 EXPECT_EQ(LP->getName(), "LP"); 509 } 510 511 TEST_F(IRBuilderTest, DataLayout) { 512 std::unique_ptr<Module> M(new Module("test", Ctx)); 513 M->setDataLayout("e-n32"); 514 EXPECT_TRUE(M->getDataLayout().isLegalInteger(32)); 515 M->setDataLayout("e"); 516 EXPECT_FALSE(M->getDataLayout().isLegalInteger(32)); 517 } 518 519 TEST_F(IRBuilderTest, GetIntTy) { 520 IRBuilder<> Builder(BB); 521 IntegerType *Ty1 = Builder.getInt1Ty(); 522 EXPECT_EQ(Ty1, IntegerType::get(Ctx, 1)); 523 524 const DataLayout &DL = M->getDataLayout(); 525 IntegerType *IntPtrTy = Builder.getIntPtrTy(DL); 526 unsigned IntPtrBitSize = DL.getPointerSizeInBits(0); 527 EXPECT_EQ(IntPtrTy, IntegerType::get(Ctx, IntPtrBitSize)); 528 } 529 530 TEST_F(IRBuilderTest, UnaryOperators) { 531 IRBuilder<NoFolder> Builder(BB); 532 Value *V = Builder.CreateLoad(GV->getValueType(), GV); 533 534 // Test CreateUnOp(X) 535 Value *U = Builder.CreateUnOp(Instruction::FNeg, V); 536 ASSERT_TRUE(isa<Instruction>(U)); 537 ASSERT_TRUE(isa<FPMathOperator>(U)); 538 ASSERT_TRUE(isa<UnaryOperator>(U)); 539 ASSERT_FALSE(isa<BinaryOperator>(U)); 540 541 // Test CreateFNegFMF(X) 542 Instruction *I = cast<Instruction>(U); 543 I->setHasNoSignedZeros(true); 544 I->setHasNoNaNs(true); 545 Value *VFMF = Builder.CreateFNegFMF(V, I); 546 Instruction *IFMF = cast<Instruction>(VFMF); 547 EXPECT_TRUE(IFMF->hasNoSignedZeros()); 548 EXPECT_TRUE(IFMF->hasNoNaNs()); 549 EXPECT_FALSE(IFMF->hasAllowReassoc()); 550 } 551 552 TEST_F(IRBuilderTest, FastMathFlags) { 553 IRBuilder<> Builder(BB); 554 Value *F, *FC; 555 Instruction *FDiv, *FAdd, *FCmp, *FCall, *FNeg, *FSub, *FMul, *FRem; 556 557 F = Builder.CreateLoad(GV->getValueType(), GV); 558 F = Builder.CreateFAdd(F, F); 559 560 EXPECT_FALSE(Builder.getFastMathFlags().any()); 561 ASSERT_TRUE(isa<Instruction>(F)); 562 FAdd = cast<Instruction>(F); 563 EXPECT_FALSE(FAdd->hasNoNaNs()); 564 565 FastMathFlags FMF; 566 Builder.setFastMathFlags(FMF); 567 568 // By default, no flags are set. 569 F = Builder.CreateFAdd(F, F); 570 EXPECT_FALSE(Builder.getFastMathFlags().any()); 571 ASSERT_TRUE(isa<Instruction>(F)); 572 FAdd = cast<Instruction>(F); 573 EXPECT_FALSE(FAdd->hasNoNaNs()); 574 EXPECT_FALSE(FAdd->hasNoInfs()); 575 EXPECT_FALSE(FAdd->hasNoSignedZeros()); 576 EXPECT_FALSE(FAdd->hasAllowReciprocal()); 577 EXPECT_FALSE(FAdd->hasAllowContract()); 578 EXPECT_FALSE(FAdd->hasAllowReassoc()); 579 EXPECT_FALSE(FAdd->hasApproxFunc()); 580 581 // Set all flags in the instruction. 582 FAdd->setFast(true); 583 EXPECT_TRUE(FAdd->hasNoNaNs()); 584 EXPECT_TRUE(FAdd->hasNoInfs()); 585 EXPECT_TRUE(FAdd->hasNoSignedZeros()); 586 EXPECT_TRUE(FAdd->hasAllowReciprocal()); 587 EXPECT_TRUE(FAdd->hasAllowContract()); 588 EXPECT_TRUE(FAdd->hasAllowReassoc()); 589 EXPECT_TRUE(FAdd->hasApproxFunc()); 590 591 // All flags are set in the builder. 592 FMF.setFast(); 593 Builder.setFastMathFlags(FMF); 594 595 F = Builder.CreateFAdd(F, F); 596 EXPECT_TRUE(Builder.getFastMathFlags().any()); 597 EXPECT_TRUE(Builder.getFastMathFlags().all()); 598 ASSERT_TRUE(isa<Instruction>(F)); 599 FAdd = cast<Instruction>(F); 600 EXPECT_TRUE(FAdd->hasNoNaNs()); 601 EXPECT_TRUE(FAdd->isFast()); 602 603 // Now, try it with CreateBinOp 604 F = Builder.CreateBinOp(Instruction::FAdd, F, F); 605 EXPECT_TRUE(Builder.getFastMathFlags().any()); 606 ASSERT_TRUE(isa<Instruction>(F)); 607 FAdd = cast<Instruction>(F); 608 EXPECT_TRUE(FAdd->hasNoNaNs()); 609 EXPECT_TRUE(FAdd->isFast()); 610 611 F = Builder.CreateFDiv(F, F); 612 EXPECT_TRUE(Builder.getFastMathFlags().all()); 613 ASSERT_TRUE(isa<Instruction>(F)); 614 FDiv = cast<Instruction>(F); 615 EXPECT_TRUE(FDiv->hasAllowReciprocal()); 616 617 // Clear all FMF in the builder. 618 Builder.clearFastMathFlags(); 619 620 F = Builder.CreateFDiv(F, F); 621 ASSERT_TRUE(isa<Instruction>(F)); 622 FDiv = cast<Instruction>(F); 623 EXPECT_FALSE(FDiv->hasAllowReciprocal()); 624 625 // Try individual flags. 626 FMF.clear(); 627 FMF.setAllowReciprocal(); 628 Builder.setFastMathFlags(FMF); 629 630 F = Builder.CreateFDiv(F, F); 631 EXPECT_TRUE(Builder.getFastMathFlags().any()); 632 EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal); 633 ASSERT_TRUE(isa<Instruction>(F)); 634 FDiv = cast<Instruction>(F); 635 EXPECT_TRUE(FDiv->hasAllowReciprocal()); 636 637 Builder.clearFastMathFlags(); 638 639 FC = Builder.CreateFCmpOEQ(F, F); 640 ASSERT_TRUE(isa<Instruction>(FC)); 641 FCmp = cast<Instruction>(FC); 642 EXPECT_FALSE(FCmp->hasAllowReciprocal()); 643 644 FMF.clear(); 645 FMF.setAllowReciprocal(); 646 Builder.setFastMathFlags(FMF); 647 648 FC = Builder.CreateFCmpOEQ(F, F); 649 EXPECT_TRUE(Builder.getFastMathFlags().any()); 650 EXPECT_TRUE(Builder.getFastMathFlags().AllowReciprocal); 651 ASSERT_TRUE(isa<Instruction>(FC)); 652 FCmp = cast<Instruction>(FC); 653 EXPECT_TRUE(FCmp->hasAllowReciprocal()); 654 655 Builder.clearFastMathFlags(); 656 657 // Test FP-contract 658 FC = Builder.CreateFAdd(F, F); 659 ASSERT_TRUE(isa<Instruction>(FC)); 660 FAdd = cast<Instruction>(FC); 661 EXPECT_FALSE(FAdd->hasAllowContract()); 662 663 FMF.clear(); 664 FMF.setAllowContract(true); 665 Builder.setFastMathFlags(FMF); 666 667 FC = Builder.CreateFAdd(F, F); 668 EXPECT_TRUE(Builder.getFastMathFlags().any()); 669 EXPECT_TRUE(Builder.getFastMathFlags().AllowContract); 670 ASSERT_TRUE(isa<Instruction>(FC)); 671 FAdd = cast<Instruction>(FC); 672 EXPECT_TRUE(FAdd->hasAllowContract()); 673 674 FMF.setApproxFunc(); 675 Builder.clearFastMathFlags(); 676 Builder.setFastMathFlags(FMF); 677 // Now 'aml' and 'contract' are set. 678 F = Builder.CreateFMul(F, F); 679 FAdd = cast<Instruction>(F); 680 EXPECT_TRUE(FAdd->hasApproxFunc()); 681 EXPECT_TRUE(FAdd->hasAllowContract()); 682 EXPECT_FALSE(FAdd->hasAllowReassoc()); 683 684 FMF.setAllowReassoc(); 685 Builder.clearFastMathFlags(); 686 Builder.setFastMathFlags(FMF); 687 // Now 'aml' and 'contract' and 'reassoc' are set. 688 F = Builder.CreateFMul(F, F); 689 FAdd = cast<Instruction>(F); 690 EXPECT_TRUE(FAdd->hasApproxFunc()); 691 EXPECT_TRUE(FAdd->hasAllowContract()); 692 EXPECT_TRUE(FAdd->hasAllowReassoc()); 693 694 // Test a call with FMF. 695 auto CalleeTy = FunctionType::get(Type::getFloatTy(Ctx), 696 /*isVarArg=*/false); 697 auto Callee = 698 Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); 699 700 FCall = Builder.CreateCall(Callee, {}); 701 EXPECT_FALSE(FCall->hasNoNaNs()); 702 703 Function *V = 704 Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); 705 FCall = Builder.CreateCall(V, {}); 706 EXPECT_FALSE(FCall->hasNoNaNs()); 707 708 FMF.clear(); 709 FMF.setNoNaNs(); 710 Builder.setFastMathFlags(FMF); 711 712 FCall = Builder.CreateCall(Callee, {}); 713 EXPECT_TRUE(Builder.getFastMathFlags().any()); 714 EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs); 715 EXPECT_TRUE(FCall->hasNoNaNs()); 716 717 FCall = Builder.CreateCall(V, {}); 718 EXPECT_TRUE(Builder.getFastMathFlags().any()); 719 EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs); 720 EXPECT_TRUE(FCall->hasNoNaNs()); 721 722 Builder.clearFastMathFlags(); 723 724 // To test a copy, make sure that a '0' and a '1' change state. 725 F = Builder.CreateFDiv(F, F); 726 ASSERT_TRUE(isa<Instruction>(F)); 727 FDiv = cast<Instruction>(F); 728 EXPECT_FALSE(FDiv->getFastMathFlags().any()); 729 FDiv->setHasAllowReciprocal(true); 730 FAdd->setHasAllowReciprocal(false); 731 FAdd->setHasNoNaNs(true); 732 FDiv->copyFastMathFlags(FAdd); 733 EXPECT_TRUE(FDiv->hasNoNaNs()); 734 EXPECT_FALSE(FDiv->hasAllowReciprocal()); 735 736 // Test that CreateF*FMF functions copy flags from the source instruction 737 // instead of using the builder default. 738 Instruction *const FMFSource = FAdd; 739 EXPECT_FALSE(Builder.getFastMathFlags().noNaNs()); 740 EXPECT_TRUE(FMFSource->hasNoNaNs()); 741 742 F = Builder.CreateFNegFMF(F, FMFSource); 743 ASSERT_TRUE(isa<Instruction>(F)); 744 FNeg = cast<Instruction>(F); 745 EXPECT_TRUE(FNeg->hasNoNaNs()); 746 F = Builder.CreateFAddFMF(F, F, FMFSource); 747 ASSERT_TRUE(isa<Instruction>(F)); 748 FAdd = cast<Instruction>(F); 749 EXPECT_TRUE(FAdd->hasNoNaNs()); 750 F = Builder.CreateFSubFMF(F, F, FMFSource); 751 ASSERT_TRUE(isa<Instruction>(F)); 752 FSub = cast<Instruction>(F); 753 EXPECT_TRUE(FSub->hasNoNaNs()); 754 F = Builder.CreateFMulFMF(F, F, FMFSource); 755 ASSERT_TRUE(isa<Instruction>(F)); 756 FMul = cast<Instruction>(F); 757 EXPECT_TRUE(FMul->hasNoNaNs()); 758 F = Builder.CreateFDivFMF(F, F, FMFSource); 759 ASSERT_TRUE(isa<Instruction>(F)); 760 FDiv = cast<Instruction>(F); 761 EXPECT_TRUE(FDiv->hasNoNaNs()); 762 F = Builder.CreateFRemFMF(F, F, FMFSource); 763 ASSERT_TRUE(isa<Instruction>(F)); 764 FRem = cast<Instruction>(F); 765 EXPECT_TRUE(FRem->hasNoNaNs()); 766 } 767 768 TEST_F(IRBuilderTest, WrapFlags) { 769 IRBuilder<NoFolder> Builder(BB); 770 771 // Test instructions. 772 GlobalVariable *G = new GlobalVariable(*M, Builder.getInt32Ty(), true, 773 GlobalValue::ExternalLinkage, nullptr); 774 Value *V = Builder.CreateLoad(G->getValueType(), G); 775 EXPECT_TRUE( 776 cast<BinaryOperator>(Builder.CreateNSWAdd(V, V))->hasNoSignedWrap()); 777 EXPECT_TRUE( 778 cast<BinaryOperator>(Builder.CreateNSWMul(V, V))->hasNoSignedWrap()); 779 EXPECT_TRUE( 780 cast<BinaryOperator>(Builder.CreateNSWSub(V, V))->hasNoSignedWrap()); 781 EXPECT_TRUE(cast<BinaryOperator>( 782 Builder.CreateShl(V, V, "", /* NUW */ false, /* NSW */ true)) 783 ->hasNoSignedWrap()); 784 785 EXPECT_TRUE( 786 cast<BinaryOperator>(Builder.CreateNUWAdd(V, V))->hasNoUnsignedWrap()); 787 EXPECT_TRUE( 788 cast<BinaryOperator>(Builder.CreateNUWMul(V, V))->hasNoUnsignedWrap()); 789 EXPECT_TRUE( 790 cast<BinaryOperator>(Builder.CreateNUWSub(V, V))->hasNoUnsignedWrap()); 791 EXPECT_TRUE(cast<BinaryOperator>( 792 Builder.CreateShl(V, V, "", /* NUW */ true, /* NSW */ false)) 793 ->hasNoUnsignedWrap()); 794 795 // Test operators created with constants. 796 Constant *C = Builder.getInt32(42); 797 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWAdd(C, C)) 798 ->hasNoSignedWrap()); 799 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWSub(C, C)) 800 ->hasNoSignedWrap()); 801 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWMul(C, C)) 802 ->hasNoSignedWrap()); 803 EXPECT_TRUE(cast<OverflowingBinaryOperator>( 804 Builder.CreateShl(C, C, "", /* NUW */ false, /* NSW */ true)) 805 ->hasNoSignedWrap()); 806 807 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWAdd(C, C)) 808 ->hasNoUnsignedWrap()); 809 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWSub(C, C)) 810 ->hasNoUnsignedWrap()); 811 EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWMul(C, C)) 812 ->hasNoUnsignedWrap()); 813 EXPECT_TRUE(cast<OverflowingBinaryOperator>( 814 Builder.CreateShl(C, C, "", /* NUW */ true, /* NSW */ false)) 815 ->hasNoUnsignedWrap()); 816 } 817 818 TEST_F(IRBuilderTest, RAIIHelpersTest) { 819 IRBuilder<> Builder(BB); 820 EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal()); 821 MDBuilder MDB(M->getContext()); 822 823 MDNode *FPMathA = MDB.createFPMath(0.01f); 824 MDNode *FPMathB = MDB.createFPMath(0.1f); 825 826 Builder.setDefaultFPMathTag(FPMathA); 827 828 { 829 IRBuilder<>::FastMathFlagGuard Guard(Builder); 830 FastMathFlags FMF; 831 FMF.setAllowReciprocal(); 832 Builder.setFastMathFlags(FMF); 833 Builder.setDefaultFPMathTag(FPMathB); 834 EXPECT_TRUE(Builder.getFastMathFlags().allowReciprocal()); 835 EXPECT_EQ(FPMathB, Builder.getDefaultFPMathTag()); 836 } 837 838 EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal()); 839 EXPECT_EQ(FPMathA, Builder.getDefaultFPMathTag()); 840 841 Value *F = Builder.CreateLoad(GV->getValueType(), GV); 842 843 { 844 IRBuilder<>::InsertPointGuard Guard(Builder); 845 Builder.SetInsertPoint(cast<Instruction>(F)); 846 EXPECT_EQ(F, &*Builder.GetInsertPoint()); 847 } 848 849 EXPECT_EQ(BB->end(), Builder.GetInsertPoint()); 850 EXPECT_EQ(BB, Builder.GetInsertBlock()); 851 } 852 853 TEST_F(IRBuilderTest, createFunction) { 854 IRBuilder<> Builder(BB); 855 DIBuilder DIB(*M); 856 auto File = DIB.createFile("error.swift", "/"); 857 auto CU = 858 DIB.createCompileUnit(dwarf::DW_LANG_Swift, File, "swiftc", true, "", 0); 859 auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray({})); 860 auto NoErr = DIB.createFunction( 861 CU, "noerr", "", File, 1, Type, 1, DINode::FlagZero, 862 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 863 EXPECT_TRUE(!NoErr->getThrownTypes()); 864 auto Int = DIB.createBasicType("Int", 64, dwarf::DW_ATE_signed); 865 auto Error = DIB.getOrCreateArray({Int}); 866 auto Err = DIB.createFunction( 867 CU, "err", "", File, 1, Type, 1, DINode::FlagZero, 868 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized, nullptr, 869 nullptr, Error.get()); 870 EXPECT_TRUE(Err->getThrownTypes().get() == Error.get()); 871 DIB.finalize(); 872 } 873 874 TEST_F(IRBuilderTest, DIBuilder) { 875 auto GetLastDbgRecord = [](const Instruction *I) -> DbgRecord * { 876 if (I->getDbgRecordRange().empty()) 877 return nullptr; 878 return &*std::prev(I->getDbgRecordRange().end()); 879 }; 880 881 auto ExpectOrder = [&](DbgInstPtr First, BasicBlock::iterator Second) { 882 if (M->IsNewDbgInfoFormat) { 883 EXPECT_TRUE(First.is<DbgRecord *>()); 884 EXPECT_FALSE(Second->getDbgRecordRange().empty()); 885 EXPECT_EQ(GetLastDbgRecord(&*Second), First.get<DbgRecord *>()); 886 } else { 887 EXPECT_TRUE(First.is<Instruction *>()); 888 EXPECT_EQ(&*std::prev(Second), First.get<Instruction *>()); 889 } 890 }; 891 892 auto RunTest = [&]() { 893 IRBuilder<> Builder(BB); 894 DIBuilder DIB(*M); 895 auto File = DIB.createFile("F.CBL", "/"); 896 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, 897 DIB.createFile("F.CBL", "/"), 898 "llvm-cobol74", true, "", 0); 899 auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray({})); 900 auto SP = DIB.createFunction( 901 CU, "foo", "", File, 1, Type, 1, DINode::FlagZero, 902 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 903 F->setSubprogram(SP); 904 AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty()); 905 auto BarSP = DIB.createFunction( 906 CU, "bar", "", File, 1, Type, 1, DINode::FlagZero, 907 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 908 auto BarScope = DIB.createLexicalBlockFile(BarSP, File, 0); 909 I->setDebugLoc(DILocation::get(Ctx, 2, 0, BarScope)); 910 911 // Create another instruction so that there's one before the alloca we're 912 // inserting debug intrinsics before, to make end-checking easier. 913 I = Builder.CreateAlloca(Builder.getInt1Ty()); 914 915 // Label metadata and records 916 // -------------------------- 917 DILocation *LabelLoc = DILocation::get(Ctx, 1, 0, BarScope); 918 DILabel *AlwaysPreserveLabel = DIB.createLabel( 919 BarScope, "meles_meles", File, 1, /*AlwaysPreserve*/ true); 920 DILabel *Label = 921 DIB.createLabel(BarScope, "badger", File, 1, /*AlwaysPreserve*/ false); 922 923 { /* dbg.label | DbgLabelRecord */ 924 // Insert before I and check order. 925 ExpectOrder(DIB.insertLabel(Label, LabelLoc, I), I->getIterator()); 926 927 // We should be able to insert at the end of the block, even if there's 928 // no terminator yet. Note that in RemoveDIs mode this record won't get 929 // inserted into the block untill another instruction is added. 930 DbgInstPtr LabelRecord = DIB.insertLabel(Label, LabelLoc, BB); 931 // Specifically do not insert a terminator, to check this works. `I` 932 // should have absorbed the DbgLabelRecord in the new debug info mode. 933 I = Builder.CreateAlloca(Builder.getInt32Ty()); 934 ExpectOrder(LabelRecord, I->getIterator()); 935 } 936 937 // Variable metadata and records 938 // ----------------------------- 939 DILocation *VarLoc = DILocation::get(Ctx, 2, 0, BarScope); 940 auto *IntType = DIB.createBasicType("int", 32, dwarf::DW_ATE_signed); 941 DILocalVariable *VarX = 942 DIB.createAutoVariable(BarSP, "X", File, 2, IntType, true); 943 DILocalVariable *VarY = 944 DIB.createAutoVariable(BarSP, "Y", File, 2, IntType, true); 945 { /* dbg.value | DbgVariableRecord::Value */ 946 ExpectOrder(DIB.insertDbgValueIntrinsic(I, VarX, DIB.createExpression(), 947 VarLoc, I), 948 I->getIterator()); 949 // Check inserting at end of the block works as with labels. 950 DbgInstPtr VarXValue = DIB.insertDbgValueIntrinsic( 951 I, VarX, DIB.createExpression(), VarLoc, BB); 952 I = Builder.CreateAlloca(Builder.getInt32Ty()); 953 ExpectOrder(VarXValue, I->getIterator()); 954 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 955 } 956 { /* dbg.declare | DbgVariableRecord::Declare */ 957 ExpectOrder(DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, I), 958 I->getIterator()); 959 // Check inserting at end of the block works as with labels. 960 DbgInstPtr VarYDeclare = 961 DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, BB); 962 I = Builder.CreateAlloca(Builder.getInt32Ty()); 963 ExpectOrder(VarYDeclare, I->getIterator()); 964 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 965 } 966 { /* dbg.assign | DbgVariableRecord::Assign */ 967 I = Builder.CreateAlloca(Builder.getInt32Ty()); 968 I->setMetadata(LLVMContext::MD_DIAssignID, DIAssignID::getDistinct(Ctx)); 969 // DbgAssign interface is slightly different - it always inserts after the 970 // linked instr. Check we can do this with no instruction to insert 971 // before. 972 DbgInstPtr VarXAssign = 973 DIB.insertDbgAssign(I, I, VarX, DIB.createExpression(), I, 974 DIB.createExpression(), VarLoc); 975 I = Builder.CreateAlloca(Builder.getInt32Ty()); 976 ExpectOrder(VarXAssign, I->getIterator()); 977 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 978 } 979 980 Builder.CreateRet(nullptr); 981 DIB.finalize(); 982 // Check the labels are not/are added to Bar's retainedNodes array 983 // (AlwaysPreserve). 984 EXPECT_EQ(find(BarSP->getRetainedNodes(), Label), 985 BarSP->getRetainedNodes().end()); 986 EXPECT_NE(find(BarSP->getRetainedNodes(), AlwaysPreserveLabel), 987 BarSP->getRetainedNodes().end()); 988 EXPECT_NE(find(BarSP->getRetainedNodes(), VarX), 989 BarSP->getRetainedNodes().end()); 990 EXPECT_NE(find(BarSP->getRetainedNodes(), VarY), 991 BarSP->getRetainedNodes().end()); 992 EXPECT_TRUE(verifyModule(*M)); 993 }; 994 995 // Test in new-debug mode. 996 EXPECT_TRUE(M->IsNewDbgInfoFormat); 997 RunTest(); 998 999 // Test in old-debug mode. 1000 // Reset the test then call convertFromNewDbgValues to flip the flag 1001 // on the test's Module, Function and BasicBlock. 1002 TearDown(); 1003 SetUp(); 1004 M->convertFromNewDbgValues(); 1005 EXPECT_FALSE(M->IsNewDbgInfoFormat); 1006 RunTest(); 1007 } 1008 1009 TEST_F(IRBuilderTest, createArtificialSubprogram) { 1010 IRBuilder<> Builder(BB); 1011 DIBuilder DIB(*M); 1012 auto File = DIB.createFile("main.c", "/"); 1013 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang", 1014 /*isOptimized=*/true, /*Flags=*/"", 1015 /*Runtime Version=*/0); 1016 auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray({})); 1017 auto SP = DIB.createFunction( 1018 CU, "foo", /*LinkageName=*/"", File, 1019 /*LineNo=*/1, Type, /*ScopeLine=*/2, DINode::FlagZero, 1020 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 1021 EXPECT_TRUE(SP->isDistinct()); 1022 1023 F->setSubprogram(SP); 1024 AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty()); 1025 ReturnInst *R = Builder.CreateRetVoid(); 1026 I->setDebugLoc(DILocation::get(Ctx, 3, 2, SP)); 1027 R->setDebugLoc(DILocation::get(Ctx, 4, 2, SP)); 1028 DIB.finalize(); 1029 EXPECT_FALSE(verifyModule(*M)); 1030 1031 Function *G = Function::Create(F->getFunctionType(), 1032 Function::ExternalLinkage, "", M.get()); 1033 BasicBlock *GBB = BasicBlock::Create(Ctx, "", G); 1034 Builder.SetInsertPoint(GBB); 1035 I->removeFromParent(); 1036 Builder.Insert(I); 1037 Builder.CreateRetVoid(); 1038 EXPECT_FALSE(verifyModule(*M)); 1039 1040 DISubprogram *GSP = DIBuilder::createArtificialSubprogram(F->getSubprogram()); 1041 EXPECT_EQ(SP->getFile(), GSP->getFile()); 1042 EXPECT_EQ(SP->getType(), GSP->getType()); 1043 EXPECT_EQ(SP->getLine(), GSP->getLine()); 1044 EXPECT_EQ(SP->getScopeLine(), GSP->getScopeLine()); 1045 EXPECT_TRUE(GSP->isDistinct()); 1046 1047 G->setSubprogram(GSP); 1048 EXPECT_TRUE(verifyModule(*M)); 1049 1050 auto *InlinedAtNode = 1051 DILocation::getDistinct(Ctx, GSP->getScopeLine(), 0, GSP); 1052 DebugLoc DL = I->getDebugLoc(); 1053 DenseMap<const MDNode *, MDNode *> IANodes; 1054 auto IA = DebugLoc::appendInlinedAt(DL, InlinedAtNode, Ctx, IANodes); 1055 auto NewDL = 1056 DILocation::get(Ctx, DL.getLine(), DL.getCol(), DL.getScope(), IA); 1057 I->setDebugLoc(NewDL); 1058 EXPECT_FALSE(verifyModule(*M)); 1059 1060 EXPECT_EQ("foo", SP->getName()); 1061 EXPECT_EQ("foo", GSP->getName()); 1062 EXPECT_FALSE(SP->isArtificial()); 1063 EXPECT_TRUE(GSP->isArtificial()); 1064 } 1065 1066 // Check that we can add debug info to an existing DICompileUnit. 1067 TEST_F(IRBuilderTest, appendDebugInfo) { 1068 IRBuilder<> Builder(BB); 1069 Builder.CreateRetVoid(); 1070 EXPECT_FALSE(verifyModule(*M)); 1071 1072 auto GetNames = [](DICompileUnit *CU) { 1073 SmallVector<StringRef> Names; 1074 for (auto *ET : CU->getEnumTypes()) 1075 Names.push_back(ET->getName()); 1076 for (auto *RT : CU->getRetainedTypes()) 1077 Names.push_back(RT->getName()); 1078 for (auto *GV : CU->getGlobalVariables()) 1079 Names.push_back(GV->getVariable()->getName()); 1080 for (auto *IE : CU->getImportedEntities()) 1081 Names.push_back(IE->getName()); 1082 for (auto *Node : CU->getMacros()) 1083 if (auto *MN = dyn_cast_or_null<DIMacro>(Node)) 1084 Names.push_back(MN->getName()); 1085 return Names; 1086 }; 1087 1088 DICompileUnit *CU; 1089 { 1090 DIBuilder DIB(*M); 1091 auto *File = DIB.createFile("main.c", "/"); 1092 CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang", 1093 /*isOptimized=*/true, /*Flags=*/"", 1094 /*Runtime Version=*/0); 1095 auto *ByteTy = DIB.createBasicType("byte0", 8, dwarf::DW_ATE_signed); 1096 DIB.createEnumerationType(CU, "ET0", File, /*LineNo=*/0, /*SizeInBits=*/8, 1097 /*AlignInBits=*/8, /*Elements=*/{}, ByteTy); 1098 DIB.retainType(ByteTy); 1099 DIB.createGlobalVariableExpression(CU, "GV0", /*LinkageName=*/"", File, 1100 /*LineNo=*/1, ByteTy, 1101 /*IsLocalToUnit=*/true); 1102 DIB.createImportedDeclaration(CU, nullptr, File, /*LineNo=*/2, "IM0"); 1103 DIB.createMacro(nullptr, /*LineNo=*/0, dwarf::DW_MACINFO_define, "M0"); 1104 DIB.finalize(); 1105 } 1106 EXPECT_FALSE(verifyModule(*M)); 1107 EXPECT_THAT(GetNames(CU), 1108 UnorderedElementsAre("ET0", "byte0", "GV0", "IM0", "M0")); 1109 1110 { 1111 DIBuilder DIB(*M, true, CU); 1112 auto *File = CU->getFile(); 1113 auto *ByteTy = DIB.createBasicType("byte1", 8, dwarf::DW_ATE_signed); 1114 DIB.createEnumerationType(CU, "ET1", File, /*LineNo=*/0, 1115 /*SizeInBits=*/8, /*AlignInBits=*/8, 1116 /*Elements=*/{}, ByteTy); 1117 DIB.retainType(ByteTy); 1118 DIB.createGlobalVariableExpression(CU, "GV1", /*LinkageName=*/"", File, 1119 /*LineNo=*/1, ByteTy, 1120 /*IsLocalToUnit=*/true); 1121 DIB.createImportedDeclaration(CU, nullptr, File, /*LineNo=*/2, "IM1"); 1122 DIB.createMacro(nullptr, /*LineNo=*/0, dwarf::DW_MACINFO_define, "M1"); 1123 DIB.finalize(); 1124 } 1125 EXPECT_FALSE(verifyModule(*M)); 1126 EXPECT_THAT(GetNames(CU), 1127 UnorderedElementsAre("ET0", "byte0", "GV0", "IM0", "M0", "ET1", 1128 "byte1", "GV1", "IM1", "M1")); 1129 } 1130 1131 TEST_F(IRBuilderTest, InsertExtractElement) { 1132 IRBuilder<> Builder(BB); 1133 1134 auto VecTy = FixedVectorType::get(Builder.getInt64Ty(), 4); 1135 auto Elt1 = Builder.getInt64(-1); 1136 auto Elt2 = Builder.getInt64(-2); 1137 Value *Vec = Builder.CreateInsertElement(VecTy, Elt1, Builder.getInt8(1)); 1138 Vec = Builder.CreateInsertElement(Vec, Elt2, 2); 1139 auto X1 = Builder.CreateExtractElement(Vec, 1); 1140 auto X2 = Builder.CreateExtractElement(Vec, Builder.getInt32(2)); 1141 EXPECT_EQ(Elt1, X1); 1142 EXPECT_EQ(Elt2, X2); 1143 } 1144 1145 TEST_F(IRBuilderTest, CreateGlobalString) { 1146 IRBuilder<> Builder(BB); 1147 1148 auto String1a = Builder.CreateGlobalString("TestString", "String1a"); 1149 auto String1b = Builder.CreateGlobalString("TestString", "String1b", 0); 1150 auto String2 = Builder.CreateGlobalString("TestString", "String2", 1); 1151 auto String3 = Builder.CreateGlobalString("TestString", "String3", 2); 1152 1153 EXPECT_TRUE(String1a->getType()->getPointerAddressSpace() == 0); 1154 EXPECT_TRUE(String1b->getType()->getPointerAddressSpace() == 0); 1155 EXPECT_TRUE(String2->getType()->getPointerAddressSpace() == 1); 1156 EXPECT_TRUE(String3->getType()->getPointerAddressSpace() == 2); 1157 } 1158 1159 TEST_F(IRBuilderTest, DebugLoc) { 1160 auto CalleeTy = FunctionType::get(Type::getVoidTy(Ctx), 1161 /*isVarArg=*/false); 1162 auto Callee = 1163 Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); 1164 1165 DIBuilder DIB(*M); 1166 auto File = DIB.createFile("tmp.cpp", "/"); 1167 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C_plus_plus_11, 1168 DIB.createFile("tmp.cpp", "/"), "", true, "", 1169 0); 1170 auto SPType = DIB.createSubroutineType(DIB.getOrCreateTypeArray({})); 1171 auto SP = 1172 DIB.createFunction(CU, "foo", "foo", File, 1, SPType, 1, DINode::FlagZero, 1173 DISubprogram::SPFlagDefinition); 1174 DebugLoc DL1 = DILocation::get(Ctx, 2, 0, SP); 1175 DebugLoc DL2 = DILocation::get(Ctx, 3, 0, SP); 1176 1177 auto BB2 = BasicBlock::Create(Ctx, "bb2", F); 1178 auto Br = BranchInst::Create(BB2, BB); 1179 Br->setDebugLoc(DL1); 1180 1181 IRBuilder<> Builder(Ctx); 1182 Builder.SetInsertPoint(Br); 1183 EXPECT_EQ(DL1, Builder.getCurrentDebugLocation()); 1184 auto Call1 = Builder.CreateCall(Callee, {}); 1185 EXPECT_EQ(DL1, Call1->getDebugLoc()); 1186 1187 Call1->setDebugLoc(DL2); 1188 Builder.SetInsertPoint(Call1->getParent(), Call1->getIterator()); 1189 EXPECT_EQ(DL2, Builder.getCurrentDebugLocation()); 1190 auto Call2 = Builder.CreateCall(Callee, {}); 1191 EXPECT_EQ(DL2, Call2->getDebugLoc()); 1192 1193 DIB.finalize(); 1194 } 1195 1196 TEST_F(IRBuilderTest, DIImportedEntity) { 1197 IRBuilder<> Builder(BB); 1198 DIBuilder DIB(*M); 1199 auto F = DIB.createFile("F.CBL", "/"); 1200 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, 1201 F, "llvm-cobol74", 1202 true, "", 0); 1203 MDTuple *Elements = MDTuple::getDistinct(Ctx, {}); 1204 1205 DIB.createImportedDeclaration(CU, nullptr, F, 1); 1206 DIB.createImportedDeclaration(CU, nullptr, F, 1); 1207 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2); 1208 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2); 1209 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2, Elements); 1210 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2, Elements); 1211 DIB.finalize(); 1212 EXPECT_TRUE(verifyModule(*M)); 1213 EXPECT_TRUE(CU->getImportedEntities().size() == 3); 1214 } 1215 1216 // 0: #define M0 V0 <-- command line definition 1217 // 0: main.c <-- main file 1218 // 3: #define M1 V1 <-- M1 definition in main.c 1219 // 5: #include "file.h" <-- inclusion of file.h from main.c 1220 // 1: #define M2 <-- M2 definition in file.h with no value 1221 // 7: #undef M1 V1 <-- M1 un-definition in main.c 1222 TEST_F(IRBuilderTest, DIBuilderMacro) { 1223 IRBuilder<> Builder(BB); 1224 DIBuilder DIB(*M); 1225 auto File1 = DIB.createFile("main.c", "/"); 1226 auto File2 = DIB.createFile("file.h", "/"); 1227 auto CU = DIB.createCompileUnit( 1228 dwarf::DW_LANG_C, DIB.createFile("main.c", "/"), "llvm-c", true, "", 0); 1229 auto MDef0 = 1230 DIB.createMacro(nullptr, 0, dwarf::DW_MACINFO_define, "M0", "V0"); 1231 auto TMF1 = DIB.createTempMacroFile(nullptr, 0, File1); 1232 auto MDef1 = DIB.createMacro(TMF1, 3, dwarf::DW_MACINFO_define, "M1", "V1"); 1233 auto TMF2 = DIB.createTempMacroFile(TMF1, 5, File2); 1234 auto MDef2 = DIB.createMacro(TMF2, 1, dwarf::DW_MACINFO_define, "M2"); 1235 auto MUndef1 = DIB.createMacro(TMF1, 7, dwarf::DW_MACINFO_undef, "M1"); 1236 1237 EXPECT_EQ(dwarf::DW_MACINFO_define, MDef1->getMacinfoType()); 1238 EXPECT_EQ(3u, MDef1->getLine()); 1239 EXPECT_EQ("M1", MDef1->getName()); 1240 EXPECT_EQ("V1", MDef1->getValue()); 1241 1242 EXPECT_EQ(dwarf::DW_MACINFO_undef, MUndef1->getMacinfoType()); 1243 EXPECT_EQ(7u, MUndef1->getLine()); 1244 EXPECT_EQ("M1", MUndef1->getName()); 1245 EXPECT_EQ("", MUndef1->getValue()); 1246 1247 EXPECT_EQ(dwarf::DW_MACINFO_start_file, TMF2->getMacinfoType()); 1248 EXPECT_EQ(5u, TMF2->getLine()); 1249 EXPECT_EQ(File2, TMF2->getFile()); 1250 1251 DIB.finalize(); 1252 1253 SmallVector<Metadata *, 4> Elements; 1254 Elements.push_back(MDef2); 1255 auto MF2 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 5, File2, 1256 DIB.getOrCreateMacroArray(Elements)); 1257 1258 Elements.clear(); 1259 Elements.push_back(MDef1); 1260 Elements.push_back(MF2); 1261 Elements.push_back(MUndef1); 1262 auto MF1 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 0, File1, 1263 DIB.getOrCreateMacroArray(Elements)); 1264 1265 Elements.clear(); 1266 Elements.push_back(MDef0); 1267 Elements.push_back(MF1); 1268 auto MN0 = MDTuple::get(Ctx, Elements); 1269 EXPECT_EQ(MN0, CU->getRawMacros()); 1270 1271 Elements.clear(); 1272 Elements.push_back(MDef1); 1273 Elements.push_back(MF2); 1274 Elements.push_back(MUndef1); 1275 auto MN1 = MDTuple::get(Ctx, Elements); 1276 EXPECT_EQ(MN1, MF1->getRawElements()); 1277 1278 Elements.clear(); 1279 Elements.push_back(MDef2); 1280 auto MN2 = MDTuple::get(Ctx, Elements); 1281 EXPECT_EQ(MN2, MF2->getRawElements()); 1282 EXPECT_TRUE(verifyModule(*M)); 1283 } 1284 1285 TEST_F(IRBuilderTest, NoFolderNames) { 1286 IRBuilder<NoFolder> Builder(BB); 1287 auto *Add = 1288 Builder.CreateAdd(Builder.getInt32(1), Builder.getInt32(2), "add"); 1289 EXPECT_EQ(Add->getName(), "add"); 1290 } 1291 1292 TEST_F(IRBuilderTest, CTAD) { 1293 struct TestInserter : public IRBuilderDefaultInserter { 1294 TestInserter() = default; 1295 }; 1296 InstSimplifyFolder Folder(M->getDataLayout()); 1297 1298 IRBuilder Builder1(Ctx, Folder, TestInserter()); 1299 static_assert(std::is_same_v<decltype(Builder1), 1300 IRBuilder<InstSimplifyFolder, TestInserter>>); 1301 IRBuilder Builder2(Ctx); 1302 static_assert(std::is_same_v<decltype(Builder2), IRBuilder<>>); 1303 IRBuilder Builder3(BB, Folder); 1304 static_assert( 1305 std::is_same_v<decltype(Builder3), IRBuilder<InstSimplifyFolder>>); 1306 IRBuilder Builder4(BB); 1307 static_assert(std::is_same_v<decltype(Builder4), IRBuilder<>>); 1308 // The block BB is empty, so don't test this one. 1309 // IRBuilder Builder5(BB->getTerminator()); 1310 // static_assert(std::is_same_v<decltype(Builder5), IRBuilder<>>); 1311 IRBuilder Builder6(BB, BB->end(), Folder); 1312 static_assert( 1313 std::is_same_v<decltype(Builder6), IRBuilder<InstSimplifyFolder>>); 1314 IRBuilder Builder7(BB, BB->end()); 1315 static_assert(std::is_same_v<decltype(Builder7), IRBuilder<>>); 1316 } 1317 } 1318