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::experimental_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::experimental_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, std::nullopt); 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, std::nullopt); 701 EXPECT_FALSE(FCall->hasNoNaNs()); 702 703 Function *V = 704 Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); 705 FCall = Builder.CreateCall(V, std::nullopt); 706 EXPECT_FALSE(FCall->hasNoNaNs()); 707 708 FMF.clear(); 709 FMF.setNoNaNs(); 710 Builder.setFastMathFlags(FMF); 711 712 FCall = Builder.CreateCall(Callee, std::nullopt); 713 EXPECT_TRUE(Builder.getFastMathFlags().any()); 714 EXPECT_TRUE(Builder.getFastMathFlags().NoNaNs); 715 EXPECT_TRUE(FCall->hasNoNaNs()); 716 717 FCall = Builder.CreateCall(V, std::nullopt); 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(std::nullopt)); 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 = 900 DIB.createSubroutineType(DIB.getOrCreateTypeArray(std::nullopt)); 901 auto SP = DIB.createFunction( 902 CU, "foo", "", File, 1, Type, 1, DINode::FlagZero, 903 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 904 F->setSubprogram(SP); 905 AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty()); 906 auto BarSP = DIB.createFunction( 907 CU, "bar", "", File, 1, Type, 1, DINode::FlagZero, 908 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 909 auto BarScope = DIB.createLexicalBlockFile(BarSP, File, 0); 910 I->setDebugLoc(DILocation::get(Ctx, 2, 0, BarScope)); 911 912 // Create another instruction so that there's one before the alloca we're 913 // inserting debug intrinsics before, to make end-checking easier. 914 I = Builder.CreateAlloca(Builder.getInt1Ty()); 915 916 // Label metadata and records 917 // -------------------------- 918 DILocation *LabelLoc = DILocation::get(Ctx, 1, 0, BarScope); 919 DILabel *AlwaysPreserveLabel = DIB.createLabel( 920 BarScope, "meles_meles", File, 1, /*AlwaysPreserve*/ true); 921 DILabel *Label = 922 DIB.createLabel(BarScope, "badger", File, 1, /*AlwaysPreserve*/ false); 923 924 { /* dbg.label | DbgLabelRecord */ 925 // Insert before I and check order. 926 ExpectOrder(DIB.insertLabel(Label, LabelLoc, I), I->getIterator()); 927 928 // We should be able to insert at the end of the block, even if there's 929 // no terminator yet. Note that in RemoveDIs mode this record won't get 930 // inserted into the block untill another instruction is added. 931 DbgInstPtr LabelRecord = DIB.insertLabel(Label, LabelLoc, BB); 932 // Specifically do not insert a terminator, to check this works. `I` 933 // should have absorbed the DbgLabelRecord in the new debug info mode. 934 I = Builder.CreateAlloca(Builder.getInt32Ty()); 935 ExpectOrder(LabelRecord, I->getIterator()); 936 } 937 938 // Variable metadata and records 939 // ----------------------------- 940 DILocation *VarLoc = DILocation::get(Ctx, 2, 0, BarScope); 941 auto *IntType = DIB.createBasicType("int", 32, dwarf::DW_ATE_signed); 942 DILocalVariable *VarX = 943 DIB.createAutoVariable(BarSP, "X", File, 2, IntType, true); 944 DILocalVariable *VarY = 945 DIB.createAutoVariable(BarSP, "Y", File, 2, IntType, true); 946 { /* dbg.value | DbgVariableRecord::Value */ 947 ExpectOrder(DIB.insertDbgValueIntrinsic(I, VarX, DIB.createExpression(), 948 VarLoc, I), 949 I->getIterator()); 950 // Check inserting at end of the block works as with labels. 951 DbgInstPtr VarXValue = DIB.insertDbgValueIntrinsic( 952 I, VarX, DIB.createExpression(), VarLoc, BB); 953 I = Builder.CreateAlloca(Builder.getInt32Ty()); 954 ExpectOrder(VarXValue, I->getIterator()); 955 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 956 } 957 { /* dbg.declare | DbgVariableRecord::Declare */ 958 ExpectOrder(DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, I), 959 I->getIterator()); 960 // Check inserting at end of the block works as with labels. 961 DbgInstPtr VarYDeclare = 962 DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, BB); 963 I = Builder.CreateAlloca(Builder.getInt32Ty()); 964 ExpectOrder(VarYDeclare, I->getIterator()); 965 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 966 } 967 { /* dbg.assign | DbgVariableRecord::Assign */ 968 I = Builder.CreateAlloca(Builder.getInt32Ty()); 969 I->setMetadata(LLVMContext::MD_DIAssignID, DIAssignID::getDistinct(Ctx)); 970 // DbgAssign interface is slightly different - it always inserts after the 971 // linked instr. Check we can do this with no instruction to insert 972 // before. 973 DbgInstPtr VarXAssign = 974 DIB.insertDbgAssign(I, I, VarX, DIB.createExpression(), I, 975 DIB.createExpression(), VarLoc); 976 I = Builder.CreateAlloca(Builder.getInt32Ty()); 977 ExpectOrder(VarXAssign, I->getIterator()); 978 EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); 979 } 980 981 Builder.CreateRet(nullptr); 982 DIB.finalize(); 983 // Check the labels are not/are added to Bar's retainedNodes array 984 // (AlwaysPreserve). 985 EXPECT_EQ(find(BarSP->getRetainedNodes(), Label), 986 BarSP->getRetainedNodes().end()); 987 EXPECT_NE(find(BarSP->getRetainedNodes(), AlwaysPreserveLabel), 988 BarSP->getRetainedNodes().end()); 989 EXPECT_NE(find(BarSP->getRetainedNodes(), VarX), 990 BarSP->getRetainedNodes().end()); 991 EXPECT_NE(find(BarSP->getRetainedNodes(), VarY), 992 BarSP->getRetainedNodes().end()); 993 EXPECT_TRUE(verifyModule(*M)); 994 }; 995 996 // Test in new-debug mode. 997 EXPECT_TRUE(M->IsNewDbgInfoFormat); 998 RunTest(); 999 1000 // Test in old-debug mode. 1001 // Reset the test then call convertFromNewDbgValues to flip the flag 1002 // on the test's Module, Function and BasicBlock. 1003 TearDown(); 1004 SetUp(); 1005 M->convertFromNewDbgValues(); 1006 EXPECT_FALSE(M->IsNewDbgInfoFormat); 1007 RunTest(); 1008 } 1009 1010 TEST_F(IRBuilderTest, createArtificialSubprogram) { 1011 IRBuilder<> Builder(BB); 1012 DIBuilder DIB(*M); 1013 auto File = DIB.createFile("main.c", "/"); 1014 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang", 1015 /*isOptimized=*/true, /*Flags=*/"", 1016 /*Runtime Version=*/0); 1017 auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(std::nullopt)); 1018 auto SP = DIB.createFunction( 1019 CU, "foo", /*LinkageName=*/"", File, 1020 /*LineNo=*/1, Type, /*ScopeLine=*/2, DINode::FlagZero, 1021 DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized); 1022 EXPECT_TRUE(SP->isDistinct()); 1023 1024 F->setSubprogram(SP); 1025 AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty()); 1026 ReturnInst *R = Builder.CreateRetVoid(); 1027 I->setDebugLoc(DILocation::get(Ctx, 3, 2, SP)); 1028 R->setDebugLoc(DILocation::get(Ctx, 4, 2, SP)); 1029 DIB.finalize(); 1030 EXPECT_FALSE(verifyModule(*M)); 1031 1032 Function *G = Function::Create(F->getFunctionType(), 1033 Function::ExternalLinkage, "", M.get()); 1034 BasicBlock *GBB = BasicBlock::Create(Ctx, "", G); 1035 Builder.SetInsertPoint(GBB); 1036 I->removeFromParent(); 1037 Builder.Insert(I); 1038 Builder.CreateRetVoid(); 1039 EXPECT_FALSE(verifyModule(*M)); 1040 1041 DISubprogram *GSP = DIBuilder::createArtificialSubprogram(F->getSubprogram()); 1042 EXPECT_EQ(SP->getFile(), GSP->getFile()); 1043 EXPECT_EQ(SP->getType(), GSP->getType()); 1044 EXPECT_EQ(SP->getLine(), GSP->getLine()); 1045 EXPECT_EQ(SP->getScopeLine(), GSP->getScopeLine()); 1046 EXPECT_TRUE(GSP->isDistinct()); 1047 1048 G->setSubprogram(GSP); 1049 EXPECT_TRUE(verifyModule(*M)); 1050 1051 auto *InlinedAtNode = 1052 DILocation::getDistinct(Ctx, GSP->getScopeLine(), 0, GSP); 1053 DebugLoc DL = I->getDebugLoc(); 1054 DenseMap<const MDNode *, MDNode *> IANodes; 1055 auto IA = DebugLoc::appendInlinedAt(DL, InlinedAtNode, Ctx, IANodes); 1056 auto NewDL = 1057 DILocation::get(Ctx, DL.getLine(), DL.getCol(), DL.getScope(), IA); 1058 I->setDebugLoc(NewDL); 1059 EXPECT_FALSE(verifyModule(*M)); 1060 1061 EXPECT_EQ("foo", SP->getName()); 1062 EXPECT_EQ("foo", GSP->getName()); 1063 EXPECT_FALSE(SP->isArtificial()); 1064 EXPECT_TRUE(GSP->isArtificial()); 1065 } 1066 1067 // Check that we can add debug info to an existing DICompileUnit. 1068 TEST_F(IRBuilderTest, appendDebugInfo) { 1069 IRBuilder<> Builder(BB); 1070 Builder.CreateRetVoid(); 1071 EXPECT_FALSE(verifyModule(*M)); 1072 1073 auto GetNames = [](DICompileUnit *CU) { 1074 SmallVector<StringRef> Names; 1075 for (auto *ET : CU->getEnumTypes()) 1076 Names.push_back(ET->getName()); 1077 for (auto *RT : CU->getRetainedTypes()) 1078 Names.push_back(RT->getName()); 1079 for (auto *GV : CU->getGlobalVariables()) 1080 Names.push_back(GV->getVariable()->getName()); 1081 for (auto *IE : CU->getImportedEntities()) 1082 Names.push_back(IE->getName()); 1083 for (auto *Node : CU->getMacros()) 1084 if (auto *MN = dyn_cast_or_null<DIMacro>(Node)) 1085 Names.push_back(MN->getName()); 1086 return Names; 1087 }; 1088 1089 DICompileUnit *CU; 1090 { 1091 DIBuilder DIB(*M); 1092 auto *File = DIB.createFile("main.c", "/"); 1093 CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang", 1094 /*isOptimized=*/true, /*Flags=*/"", 1095 /*Runtime Version=*/0); 1096 auto *ByteTy = DIB.createBasicType("byte0", 8, dwarf::DW_ATE_signed); 1097 DIB.createEnumerationType(CU, "ET0", File, /*LineNo=*/0, /*SizeInBits=*/8, 1098 /*AlignInBits=*/8, /*Elements=*/{}, ByteTy); 1099 DIB.retainType(ByteTy); 1100 DIB.createGlobalVariableExpression(CU, "GV0", /*LinkageName=*/"", File, 1101 /*LineNo=*/1, ByteTy, 1102 /*IsLocalToUnit=*/true); 1103 DIB.createImportedDeclaration(CU, nullptr, File, /*LineNo=*/2, "IM0"); 1104 DIB.createMacro(nullptr, /*LineNo=*/0, dwarf::DW_MACINFO_define, "M0"); 1105 DIB.finalize(); 1106 } 1107 EXPECT_FALSE(verifyModule(*M)); 1108 EXPECT_THAT(GetNames(CU), 1109 UnorderedElementsAre("ET0", "byte0", "GV0", "IM0", "M0")); 1110 1111 { 1112 DIBuilder DIB(*M, true, CU); 1113 auto *File = CU->getFile(); 1114 auto *ByteTy = DIB.createBasicType("byte1", 8, dwarf::DW_ATE_signed); 1115 DIB.createEnumerationType(CU, "ET1", File, /*LineNo=*/0, 1116 /*SizeInBits=*/8, /*AlignInBits=*/8, 1117 /*Elements=*/{}, ByteTy); 1118 DIB.retainType(ByteTy); 1119 DIB.createGlobalVariableExpression(CU, "GV1", /*LinkageName=*/"", File, 1120 /*LineNo=*/1, ByteTy, 1121 /*IsLocalToUnit=*/true); 1122 DIB.createImportedDeclaration(CU, nullptr, File, /*LineNo=*/2, "IM1"); 1123 DIB.createMacro(nullptr, /*LineNo=*/0, dwarf::DW_MACINFO_define, "M1"); 1124 DIB.finalize(); 1125 } 1126 EXPECT_FALSE(verifyModule(*M)); 1127 EXPECT_THAT(GetNames(CU), 1128 UnorderedElementsAre("ET0", "byte0", "GV0", "IM0", "M0", "ET1", 1129 "byte1", "GV1", "IM1", "M1")); 1130 } 1131 1132 TEST_F(IRBuilderTest, InsertExtractElement) { 1133 IRBuilder<> Builder(BB); 1134 1135 auto VecTy = FixedVectorType::get(Builder.getInt64Ty(), 4); 1136 auto Elt1 = Builder.getInt64(-1); 1137 auto Elt2 = Builder.getInt64(-2); 1138 Value *Vec = Builder.CreateInsertElement(VecTy, Elt1, Builder.getInt8(1)); 1139 Vec = Builder.CreateInsertElement(Vec, Elt2, 2); 1140 auto X1 = Builder.CreateExtractElement(Vec, 1); 1141 auto X2 = Builder.CreateExtractElement(Vec, Builder.getInt32(2)); 1142 EXPECT_EQ(Elt1, X1); 1143 EXPECT_EQ(Elt2, X2); 1144 } 1145 1146 TEST_F(IRBuilderTest, CreateGlobalStringPtr) { 1147 IRBuilder<> Builder(BB); 1148 1149 auto String1a = Builder.CreateGlobalStringPtr("TestString", "String1a"); 1150 auto String1b = Builder.CreateGlobalStringPtr("TestString", "String1b", 0); 1151 auto String2 = Builder.CreateGlobalStringPtr("TestString", "String2", 1); 1152 auto String3 = Builder.CreateGlobalString("TestString", "String3", 2); 1153 1154 EXPECT_TRUE(String1a->getType()->getPointerAddressSpace() == 0); 1155 EXPECT_TRUE(String1b->getType()->getPointerAddressSpace() == 0); 1156 EXPECT_TRUE(String2->getType()->getPointerAddressSpace() == 1); 1157 EXPECT_TRUE(String3->getType()->getPointerAddressSpace() == 2); 1158 } 1159 1160 TEST_F(IRBuilderTest, DebugLoc) { 1161 auto CalleeTy = FunctionType::get(Type::getVoidTy(Ctx), 1162 /*isVarArg=*/false); 1163 auto Callee = 1164 Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); 1165 1166 DIBuilder DIB(*M); 1167 auto File = DIB.createFile("tmp.cpp", "/"); 1168 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C_plus_plus_11, 1169 DIB.createFile("tmp.cpp", "/"), "", true, "", 1170 0); 1171 auto SPType = 1172 DIB.createSubroutineType(DIB.getOrCreateTypeArray(std::nullopt)); 1173 auto SP = 1174 DIB.createFunction(CU, "foo", "foo", File, 1, SPType, 1, DINode::FlagZero, 1175 DISubprogram::SPFlagDefinition); 1176 DebugLoc DL1 = DILocation::get(Ctx, 2, 0, SP); 1177 DebugLoc DL2 = DILocation::get(Ctx, 3, 0, SP); 1178 1179 auto BB2 = BasicBlock::Create(Ctx, "bb2", F); 1180 auto Br = BranchInst::Create(BB2, BB); 1181 Br->setDebugLoc(DL1); 1182 1183 IRBuilder<> Builder(Ctx); 1184 Builder.SetInsertPoint(Br); 1185 EXPECT_EQ(DL1, Builder.getCurrentDebugLocation()); 1186 auto Call1 = Builder.CreateCall(Callee, std::nullopt); 1187 EXPECT_EQ(DL1, Call1->getDebugLoc()); 1188 1189 Call1->setDebugLoc(DL2); 1190 Builder.SetInsertPoint(Call1->getParent(), Call1->getIterator()); 1191 EXPECT_EQ(DL2, Builder.getCurrentDebugLocation()); 1192 auto Call2 = Builder.CreateCall(Callee, std::nullopt); 1193 EXPECT_EQ(DL2, Call2->getDebugLoc()); 1194 1195 DIB.finalize(); 1196 } 1197 1198 TEST_F(IRBuilderTest, DIImportedEntity) { 1199 IRBuilder<> Builder(BB); 1200 DIBuilder DIB(*M); 1201 auto F = DIB.createFile("F.CBL", "/"); 1202 auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, 1203 F, "llvm-cobol74", 1204 true, "", 0); 1205 MDTuple *Elements = MDTuple::getDistinct(Ctx, std::nullopt); 1206 1207 DIB.createImportedDeclaration(CU, nullptr, F, 1); 1208 DIB.createImportedDeclaration(CU, nullptr, F, 1); 1209 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2); 1210 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2); 1211 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2, Elements); 1212 DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2, Elements); 1213 DIB.finalize(); 1214 EXPECT_TRUE(verifyModule(*M)); 1215 EXPECT_TRUE(CU->getImportedEntities().size() == 3); 1216 } 1217 1218 // 0: #define M0 V0 <-- command line definition 1219 // 0: main.c <-- main file 1220 // 3: #define M1 V1 <-- M1 definition in main.c 1221 // 5: #include "file.h" <-- inclusion of file.h from main.c 1222 // 1: #define M2 <-- M2 definition in file.h with no value 1223 // 7: #undef M1 V1 <-- M1 un-definition in main.c 1224 TEST_F(IRBuilderTest, DIBuilderMacro) { 1225 IRBuilder<> Builder(BB); 1226 DIBuilder DIB(*M); 1227 auto File1 = DIB.createFile("main.c", "/"); 1228 auto File2 = DIB.createFile("file.h", "/"); 1229 auto CU = DIB.createCompileUnit( 1230 dwarf::DW_LANG_C, DIB.createFile("main.c", "/"), "llvm-c", true, "", 0); 1231 auto MDef0 = 1232 DIB.createMacro(nullptr, 0, dwarf::DW_MACINFO_define, "M0", "V0"); 1233 auto TMF1 = DIB.createTempMacroFile(nullptr, 0, File1); 1234 auto MDef1 = DIB.createMacro(TMF1, 3, dwarf::DW_MACINFO_define, "M1", "V1"); 1235 auto TMF2 = DIB.createTempMacroFile(TMF1, 5, File2); 1236 auto MDef2 = DIB.createMacro(TMF2, 1, dwarf::DW_MACINFO_define, "M2"); 1237 auto MUndef1 = DIB.createMacro(TMF1, 7, dwarf::DW_MACINFO_undef, "M1"); 1238 1239 EXPECT_EQ(dwarf::DW_MACINFO_define, MDef1->getMacinfoType()); 1240 EXPECT_EQ(3u, MDef1->getLine()); 1241 EXPECT_EQ("M1", MDef1->getName()); 1242 EXPECT_EQ("V1", MDef1->getValue()); 1243 1244 EXPECT_EQ(dwarf::DW_MACINFO_undef, MUndef1->getMacinfoType()); 1245 EXPECT_EQ(7u, MUndef1->getLine()); 1246 EXPECT_EQ("M1", MUndef1->getName()); 1247 EXPECT_EQ("", MUndef1->getValue()); 1248 1249 EXPECT_EQ(dwarf::DW_MACINFO_start_file, TMF2->getMacinfoType()); 1250 EXPECT_EQ(5u, TMF2->getLine()); 1251 EXPECT_EQ(File2, TMF2->getFile()); 1252 1253 DIB.finalize(); 1254 1255 SmallVector<Metadata *, 4> Elements; 1256 Elements.push_back(MDef2); 1257 auto MF2 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 5, File2, 1258 DIB.getOrCreateMacroArray(Elements)); 1259 1260 Elements.clear(); 1261 Elements.push_back(MDef1); 1262 Elements.push_back(MF2); 1263 Elements.push_back(MUndef1); 1264 auto MF1 = DIMacroFile::get(Ctx, dwarf::DW_MACINFO_start_file, 0, File1, 1265 DIB.getOrCreateMacroArray(Elements)); 1266 1267 Elements.clear(); 1268 Elements.push_back(MDef0); 1269 Elements.push_back(MF1); 1270 auto MN0 = MDTuple::get(Ctx, Elements); 1271 EXPECT_EQ(MN0, CU->getRawMacros()); 1272 1273 Elements.clear(); 1274 Elements.push_back(MDef1); 1275 Elements.push_back(MF2); 1276 Elements.push_back(MUndef1); 1277 auto MN1 = MDTuple::get(Ctx, Elements); 1278 EXPECT_EQ(MN1, MF1->getRawElements()); 1279 1280 Elements.clear(); 1281 Elements.push_back(MDef2); 1282 auto MN2 = MDTuple::get(Ctx, Elements); 1283 EXPECT_EQ(MN2, MF2->getRawElements()); 1284 EXPECT_TRUE(verifyModule(*M)); 1285 } 1286 1287 TEST_F(IRBuilderTest, NoFolderNames) { 1288 IRBuilder<NoFolder> Builder(BB); 1289 auto *Add = 1290 Builder.CreateAdd(Builder.getInt32(1), Builder.getInt32(2), "add"); 1291 EXPECT_EQ(Add->getName(), "add"); 1292 } 1293 1294 TEST_F(IRBuilderTest, CTAD) { 1295 struct TestInserter : public IRBuilderDefaultInserter { 1296 TestInserter() = default; 1297 }; 1298 InstSimplifyFolder Folder(M->getDataLayout()); 1299 1300 IRBuilder Builder1(Ctx, Folder, TestInserter()); 1301 static_assert(std::is_same_v<decltype(Builder1), 1302 IRBuilder<InstSimplifyFolder, TestInserter>>); 1303 IRBuilder Builder2(Ctx); 1304 static_assert(std::is_same_v<decltype(Builder2), IRBuilder<>>); 1305 IRBuilder Builder3(BB, Folder); 1306 static_assert( 1307 std::is_same_v<decltype(Builder3), IRBuilder<InstSimplifyFolder>>); 1308 IRBuilder Builder4(BB); 1309 static_assert(std::is_same_v<decltype(Builder4), IRBuilder<>>); 1310 // The block BB is empty, so don't test this one. 1311 // IRBuilder Builder5(BB->getTerminator()); 1312 // static_assert(std::is_same_v<decltype(Builder5), IRBuilder<>>); 1313 IRBuilder Builder6(BB, BB->end(), Folder); 1314 static_assert( 1315 std::is_same_v<decltype(Builder6), IRBuilder<InstSimplifyFolder>>); 1316 IRBuilder Builder7(BB, BB->end()); 1317 static_assert(std::is_same_v<decltype(Builder7), IRBuilder<>>); 1318 } 1319 } 1320