@@ -714,16 +714,20 @@ void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,
714
714
if (Node && ArgNo < Node->getNumOperands ())
715
715
BaseTypeName = cast<MDString>(Node->getOperand (ArgNo))->getString ();
716
716
717
- StringRef AccQual;
718
- if (Arg.getType ()->isPointerTy () && Arg.onlyReadsMemory () &&
719
- Arg.hasNoAliasAttr ()) {
720
- AccQual = " read_only" ;
721
- } else {
722
- Node = Func->getMetadata (" kernel_arg_access_qual" );
723
- if (Node && ArgNo < Node->getNumOperands ())
724
- AccQual = cast<MDString>(Node->getOperand (ArgNo))->getString ();
717
+ StringRef ActAccQual;
718
+ // Do we really need NoAlias check here?
719
+ if (Arg.getType ()->isPointerTy () && Arg.hasNoAliasAttr ()) {
720
+ if (Arg.onlyReadsMemory ())
721
+ ActAccQual = " read_only" ;
722
+ else if (Arg.hasAttribute (Attribute::WriteOnly))
723
+ ActAccQual = " write_only" ;
725
724
}
726
725
726
+ StringRef AccQual;
727
+ Node = Func->getMetadata (" kernel_arg_access_qual" );
728
+ if (Node && ArgNo < Node->getNumOperands ())
729
+ AccQual = cast<MDString>(Node->getOperand (ArgNo))->getString ();
730
+
727
731
StringRef TypeQual;
728
732
Node = Func->getMetadata (" kernel_arg_type_qual" );
729
733
if (Node && ArgNo < Node->getNumOperands ())
@@ -747,14 +751,15 @@ void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,
747
751
748
752
emitKernelArg (DL, ArgTy, ArgAlign,
749
753
getValueKind (ArgTy, TypeQual, BaseTypeName), Offset, Args,
750
- PointeeAlign, Name, TypeName, BaseTypeName, AccQual, TypeQual);
754
+ PointeeAlign, Name, TypeName, BaseTypeName, ActAccQual,
755
+ AccQual, TypeQual);
751
756
}
752
757
753
758
void MetadataStreamerMsgPackV3::emitKernelArg (
754
759
const DataLayout &DL, Type *Ty, Align Alignment, StringRef ValueKind,
755
760
unsigned &Offset, msgpack::ArrayDocNode Args, MaybeAlign PointeeAlign,
756
761
StringRef Name, StringRef TypeName, StringRef BaseTypeName,
757
- StringRef AccQual, StringRef TypeQual) {
762
+ StringRef ActAccQual, StringRef AccQual, StringRef TypeQual) {
758
763
auto Arg = Args.getDocument ()->getMapNode ();
759
764
760
765
if (!Name.empty ())
@@ -780,7 +785,8 @@ void MetadataStreamerMsgPackV3::emitKernelArg(
780
785
if (auto AQ = getAccessQualifier (AccQual))
781
786
Arg[" .access" ] = Arg.getDocument ()->getNode (*AQ, /* Copy=*/ true );
782
787
783
- // TODO: Emit Arg[".actual_access"].
788
+ if (auto AAQ = getAccessQualifier (ActAccQual))
789
+ Arg[" .actual_access" ] = Arg.getDocument ()->getNode (*AAQ, /* Copy=*/ true );
784
790
785
791
SmallVector<StringRef, 1 > SplitTypeQuals;
786
792
TypeQual.split (SplitTypeQuals, " " , -1 , false );
0 commit comments