https://github.com/skatrak created https://github.com/llvm/llvm-project/pull/117875
This patch copies the target-cpu and target-features attributes of functions containing target regions into the corresponding outlined function holding the target region. This mirrors what is currently being done for all other outlined functions through the `CodeExtractor` in `OpenMPIRBuilder::finalize()`. >From c7ca41f39546949a5c6ae28782f9e2f6585c240b Mon Sep 17 00:00:00 2001 From: Sergio Afonso <safon...@amd.com> Date: Wed, 27 Nov 2024 11:35:28 +0000 Subject: [PATCH] [OMPIRBuilder] Propagate attributes to outlined target regions This patch copies the target-cpu and target-features attributes of functions containing target regions into the corresponding outlined function holding the target region. This mirrors what is currently being done for all other outlined functions through the `CodeExtractor` in `OpenMPIRBuilder::finalize()`. --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 12 +++++++++ .../Frontend/OpenMPIRBuilderTest.cpp | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 73f221c07af746..8da3fa52b14af4 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -6768,6 +6768,18 @@ static Expected<Function *> createOutlinedFunction( auto Func = Function::Create(FuncType, GlobalValue::InternalLinkage, FuncName, M); + // Forward target-cpu and target-features function attributes from the + // original function to the new outlined function. + Function *ParentFn = Builder.GetInsertBlock()->getParent(); + + auto TargetCpuAttr = ParentFn->getFnAttribute("target-cpu"); + if (TargetCpuAttr.isStringAttribute()) + Func->addFnAttr(TargetCpuAttr); + + auto TargetFeaturesAttr = ParentFn->getFnAttribute("target-features"); + if (TargetFeaturesAttr.isStringAttribute()) + Func->addFnAttr(TargetFeaturesAttr); + if (OMPBuilder.Config.isTargetDevice()) { Value *ExecMode = OMPBuilder.emitKernelExecutionMode( FuncName, IsSPMD ? OMP_TGT_EXEC_MODE_SPMD : OMP_TGT_EXEC_MODE_GENERIC); diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp index e4845256633b9c..d114b5372156af 100644 --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -6122,6 +6122,8 @@ TEST_F(OpenMPIRBuilderTest, TargetRegion) { OpenMPIRBuilderConfig Config(false, false, false, false, false, false, false); OMPBuilder.setConfig(Config); F->setName("func"); + F->addFnAttr("target-cpu", "x86-64"); + F->addFnAttr("target-features", "+mmx,+sse"); IRBuilder<> Builder(BB); auto *Int32Ty = Builder.getInt32Ty(); @@ -6269,6 +6271,13 @@ TEST_F(OpenMPIRBuilderTest, TargetRegion) { StringRef FunctionName2 = OutlinedFunc->getName(); EXPECT_TRUE(FunctionName2.starts_with("__omp_offloading")); + // Check that target-cpu and target-features were propagated to the outlined + // function + EXPECT_EQ(OutlinedFunc->getFnAttribute("target-cpu"), + F->getFnAttribute("target-cpu")); + EXPECT_EQ(OutlinedFunc->getFnAttribute("target-features"), + F->getFnAttribute("target-features")); + EXPECT_FALSE(verifyModule(*M, &errs())); } @@ -6279,6 +6288,8 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionDevice) { OMPBuilder.initialize(); F->setName("func"); + F->addFnAttr("target-cpu", "gfx90a"); + F->addFnAttr("target-features", "+gfx9-insts,+wavefrontsize64"); IRBuilder<> Builder(BB); OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL}); @@ -6355,6 +6366,13 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionDevice) { Function *OutlinedFn = TargetStore->getFunction(); EXPECT_NE(F, OutlinedFn); + // Check that target-cpu and target-features were propagated to the outlined + // function + EXPECT_EQ(OutlinedFn->getFnAttribute("target-cpu"), + F->getFnAttribute("target-cpu")); + EXPECT_EQ(OutlinedFn->getFnAttribute("target-features"), + F->getFnAttribute("target-features")); + EXPECT_TRUE(OutlinedFn->hasWeakODRLinkage()); // Account for the "implicit" first argument. EXPECT_EQ(OutlinedFn->getName(), "__omp_offloading_1_2_parent_l3"); @@ -6594,6 +6612,13 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionDeviceSPMD) { EXPECT_NE(OutlinedFn, nullptr); EXPECT_NE(F, OutlinedFn); + // Check that target-cpu and target-features were propagated to the outlined + // function + EXPECT_EQ(OutlinedFn->getFnAttribute("target-cpu"), + F->getFnAttribute("target-cpu")); + EXPECT_EQ(OutlinedFn->getFnAttribute("target-features"), + F->getFnAttribute("target-features")); + EXPECT_TRUE(OutlinedFn->hasWeakODRLinkage()); // Account for the "implicit" first argument. EXPECT_EQ(OutlinedFn->getName(), "__omp_offloading_1_2_parent_l3"); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits