llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Sarah Spall (spall) <details> <summary>Changes</summary> If the implicit object parameter is in the groupshared address space then perform an LValue to RValue cast. Adds an AST test and a Codegen test. Closes #<!-- -->228563 --- Full diff: https://github.com/llvm/llvm-project/pull/229939.diff 3 Files Affected: - (modified) clang/lib/Sema/SemaOverload.cpp (+8-5) - (modified) clang/test/AST/HLSL/StructPassing-AST.hlsl (+18) - (modified) clang/test/CodeGenHLSL/BasicFeatures/StructPassing.hlsl (+30) ``````````diff diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index e5049d11480ac4..44b397d2a47b93 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -6344,12 +6344,15 @@ ExprResult Sema::PerformImplicitObjectArgumentInitialization( QualType FromRecordType, DestType; QualType ImplicitParamRecordType = Method->getFunctionObjectParameterType(); + LangAS FromAS = From->getType().getAddressSpace(); if (getLangOpts().HLSL && - From->getType().getAddressSpace() == LangAS::hlsl_constant) { - QualType CastType = From->getType().getLocalUnqualifiedType().withConst(); - From = ImplicitCastExpr::Create(Context, CastType, CK_LValueToRValue, From, - /*BasePath=*/nullptr, VK_PRValue, - FPOptionsOverride()); + (FromAS == LangAS::hlsl_constant || FromAS == LangAS::hlsl_groupshared)) { + QualType CastType = From->getType().getLocalUnqualifiedType(); + From = ImplicitCastExpr::Create( + Context, + FromAS == LangAS::hlsl_constant ? CastType.withConst() : CastType, + CK_LValueToRValue, From, + /*BasePath=*/nullptr, VK_PRValue, FPOptionsOverride()); } Expr::Classification FromClassification; diff --git a/clang/test/AST/HLSL/StructPassing-AST.hlsl b/clang/test/AST/HLSL/StructPassing-AST.hlsl index 8ae83fa89b3905..745187514bd432 100644 --- a/clang/test/AST/HLSL/StructPassing-AST.hlsl +++ b/clang/test/AST/HLSL/StructPassing-AST.hlsl @@ -118,5 +118,23 @@ void case6(S s) { useP(s); } +struct G { + void f() {} +}; + +groupshared G g; + +// CHECK: FunctionDecl {{.*}} case7 'void ()' +// CHECK-NEXT: CompoundStmt {{.*}} +// CHECK-NEXT: ExprWithCleanups {{.*}} 'void' +// CHECK-NEXT: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} '<bound member function type>' .f {{.*}} +// CHECK-NEXT: MaterializeTemporaryExpr {{.*}} 'G' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'G' <LValueToRValue> +// CHECK-NEXT: DeclRefExpr {{.*}} 'groupshared G' lvalue Var {{.*}} 'g' 'groupshared G' +void case7() { + g.f(); +} + // CHECK-NOT: CXXConstructExpr // CHECK-NOT: CXXOperatorCallExpr diff --git a/clang/test/CodeGenHLSL/BasicFeatures/StructPassing.hlsl b/clang/test/CodeGenHLSL/BasicFeatures/StructPassing.hlsl index c80c7c9466afcf..a846f682493fa6 100644 --- a/clang/test/CodeGenHLSL/BasicFeatures/StructPassing.hlsl +++ b/clang/test/CodeGenHLSL/BasicFeatures/StructPassing.hlsl @@ -133,3 +133,33 @@ void case6(S s) { // derived to base conversion in argument passing useP(s); } + +// CHECK-LABEL: define hidden void @_Z5case7v( +// CHECK-SAME: ) #[[ATTR0]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() +// CHECK-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_G:%.*]], align 1 +// CHECK-NEXT: call void @_ZN1G1fEv(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]]) #[[ATTR3]] [ "convergencectrl"(token [[TMP0]]) ] +// CHECK-NEXT: ret void +// +void case7(); + +struct G { +// CHECK-LABEL: define linkonce_odr hidden void @_ZN1G1fEv( +// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR0]] align 2 { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() +// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4 +// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4 +// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4 +// CHECK-NEXT: ret void +// + void f() {} +}; + +groupshared G g; + +void case7() { + // implicit argument passing of a groupshared struct + g.f(); +} `````````` </details> https://github.com/llvm/llvm-project/pull/229939 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
