Skip to content

Commit e6c63d9

Browse files
authored
[OMPIRBuilder] Use target global AS for SrcLocStr (#156520)
We should set the correct target-specific AS for the SrcLocStr global created in OMPIRBuilder. We also may have to insert a constexpr addrspacecast because the struct field type may be different than the value used to initialize it. I actually want the cast to be from AS 1 to AS 4, but getting the type to be AS4 relies on a PR currently in-review, so leave the cast target to AS 0 for now. --------- Signed-off-by: Sarnie, Nick <[email protected]>
1 parent 0f032f1 commit e6c63d9

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

clang/test/OpenMP/spirv_locstr.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -fopenmp-targets=spirv64-intel -emit-llvm-bc %s -o %t-host.bc
2+
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple spirv64-intel -fopenmp-targets=spirv64-intel -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-host.bc -o - | FileCheck %s
3+
4+
// expected-no-diagnostics
5+
6+
// CHECK: @[[#LOC:]] = private unnamed_addr addrspace(1) constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
7+
// CHECK: = private unnamed_addr addrspace(1) constant %struct.ident_t { i32 0, i32 2, i32 0, i32 {{.*}}, ptr addrspacecast (ptr addrspace(1) @[[#LOC]] to ptr) }, align 8
8+
9+
int main() {
10+
int ret = 0;
11+
#pragma omp target
12+
for(int i = 0; i < 5; i++)
13+
ret++;
14+
return ret;
15+
}

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,13 @@ Constant *OpenMPIRBuilder::getOrCreateIdent(Constant *SrcLocStr,
915915
ConstantInt::get(Int32, uint32_t(LocFlags)),
916916
ConstantInt::get(Int32, Reserve2Flags),
917917
ConstantInt::get(Int32, SrcLocStrSize), SrcLocStr};
918+
919+
size_t SrcLocStrArgIdx = 4;
920+
if (OpenMPIRBuilder::Ident->getElementType(SrcLocStrArgIdx)
921+
->getPointerAddressSpace() !=
922+
IdentData[SrcLocStrArgIdx]->getType()->getPointerAddressSpace())
923+
IdentData[SrcLocStrArgIdx] = ConstantExpr::getAddrSpaceCast(
924+
SrcLocStr, OpenMPIRBuilder::Ident->getElementType(SrcLocStrArgIdx));
918925
Constant *Initializer =
919926
ConstantStruct::get(OpenMPIRBuilder::Ident, IdentData);
920927

@@ -955,8 +962,9 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(StringRef LocStr,
955962
GV.getInitializer() == Initializer)
956963
return SrcLocStr = ConstantExpr::getPointerCast(&GV, Int8Ptr);
957964

958-
SrcLocStr = Builder.CreateGlobalString(LocStr, /* Name */ "",
959-
/* AddressSpace */ 0, &M);
965+
SrcLocStr = Builder.CreateGlobalString(
966+
LocStr, /*Name=*/"", M.getDataLayout().getDefaultGlobalsAddressSpace(),
967+
&M);
960968
}
961969
return SrcLocStr;
962970
}

0 commit comments

Comments
 (0)