Skip to content

Commit 21fbc2a

Browse files
sarnexronlieb
authored andcommitted
reland [OMPIRBuilder] Fix addrspace of internal critical section lock (llvm#166459)
Update revert_patches.txt
1 parent 02d967a commit 21fbc2a

File tree

5 files changed

+29
-27
lines changed

5 files changed

+29
-27
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,22 +2024,29 @@ void CGOpenMPRuntime::emitCriticalRegion(CodeGenFunction &CGF,
20242024
// Prepare arguments and build a call to __kmpc_critical
20252025
if (!CGF.HaveInsertPoint())
20262026
return;
2027+
llvm::FunctionCallee RuntimeFcn = OMPBuilder.getOrCreateRuntimeFunction(
2028+
CGM.getModule(),
2029+
Hint ? OMPRTL___kmpc_critical_with_hint : OMPRTL___kmpc_critical);
2030+
llvm::Value *LockVar = getCriticalRegionLock(CriticalName);
2031+
unsigned LockVarArgIdx = 2;
2032+
if (cast<llvm::GlobalVariable>(LockVar)->getAddressSpace() !=
2033+
RuntimeFcn.getFunctionType()
2034+
->getParamType(LockVarArgIdx)
2035+
->getPointerAddressSpace())
2036+
LockVar = CGF.Builder.CreateAddrSpaceCast(
2037+
LockVar, RuntimeFcn.getFunctionType()->getParamType(LockVarArgIdx));
20272038
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
2028-
getCriticalRegionLock(CriticalName)};
2039+
LockVar};
20292040
llvm::SmallVector<llvm::Value *, 4> EnterArgs(std::begin(Args),
20302041
std::end(Args));
20312042
if (Hint) {
20322043
EnterArgs.push_back(CGF.Builder.CreateIntCast(
20332044
CGF.EmitScalarExpr(Hint), CGM.Int32Ty, /*isSigned=*/false));
20342045
}
2035-
CommonActionTy Action(
2036-
OMPBuilder.getOrCreateRuntimeFunction(
2037-
CGM.getModule(),
2038-
Hint ? OMPRTL___kmpc_critical_with_hint : OMPRTL___kmpc_critical),
2039-
EnterArgs,
2040-
OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(),
2041-
OMPRTL___kmpc_end_critical),
2042-
Args);
2046+
CommonActionTy Action(RuntimeFcn, EnterArgs,
2047+
OMPBuilder.getOrCreateRuntimeFunction(
2048+
CGM.getModule(), OMPRTL___kmpc_end_critical),
2049+
Args);
20432050
CriticalOpGen.setAction(Action);
20442051
emitInlinedDirective(CGF, OMPD_critical, CriticalOpGen);
20452052
}

clang/test/OpenMP/spirv_target_codegen_basic.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@
66
// CHECK: @__omp_offloading_{{.*}}_dynamic_environment = weak_odr protected addrspace(1) global %struct.DynamicEnvironmentTy zeroinitializer
77
// CHECK: @__omp_offloading_{{.*}}_kernel_environment = weak_odr protected addrspace(1) constant %struct.KernelEnvironmentTy
88

9+
// CHECK: @"_gomp_critical_user_$var" = common global [8 x i32] zeroinitializer, align 8
10+
911
// CHECK: define weak_odr protected spir_kernel void @__omp_offloading_{{.*}}
1012

13+
// CHECK: call spir_func addrspace(9) void @__kmpc_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr @"_gomp_critical_user_$var" to ptr addrspace(4)))
14+
// CHECK: call spir_func addrspace(9) void @__kmpc_end_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr @"_gomp_critical_user_$var" to ptr addrspace(4)))
15+
1116
int main() {
1217
int ret = 0;
1318
#pragma omp target
1419
for(int i = 0; i < 5; i++)
20+
#pragma omp critical
1521
ret++;
1622
return ret;
1723
}

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3681,7 +3681,7 @@ class OpenMPIRBuilder {
36813681
/// \param Name Name of the variable.
36823682
LLVM_ABI GlobalVariable *
36833683
getOrCreateInternalVariable(Type *Ty, const StringRef &Name,
3684-
unsigned AddressSpace = 0);
3684+
std::optional<unsigned> AddressSpace = 0);
36853685
};
36863686

36873687
/// Class to represented the control flow structure of an OpenMP canonical loop.

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8577,9 +8577,8 @@ OpenMPIRBuilder::createPlatformSpecificName(ArrayRef<StringRef> Parts) const {
85778577
Config.separator());
85788578
}
85798579

8580-
GlobalVariable *
8581-
OpenMPIRBuilder::getOrCreateInternalVariable(Type *Ty, const StringRef &Name,
8582-
unsigned AddressSpace) {
8580+
GlobalVariable *OpenMPIRBuilder::getOrCreateInternalVariable(
8581+
Type *Ty, const StringRef &Name, std::optional<unsigned> AddressSpace) {
85838582
auto &Elem = *InternalVars.try_emplace(Name, nullptr).first;
85848583
if (Elem.second) {
85858584
assert(Elem.second->getValueType() == Ty &&
@@ -8590,24 +8589,17 @@ OpenMPIRBuilder::getOrCreateInternalVariable(Type *Ty, const StringRef &Name,
85908589
// create different versions of the function for different OMP internal
85918590
// variables.
85928591
const DataLayout &DL = M.getDataLayout();
8593-
// TODO: Investigate why AMDGPU expects AS 0 for globals even though the
8594-
// default global AS is 1.
8595-
// See double-target-call-with-declare-target.f90 and
8596-
// declare-target-vars-in-target-region.f90 libomptarget
8597-
// tests.
8598-
unsigned AddressSpaceVal = AddressSpace ? AddressSpace
8599-
: M.getTargetTriple().isAMDGPU()
8600-
? 0
8601-
: DL.getDefaultGlobalsAddressSpace();
8592+
unsigned AddressSpaceVal =
8593+
AddressSpace ? *AddressSpace : DL.getDefaultGlobalsAddressSpace();
86028594
auto Linkage = this->M.getTargetTriple().getArch() == Triple::wasm32
86038595
? GlobalValue::InternalLinkage
86048596
: GlobalValue::CommonLinkage;
86058597
auto *GV = new GlobalVariable(M, Ty, /*IsConstant=*/false, Linkage,
86068598
Constant::getNullValue(Ty), Elem.first(),
86078599
/*InsertBefore=*/nullptr,
8608-
GlobalValue::NotThreadLocal, AddressSpace);
8600+
GlobalValue::NotThreadLocal, AddressSpaceVal);
86098601
const llvm::Align TypeAlign = DL.getABITypeAlign(Ty);
8610-
const llvm::Align PtrAlign = DL.getPointerABIAlignment(AddressSpace);
8602+
const llvm::Align PtrAlign = DL.getPointerABIAlignment(AddressSpaceVal);
86118603
GV->setAlignment(std::max(TypeAlign, PtrAlign));
86128604
Elem.second = GV;
86138605
}

revert_patches.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,3 @@ d57230c7 [AMDGPU][MC] Disallow op_sel in some VOP3P dot instructions (#100485)
55
breaks build of ROCmValidationSuite
66
[C2y] Support WG14 N3457, the __COUNTER__ macro (#162662)
77
---
8-
breaks fortran declare-target-link1
9-
[OMPIRBuilder] Fix addrspace of internal critical section lock (#166459
10-
---

0 commit comments

Comments
 (0)