Skip to content

Commit

Permalink
[RISCV] Add IntrArgMemOnly for vector unit stride load/store intrinsi…
Browse files Browse the repository at this point in the history
…cs (#78415)

IntrArgMemOnly means the intrinsic only accesses memory that its
pointer-typed argument(s) points to. I think RVV load/store intrinsics
meets it. Add IntrArgMemOnly would help in some passes, by example, it
could add `alais.scope` to intrinsics callee when try to inline a
function that has noalais parameter(s).
  • Loading branch information
jacquesguan committed Jan 23, 2024
1 parent f205566 commit d8628a0
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions llvm/include/llvm/IR/IntrinsicsRISCV.td
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,17 @@ let TargetPrefix = "riscv" in {
class RISCVUSMLoad
: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
[llvm_ptr_ty, llvm_anyint_ty],
[NoCapture<ArgIndex<0>>, IntrReadMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<0>>, IntrReadMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = 1;
}
// For unit stride load
// Input: (passthru, pointer, vl)
class RISCVUSLoad
: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
[LLVMMatchType<0>, llvm_ptr_ty, llvm_anyint_ty],
[NoCapture<ArgIndex<1>>, IntrReadMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<1>>, IntrReadMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = 2;
}
// For unit stride fault-only-first load
Expand All @@ -177,7 +179,8 @@ let TargetPrefix = "riscv" in {
[LLVMMatchType<0>, llvm_ptr_ty,
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_anyint_ty, LLVMMatchType<1>],
[NoCapture<ArgIndex<1>>, ImmArg<ArgIndex<4>>, IntrReadMem]>,
[NoCapture<ArgIndex<1>>, ImmArg<ArgIndex<4>>, IntrReadMem,
IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = 3;
}
Expand Down Expand Up @@ -239,7 +242,8 @@ let TargetPrefix = "riscv" in {
class RISCVUSStore
: DefaultAttrsIntrinsic<[],
[llvm_anyvector_ty, llvm_ptr_ty, llvm_anyint_ty],
[NoCapture<ArgIndex<1>>, IntrWriteMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<1>>, IntrWriteMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = 2;
}
// For unit stride store with mask
Expand All @@ -249,7 +253,8 @@ let TargetPrefix = "riscv" in {
[llvm_anyvector_ty, llvm_ptr_ty,
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_anyint_ty],
[NoCapture<ArgIndex<1>>, IntrWriteMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<1>>, IntrWriteMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = 3;
}
// For strided store
Expand Down Expand Up @@ -992,7 +997,8 @@ let TargetPrefix = "riscv" in {
!add(nf, -1))),
!listconcat(!listsplat(LLVMMatchType<0>, nf),
[llvm_ptr_ty, llvm_anyint_ty]),
[NoCapture<ArgIndex<nf>>, IntrReadMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<nf>>, IntrReadMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = !add(nf, 1);
}
// For unit stride segment load with mask
Expand All @@ -1004,8 +1010,9 @@ let TargetPrefix = "riscv" in {
[llvm_ptr_ty,
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_anyint_ty, LLVMMatchType<1>]),
[ImmArg<ArgIndex<!add(nf, 3)>>, NoCapture<ArgIndex<nf>>, IntrReadMem]>,
RISCVVIntrinsic {
[ImmArg<ArgIndex<!add(nf, 3)>>, NoCapture<ArgIndex<nf>>,
IntrReadMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = !add(nf, 2);
}

Expand Down Expand Up @@ -1096,7 +1103,8 @@ let TargetPrefix = "riscv" in {
!listconcat([llvm_anyvector_ty],
!listsplat(LLVMMatchType<0>, !add(nf, -1)),
[llvm_ptr_ty, llvm_anyint_ty]),
[NoCapture<ArgIndex<nf>>, IntrWriteMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<nf>>, IntrWriteMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = !add(nf, 1);
}
// For unit stride segment store with mask
Expand All @@ -1108,7 +1116,8 @@ let TargetPrefix = "riscv" in {
[llvm_ptr_ty,
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
llvm_anyint_ty]),
[NoCapture<ArgIndex<nf>>, IntrWriteMem]>, RISCVVIntrinsic {
[NoCapture<ArgIndex<nf>>, IntrWriteMem, IntrArgMemOnly]>,
RISCVVIntrinsic {
let VLOperand = !add(nf, 2);
}

Expand Down

0 comments on commit d8628a0

Please sign in to comment.