Skip to content

Commit 9045866

Browse files
authored
merge main into amd-staging (#449)
2 parents 9c0f672 + a10791d commit 9045866

File tree

25 files changed

+5767
-60
lines changed

25 files changed

+5767
-60
lines changed

libc/include/wchar.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ macros:
66
types:
77
- type_name: FILE
88
- type_name: size_t
9+
# TODO: Remove this once we have a function declaration using "struct tm"
10+
# (wcsftime). We're declaring it here now, since libc++ expects
11+
# forward-declaration of "struct tm" in the <wchar.h> header.
12+
- type_name: struct_tm
913
- type_name: wint_t
1014
- type_name: wchar_t
1115
- type_name: mbstate_t

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ def __aeabi_f2ulz : RuntimeLibcallImpl<FPTOUINT_F32_I64>; // CallingConv::ARM_AA
15851585
// RTABI chapter 4.1.2, Table 7
15861586
def __aeabi_d2f : RuntimeLibcallImpl<FPROUND_F64_F32>; // CallingConv::ARM_AAPCS
15871587
def __aeabi_d2h : RuntimeLibcallImpl<FPROUND_F64_F16>; // CallingConv::ARM_AAPCS
1588-
def __aeabi_f2d : RuntimeLibcallImpl<FPEXT_F32_F64>; // CallingConv::ARM_AAPCS
1588+
def __aeabi_f2d : RuntimeLibcallImpl<FPEXT_F32_F64>; // CallingConv::ARM_AAPCS
15891589

15901590
// Integer to floating-point conversions.
15911591
// RTABI chapter 4.1.2, Table 8

llvm/lib/Target/Hexagon/HexagonPatternsHVX.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,9 @@ let Predicates = [UseHVX] in {
612612
(V6_vandvrt HvxVR:$Vs, (ToI32 0x01010101))>;
613613
def: Pat<(VecQ32 (trunc HVI32:$Vs)),
614614
(V6_vandvrt HvxVR:$Vs, (ToI32 0x01010101))>;
615+
def: Pat<(VecQ16 (trunc HWI32:$Vss)),
616+
(Combineq(VecQ32(V6_vandvrt (HiVec $Vss), (ToI32 0x01010101))),
617+
(VecQ32 (V6_vandvrt (LoVec $Vss), (ToI32 0x01010101))))>;
615618
}
616619

617620
let Predicates = [UseHVX] in {

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ class RISCVInstructionSelector : public InstructionSelector {
9292
void emitFence(AtomicOrdering FenceOrdering, SyncScope::ID FenceSSID,
9393
MachineIRBuilder &MIB) const;
9494
bool selectUnmergeValues(MachineInstr &MI, MachineIRBuilder &MIB) const;
95+
void addVectorLoadStoreOperands(MachineInstr &I,
96+
SmallVectorImpl<SrcOp> &SrcOps,
97+
unsigned &CurOp, bool IsMasked,
98+
bool IsStrided) const;
9599
bool selectIntrinsicWithSideEffects(MachineInstr &I,
96100
MachineIRBuilder &MIB) const;
97101

@@ -716,6 +720,26 @@ static unsigned selectRegImmLoadStoreOp(unsigned GenericOpc, unsigned OpSize) {
716720
return GenericOpc;
717721
}
718722

723+
void RISCVInstructionSelector::addVectorLoadStoreOperands(
724+
MachineInstr &I, SmallVectorImpl<SrcOp> &SrcOps, unsigned &CurOp,
725+
bool IsMasked, bool IsStrided) const {
726+
// Base Pointer
727+
auto PtrReg = I.getOperand(CurOp++).getReg();
728+
SrcOps.push_back(PtrReg);
729+
730+
// Stride
731+
if (IsStrided) {
732+
auto StrideReg = I.getOperand(CurOp++).getReg();
733+
SrcOps.push_back(StrideReg);
734+
}
735+
736+
// Mask
737+
if (IsMasked) {
738+
auto MaskReg = I.getOperand(CurOp++).getReg();
739+
SrcOps.push_back(MaskReg);
740+
}
741+
}
742+
719743
bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
720744
MachineInstr &I, MachineIRBuilder &MIB) const {
721745
// Find the intrinsic ID.
@@ -752,21 +776,7 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
752776
SrcOps.push_back(Register(RISCV::NoRegister));
753777
}
754778

755-
// Base Pointer
756-
auto PtrReg = I.getOperand(CurOp++).getReg();
757-
SrcOps.push_back(PtrReg);
758-
759-
// Stride
760-
if (IsStrided) {
761-
auto StrideReg = I.getOperand(CurOp++).getReg();
762-
SrcOps.push_back(StrideReg);
763-
}
764-
765-
// Mask
766-
if (IsMasked) {
767-
auto MaskReg = I.getOperand(CurOp++).getReg();
768-
SrcOps.push_back(MaskReg);
769-
}
779+
addVectorLoadStoreOperands(I, SrcOps, CurOp, IsMasked, IsStrided);
770780

771781
RISCVVType::VLMUL LMUL = RISCVTargetLowering::getLMUL(getMVTForLLT(VT));
772782
const RISCV::VLEPseudo *P =
@@ -795,6 +805,48 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
795805
I.eraseFromParent();
796806
return constrainSelectedInstRegOperands(*PseudoMI, TII, TRI, RBI);
797807
}
808+
case Intrinsic::riscv_vsm:
809+
case Intrinsic::riscv_vse:
810+
case Intrinsic::riscv_vse_mask:
811+
case Intrinsic::riscv_vsse:
812+
case Intrinsic::riscv_vsse_mask: {
813+
bool IsMasked = IntrinID == Intrinsic::riscv_vse_mask ||
814+
IntrinID == Intrinsic::riscv_vsse_mask;
815+
bool IsStrided = IntrinID == Intrinsic::riscv_vsse ||
816+
IntrinID == Intrinsic::riscv_vsse_mask;
817+
LLT VT = MRI->getType(I.getOperand(1).getReg());
818+
unsigned Log2SEW = Log2_32(VT.getScalarSizeInBits());
819+
820+
// Sources
821+
unsigned CurOp = 1;
822+
SmallVector<SrcOp, 4> SrcOps; // Source registers.
823+
824+
// Store value
825+
auto PassthruReg = I.getOperand(CurOp++).getReg();
826+
SrcOps.push_back(PassthruReg);
827+
828+
addVectorLoadStoreOperands(I, SrcOps, CurOp, IsMasked, IsStrided);
829+
830+
RISCVVType::VLMUL LMUL = RISCVTargetLowering::getLMUL(getMVTForLLT(VT));
831+
const RISCV::VSEPseudo *P = RISCV::getVSEPseudo(
832+
IsMasked, IsStrided, Log2SEW, static_cast<unsigned>(LMUL));
833+
834+
auto PseudoMI = MIB.buildInstr(P->Pseudo, {}, SrcOps);
835+
836+
// Select VL
837+
auto VLOpFn = renderVLOp(I.getOperand(CurOp++));
838+
for (auto &RenderFn : *VLOpFn)
839+
RenderFn(PseudoMI);
840+
841+
// SEW
842+
PseudoMI.addImm(Log2SEW);
843+
844+
// Memref
845+
PseudoMI.cloneMemRefs(I);
846+
847+
I.eraseFromParent();
848+
return constrainSelectedInstRegOperands(*PseudoMI, TII, TRI, RBI);
849+
}
798850
}
799851
}
800852

llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ bool RISCVExpandPseudo::expandMI(MachineBasicBlock &MBB,
127127
case RISCV::PseudoCCAND:
128128
case RISCV::PseudoCCOR:
129129
case RISCV::PseudoCCXOR:
130+
case RISCV::PseudoCCMAX:
131+
case RISCV::PseudoCCMAXU:
132+
case RISCV::PseudoCCMIN:
133+
case RISCV::PseudoCCMINU:
130134
case RISCV::PseudoCCADDW:
131135
case RISCV::PseudoCCSUBW:
132136
case RISCV::PseudoCCSLL:
@@ -217,6 +221,7 @@ bool RISCVExpandPseudo::expandCCOp(MachineBasicBlock &MBB,
217221
.addImm(0);
218222
} else {
219223
unsigned NewOpc;
224+
// clang-format off
220225
switch (MI.getOpcode()) {
221226
default:
222227
llvm_unreachable("Unexpected opcode!");
@@ -228,6 +233,10 @@ bool RISCVExpandPseudo::expandCCOp(MachineBasicBlock &MBB,
228233
case RISCV::PseudoCCAND: NewOpc = RISCV::AND; break;
229234
case RISCV::PseudoCCOR: NewOpc = RISCV::OR; break;
230235
case RISCV::PseudoCCXOR: NewOpc = RISCV::XOR; break;
236+
case RISCV::PseudoCCMAX: NewOpc = RISCV::MAX; break;
237+
case RISCV::PseudoCCMIN: NewOpc = RISCV::MIN; break;
238+
case RISCV::PseudoCCMAXU: NewOpc = RISCV::MAXU; break;
239+
case RISCV::PseudoCCMINU: NewOpc = RISCV::MINU; break;
231240
case RISCV::PseudoCCADDI: NewOpc = RISCV::ADDI; break;
232241
case RISCV::PseudoCCSLLI: NewOpc = RISCV::SLLI; break;
233242
case RISCV::PseudoCCSRLI: NewOpc = RISCV::SRLI; break;
@@ -250,6 +259,7 @@ bool RISCVExpandPseudo::expandCCOp(MachineBasicBlock &MBB,
250259
case RISCV::PseudoCCNDS_BFOS: NewOpc = RISCV::NDS_BFOS; break;
251260
case RISCV::PseudoCCNDS_BFOZ: NewOpc = RISCV::NDS_BFOZ; break;
252261
}
262+
// clang-format on
253263

254264
if (NewOpc == RISCV::NDS_BFOZ || NewOpc == RISCV::NDS_BFOS) {
255265
BuildMI(TrueBB, DL, TII->get(NewOpc), DestReg)

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,11 @@ def TuneShortForwardBranchOpt
18511851
def HasShortForwardBranchOpt : Predicate<"Subtarget->hasShortForwardBranchOpt()">;
18521852
def NoShortForwardBranchOpt : Predicate<"!Subtarget->hasShortForwardBranchOpt()">;
18531853

1854+
def TuneShortForwardBranchIMinMax
1855+
: SubtargetFeature<"short-forward-branch-i-minmax", "HasShortForwardBranchIMinMax",
1856+
"true", "Enable short forward branch optimization for min,max instructions in Zbb",
1857+
[TuneShortForwardBranchOpt]>;
1858+
18541859
// Some subtargets require a S2V transfer buffer to move scalars into vectors.
18551860
// FIXME: Forming .vx/.vf/.wx/.wf can reduce register pressure.
18561861
def TuneNoSinkSplatOperands

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,6 +1699,10 @@ unsigned getPredicatedOpcode(unsigned Opcode) {
16991699
case RISCV::AND: return RISCV::PseudoCCAND;
17001700
case RISCV::OR: return RISCV::PseudoCCOR;
17011701
case RISCV::XOR: return RISCV::PseudoCCXOR;
1702+
case RISCV::MAX: return RISCV::PseudoCCMAX;
1703+
case RISCV::MAXU: return RISCV::PseudoCCMAXU;
1704+
case RISCV::MIN: return RISCV::PseudoCCMIN;
1705+
case RISCV::MINU: return RISCV::PseudoCCMINU;
17021706

17031707
case RISCV::ADDI: return RISCV::PseudoCCADDI;
17041708
case RISCV::SLLI: return RISCV::PseudoCCSLLI;
@@ -1735,14 +1739,21 @@ unsigned getPredicatedOpcode(unsigned Opcode) {
17351739
/// return the defining instruction.
17361740
static MachineInstr *canFoldAsPredicatedOp(Register Reg,
17371741
const MachineRegisterInfo &MRI,
1738-
const TargetInstrInfo *TII) {
1742+
const TargetInstrInfo *TII,
1743+
const RISCVSubtarget &STI) {
17391744
if (!Reg.isVirtual())
17401745
return nullptr;
17411746
if (!MRI.hasOneNonDBGUse(Reg))
17421747
return nullptr;
17431748
MachineInstr *MI = MRI.getVRegDef(Reg);
17441749
if (!MI)
17451750
return nullptr;
1751+
1752+
if (!STI.hasShortForwardBranchIMinMax() &&
1753+
(MI->getOpcode() == RISCV::MAX || MI->getOpcode() == RISCV::MIN ||
1754+
MI->getOpcode() == RISCV::MINU || MI->getOpcode() == RISCV::MAXU))
1755+
return nullptr;
1756+
17461757
// Check if MI can be predicated and folded into the CCMOV.
17471758
if (getPredicatedOpcode(MI->getOpcode()) == RISCV::INSTRUCTION_LIST_END)
17481759
return nullptr;
@@ -1806,10 +1817,10 @@ RISCVInstrInfo::optimizeSelect(MachineInstr &MI,
18061817

18071818
MachineRegisterInfo &MRI = MI.getParent()->getParent()->getRegInfo();
18081819
MachineInstr *DefMI =
1809-
canFoldAsPredicatedOp(MI.getOperand(5).getReg(), MRI, this);
1820+
canFoldAsPredicatedOp(MI.getOperand(5).getReg(), MRI, this, STI);
18101821
bool Invert = !DefMI;
18111822
if (!DefMI)
1812-
DefMI = canFoldAsPredicatedOp(MI.getOperand(4).getReg(), MRI, this);
1823+
DefMI = canFoldAsPredicatedOp(MI.getOperand(4).getReg(), MRI, this, STI);
18131824
if (!DefMI)
18141825
return nullptr;
18151826

llvm/lib/Target/RISCV/RISCVInstrInfoSFB.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ def PseudoCCSRA : SFBALU_rr;
106106
def PseudoCCAND : SFBALU_rr;
107107
def PseudoCCOR : SFBALU_rr;
108108
def PseudoCCXOR : SFBALU_rr;
109+
def PseudoCCMAX : SFBALU_rr;
110+
def PseudoCCMIN : SFBALU_rr;
111+
def PseudoCCMAXU : SFBALU_rr;
112+
def PseudoCCMINU : SFBALU_rr;
109113

110114
def PseudoCCADDI : SFBALU_ri;
111115
def PseudoCCANDI : SFBALU_ri;

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,6 +1419,8 @@ static void narrowToSingleScalarRecipes(VPlan &Plan) {
14191419
true /*IsSingleScalar*/);
14201420
Clone->insertBefore(RepOrWidenR);
14211421
RepOrWidenR->replaceAllUsesWith(Clone);
1422+
if (isDeadRecipe(*RepOrWidenR))
1423+
RepOrWidenR->eraseFromParent();
14221424
}
14231425
}
14241426
}

0 commit comments

Comments
 (0)