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