@@ -1796,20 +1796,10 @@ class SyclKernelDecompMarker : public SyclKernelFieldHandler {
1796
1796
CollectionStack.back () = true ;
1797
1797
PointerStack.pop_back ();
1798
1798
} else if (PointerStack.pop_back_val ()) {
1799
- // FIXME: Stop triggering decomposition for non-trivial types with
1800
- // pointers
1801
- if (RD->isTrivial ()) {
1802
- PointerStack.back () = true ;
1803
- if (!RD->hasAttr <SYCLGenerateNewTypeAttr>())
1804
- RD->addAttr (
1805
- SYCLGenerateNewTypeAttr::CreateImplicit (SemaRef.getASTContext ()));
1806
- } else {
1807
- // We are visiting a non-trivial type with pointer.
1808
- CollectionStack.back () = true ;
1809
- if (!RD->hasAttr <SYCLRequiresDecompositionAttr>())
1810
- RD->addAttr (SYCLRequiresDecompositionAttr::CreateImplicit (
1811
- SemaRef.getASTContext ()));
1812
- }
1799
+ PointerStack.back () = true ;
1800
+ if (!RD->hasAttr <SYCLGenerateNewTypeAttr>())
1801
+ RD->addAttr (
1802
+ SYCLGenerateNewTypeAttr::CreateImplicit (SemaRef.getASTContext ()));
1813
1803
}
1814
1804
return true ;
1815
1805
}
@@ -2916,6 +2906,18 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2916
2906
Init.get ());
2917
2907
}
2918
2908
2909
+ void addBaseInit (const CXXBaseSpecifier &BS, QualType Ty,
2910
+ InitializationKind InitKind, MultiExprArg Args) {
2911
+ InitializedEntity Entity = InitializedEntity::InitializeBase (
2912
+ SemaRef.Context , &BS, /* IsInheritedVirtualBase*/ false , &VarEntity);
2913
+ InitializationSequence InitSeq (SemaRef, Entity, InitKind, Args);
2914
+ ExprResult Init = InitSeq.Perform (SemaRef, Entity, InitKind, Args);
2915
+
2916
+ InitListExpr *ParentILE = CollectionInitExprs.back ();
2917
+ ParentILE->updateInit (SemaRef.getASTContext (), ParentILE->getNumInits (),
2918
+ Init.get ());
2919
+ }
2920
+
2919
2921
void addSimpleBaseInit (const CXXBaseSpecifier &BS, QualType Ty) {
2920
2922
InitializationKind InitKind =
2921
2923
InitializationKind::CreateCopy (KernelCallerSrcLoc, KernelCallerSrcLoc);
@@ -2938,85 +2940,53 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2938
2940
addFieldInit (FD, Ty, ParamRef);
2939
2941
}
2940
2942
2941
- Expr *addDerivedToBaseCastExpr (const CXXRecordDecl *RD,
2942
- const CXXBaseSpecifier &BS,
2943
- Expr *LocalCloneRef) {
2944
- CXXCastPath BasePath;
2945
- QualType DerivedTy (RD->getTypeForDecl (), 0 );
2946
- QualType BaseTy = BS.getType ();
2947
- SemaRef.CheckDerivedToBaseConversion (DerivedTy, BaseTy, KernelCallerSrcLoc,
2948
- SourceRange (), &BasePath,
2949
- /* IgnoreBaseAccess*/ true );
2950
- auto Cast = ImplicitCastExpr::Create (
2951
- SemaRef.Context , SemaRef.Context .getPointerType (BaseTy),
2952
- CK_DerivedToBase, LocalCloneRef,
2953
- /* CXXCastPath=*/ &BasePath, VK_LValue, FPOptionsOverride ());
2954
- return Cast;
2955
- }
2956
-
2957
2943
Expr *createGetAddressOf (Expr *E) {
2958
2944
return UnaryOperator::Create (SemaRef.Context , E, UO_AddrOf,
2959
2945
SemaRef.Context .getPointerType (E->getType ()),
2960
2946
VK_PRValue, OK_Ordinary, KernelCallerSrcLoc,
2961
2947
false , SemaRef.CurFPFeatureOverrides ());
2962
2948
}
2963
2949
2964
- Expr *buildMemCpyCall (Expr *From, Expr *To, QualType T) {
2965
- // Compute the size of the memory buffer to be copied.
2966
- QualType SizeType = SemaRef.Context .getSizeType ();
2967
- llvm::APInt Size (SemaRef.Context .getTypeSize (SizeType),
2968
- SemaRef.Context .getTypeSizeInChars (T).getQuantity ());
2969
-
2970
- LookupResult R (SemaRef, &SemaRef.Context .Idents .get (" __builtin_memcpy" ),
2971
- KernelCallerSrcLoc, Sema::LookupOrdinaryName);
2972
- SemaRef.LookupName (R, SemaRef.TUScope , true );
2973
-
2974
- FunctionDecl *MemCpy = R.getAsSingle <FunctionDecl>();
2975
-
2976
- assert (MemCpy && " __builtin_memcpy should be found" );
2977
-
2978
- ExprResult MemCpyRef =
2979
- SemaRef.BuildDeclRefExpr (MemCpy, SemaRef.Context .BuiltinFnTy ,
2980
- VK_PRValue, KernelCallerSrcLoc, nullptr );
2981
-
2982
- assert (MemCpyRef.isUsable () && " Builtin reference cannot fail" );
2983
-
2984
- Expr *CallArgs[] = {To, From,
2985
- IntegerLiteral::Create (SemaRef.Context , Size , SizeType,
2986
- KernelCallerSrcLoc)};
2987
- ExprResult Call =
2988
- SemaRef.BuildCallExpr (/* Scope=*/ nullptr , MemCpyRef.get (),
2989
- KernelCallerSrcLoc, CallArgs, KernelCallerSrcLoc);
2950
+ Expr *createDerefOp (Expr *E) {
2951
+ return UnaryOperator::Create (SemaRef.Context , E, UO_Deref,
2952
+ E->getType ()->getPointeeType (), VK_LValue,
2953
+ OK_Ordinary, KernelCallerSrcLoc, false ,
2954
+ SemaRef.CurFPFeatureOverrides ());
2955
+ }
2990
2956
2991
- assert (!Call.isInvalid () && " Call to __builtin_memcpy cannot fail!" );
2992
- return Call.getAs <Expr>();
2957
+ Expr *createReinterpretCastExpr (Expr *E, QualType To) {
2958
+ return CXXReinterpretCastExpr::Create (
2959
+ SemaRef.Context , To, VK_PRValue, CK_BitCast, E,
2960
+ /* Path=*/ nullptr , SemaRef.Context .CreateTypeSourceInfo (To),
2961
+ SourceLocation (), SourceLocation (), SourceRange ());
2993
2962
}
2994
2963
2995
- // Adds default initializer for generated type and creates
2996
- // a call to __builtin_memcpy to initialize local clone from
2997
- // kernel argument.
2998
2964
void handleGeneratedType (FieldDecl *FD, QualType Ty) {
2999
- addFieldInit (FD, Ty, None,
3000
- InitializationKind::CreateDefault (KernelCallerSrcLoc));
3001
- addFieldMemberExpr (FD, Ty);
3002
- Expr *ParamRef = createGetAddressOf (createParamReferenceExpr ());
3003
- Expr *LocalCloneRef = createGetAddressOf (MemberExprBases.back ());
3004
- Expr *MemCpyCallExpr = buildMemCpyCall (ParamRef, LocalCloneRef, Ty);
3005
- BodyStmts.push_back (MemCpyCallExpr);
3006
- removeFieldMemberExpr (FD, Ty);
2965
+ // Equivalent of the following code is generated here:
2966
+ // void ocl_kernel(__generated_type GT) {
2967
+ // Kernel KernelObjClone { *(reinterpret_cast<UsersType*>(>)) };
2968
+ // }
2969
+
2970
+ Expr *RCE = createReinterpretCastExpr (
2971
+ createGetAddressOf (createParamReferenceExpr ()),
2972
+ SemaRef.Context .getPointerType (Ty));
2973
+ Expr *Initializer = createDerefOp (RCE);
2974
+ addFieldInit (FD, Ty, Initializer);
3007
2975
}
3008
2976
3009
- // Adds default initializer for generated base and creates
3010
- // a call to __builtin_memcpy to initialize the base of local clone
3011
- // from kernel argument.
3012
2977
void handleGeneratedType (const CXXRecordDecl *RD, const CXXBaseSpecifier &BS,
3013
2978
QualType Ty) {
3014
- addBaseInit (BS, Ty, InitializationKind::CreateDefault (KernelCallerSrcLoc));
3015
- Expr *ParamRef = createGetAddressOf (createParamReferenceExpr ());
3016
- Expr *LocalCloneRef = createGetAddressOf (MemberExprBases.back ());
3017
- LocalCloneRef = addDerivedToBaseCastExpr (RD, BS, LocalCloneRef);
3018
- Expr *MemCpyCallExpr = buildMemCpyCall (ParamRef, LocalCloneRef, Ty);
3019
- BodyStmts.push_back (MemCpyCallExpr);
2979
+ // Equivalent of the following code is generated here:
2980
+ // void ocl_kernel(__generated_type GT) {
2981
+ // Kernel KernelObjClone { *(reinterpret_cast<UsersType*>(>)) };
2982
+ // }
2983
+ Expr *RCE = createReinterpretCastExpr (
2984
+ createGetAddressOf (createParamReferenceExpr ()),
2985
+ SemaRef.Context .getPointerType (Ty));
2986
+ Expr *Initializer = createDerefOp (RCE);
2987
+ InitializationKind InitKind =
2988
+ InitializationKind::CreateCopy (KernelCallerSrcLoc, KernelCallerSrcLoc);
2989
+ addBaseInit (BS, Ty, InitKind, Initializer);
3020
2990
}
3021
2991
3022
2992
MemberExpr *buildMemberExpr (Expr *Base, ValueDecl *Member) {
0 commit comments