diff --git a/clang/include/clang/Basic/riscv_vector.td b/clang/include/clang/Basic/riscv_vector.td --- a/clang/include/clang/Basic/riscv_vector.td +++ b/clang/include/clang/Basic/riscv_vector.td @@ -467,10 +467,10 @@ ManualCodegen = [{ if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } @@ -649,12 +649,12 @@ if (IsMasked) { // Move mask to right before vl. std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs)); IntrinsicTypes = {ResultType, Ops[4]->getType()}; } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); IntrinsicTypes = {ResultType, Ops[3]->getType()}; } @@ -939,8 +939,8 @@ SmallVector Operands; // Please refer to comment under 'defvar NFList' in this file - if ((IsMasked && PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) || - (!IsMasked && PolicyAttrs == TAIL_AGNOSTIC)) + if ((IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) || + (!IsMasked && PolicyAttrs & RVV_VTA)) Operands.append(NF, llvm::PoisonValue::get(ResultType)); else { if (IsMasked) @@ -949,8 +949,8 @@ Operands.append(Ops.begin() + NF, Ops.begin() + 2 * NF); } unsigned PtrOperandIdx = IsMasked ? - (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) ? NF + 1 : 2 * NF + 1 : - (PolicyAttrs == TAIL_AGNOSTIC) ? NF : 2 * NF; + ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ? NF + 1 : 2 * NF + 1 : + (PolicyAttrs & RVV_VTA) ? NF : 2 * NF; Value *PtrOperand = Ops[PtrOperandIdx]; Value *VLOperand = Ops[PtrOperandIdx + 1]; Operands.push_back(PtrOperand); @@ -1004,8 +1004,8 @@ SmallVector Operands; // Please refer to comment under 'defvar NFList' in this file - if ((IsMasked && PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) || - (!IsMasked && PolicyAttrs == TAIL_AGNOSTIC)) + if ((IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) || + (!IsMasked && PolicyAttrs & RVV_VTA)) Operands.append(NF, llvm::PoisonValue::get(ResultType)); else { if (IsMasked) @@ -1014,8 +1014,8 @@ Operands.append(Ops.begin() + NF, Ops.begin() + 2 * NF); } unsigned PtrOperandIdx = IsMasked ? - (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) ? NF + 1 : 2 * NF + 1 : - (PolicyAttrs == TAIL_AGNOSTIC) ? NF : 2 * NF; + ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ? NF + 1 : 2 * NF + 1 : + (PolicyAttrs & RVV_VTA) ? NF : 2 * NF; Value *PtrOperand = Ops[PtrOperandIdx]; Value *NewVLOperand = Ops[PtrOperandIdx + 1]; Value *VLOperand = Ops[PtrOperandIdx + 2]; @@ -1071,8 +1071,8 @@ SmallVector Operands; // Please refer to comment under 'defvar NFList' in this file - if ((IsMasked && PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) || - (!IsMasked && PolicyAttrs == TAIL_AGNOSTIC)) + if ((IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) || + (!IsMasked && PolicyAttrs & RVV_VTA)) Operands.append(NF, llvm::PoisonValue::get(ResultType)); else { if (IsMasked) @@ -1081,8 +1081,8 @@ Operands.append(Ops.begin() + NF, Ops.begin() + 2 * NF); } unsigned PtrOperandIdx = IsMasked ? - (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) ? NF + 1 : 2 * NF + 1 : - (PolicyAttrs == TAIL_AGNOSTIC) ? NF : 2 * NF; + ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ? NF + 1 : 2 * NF + 1 : + (PolicyAttrs & RVV_VTA) ? NF : 2 * NF; Value *PtrOperand = Ops[PtrOperandIdx]; Value *StrideOperand = Ops[PtrOperandIdx + 1]; Value *VLOperand = Ops[PtrOperandIdx + 2]; @@ -1133,8 +1133,8 @@ SmallVector Operands; // Please refer to comment under 'defvar NFList' in this file - if ((IsMasked && PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) || - (!IsMasked && PolicyAttrs == TAIL_AGNOSTIC)) + if ((IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) || + (!IsMasked && PolicyAttrs & RVV_VTA)) Operands.append(NF, llvm::PoisonValue::get(ResultType)); else { if (IsMasked) @@ -1143,8 +1143,8 @@ Operands.append(Ops.begin() + NF, Ops.begin() + 2 * NF); } unsigned PtrOperandIdx = IsMasked ? - (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) ? NF + 1 : 2 * NF + 1 : - (PolicyAttrs == TAIL_AGNOSTIC) ? NF : 2 * NF; + ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ? NF + 1 : 2 * NF + 1 : + (PolicyAttrs & RVV_VTA) ? NF : 2 * NF; Value *PtrOperand = Ops[PtrOperandIdx]; Value *IndexOperand = Ops[PtrOperandIdx + 1]; Value *VLOperand = Ops[PtrOperandIdx + 2]; @@ -1333,10 +1333,10 @@ { if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } auto ElemTy = cast(ResultType)->getElementType(); @@ -1366,10 +1366,10 @@ { if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } auto ElemTy = cast(ResultType)->getElementType(); @@ -1421,7 +1421,7 @@ { if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); Ops.insert(Ops.begin() + 2, Ops[1]); Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs)); @@ -1430,7 +1430,7 @@ Ops[2]->getType(), Ops.back()->getType()}; } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); // op1, po2, vl IntrinsicTypes = {ResultType, @@ -1456,10 +1456,10 @@ { if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } auto ElemTy = cast(ResultType)->getElementType(); @@ -1498,10 +1498,10 @@ { if (IsMasked) { std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1); - if (PolicyAttrs == TAIL_AGNOSTIC_MASK_AGNOSTIC) + if ((PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } else { - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); } Ops.insert(Ops.begin() + 2, llvm::Constant::getNullValue(Ops.back()->getType())); @@ -1901,7 +1901,7 @@ MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // insert poison passthru - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()}; }] in { @@ -2043,7 +2043,7 @@ MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // insert poison passthru - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()}; }] in { @@ -2240,7 +2240,7 @@ MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // insert poison passthru - if (PolicyAttrs == TAIL_AGNOSTIC) + if (PolicyAttrs & RVV_VTA) Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType)); IntrinsicTypes = {ResultType, Ops.back()->getType()}; }] in { diff --git a/clang/include/clang/Support/RISCVVIntrinsicUtils.h b/clang/include/clang/Support/RISCVVIntrinsicUtils.h --- a/clang/include/clang/Support/RISCVVIntrinsicUtils.h +++ b/clang/include/clang/Support/RISCVVIntrinsicUtils.h @@ -426,12 +426,11 @@ return PolicyAttrs; } unsigned getPolicyAttrsBits() const { - // Return following value. - // constexpr unsigned TAIL_UNDISTURBED = 0; - // constexpr unsigned TAIL_AGNOSTIC = 1; - // constexpr unsigned TAIL_AGNOSTIC_MASK_AGNOSTIC = 3; - // FIXME: how about value 2 - // int PolicyAttrs = TAIL_UNDISTURBED; + // CGBuiltin.cpp + // The 0th bit simulates the `vta` of RVV + // The 1st bit simulates the `vma` of RVV + // int PolicyAttrs = 0; + assert(PolicyAttrs.IsUnspecified == false); if (PolicyAttrs.isTUMAPolicy()) @@ -442,10 +441,6 @@ return 0; if (PolicyAttrs.isTAMUPolicy()) return 1; - if (PolicyAttrs.isTUPolicy()) - return 0; - if (PolicyAttrs.isTAPolicy()) - return 1; llvm_unreachable("unsupport policy"); return 0; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19480,10 +19480,11 @@ Intrinsic::ID ID = Intrinsic::not_intrinsic; unsigned NF = 1; - constexpr unsigned TAIL_UNDISTURBED = 0; - constexpr unsigned TAIL_AGNOSTIC = 1; - constexpr unsigned TAIL_AGNOSTIC_MASK_AGNOSTIC = 3; - int PolicyAttrs = TAIL_UNDISTURBED; + // The 0th bit simulates the `vta` of RVV + // The 1st bit simulates the `vma` of RVV + constexpr unsigned RVV_VTA = 0x1; + constexpr unsigned RVV_VMA = 0x2; + int PolicyAttrs = 0; bool IsMasked = false; // Required for overloaded intrinsics.