[mips] Warn when crc, ginv, virt flags are used with too old revision

CRC and GINV ASE require revision 6, Virtualization requires revision 5.
Print a warning when revision is older than required.

Differential Revision: https://reviews.llvm.org/D48843

llvm-svn: 336296
This commit is contained in:
Vladimir Stefanovic 2018-07-04 19:26:31 +00:00
parent cb4f0c5c07
commit 87b60a0e00
3 changed files with 78 additions and 11 deletions

View File

@ -61,8 +61,10 @@ static cl::opt<bool>
cl::desc("Enable gp-relative addressing of mips small data items"));
bool MipsSubtarget::DspWarningPrinted = false;
bool MipsSubtarget::MSAWarningPrinted = false;
bool MipsSubtarget::VirtWarningPrinted = false;
bool MipsSubtarget::CRCWarningPrinted = false;
bool MipsSubtarget::GINVWarningPrinted = false;
void MipsSubtarget::anchor() {}
@ -172,16 +174,27 @@ MipsSubtarget::MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
}
}
if (hasMSA() && !MSAWarningPrinted) {
if (hasMips64() && !hasMips64r5()) {
errs() << "warning: the 'msa' ASE requires MIPS64 revision 5 or "
<< "greater\n";
MSAWarningPrinted = true;
} else if (hasMips32() && !hasMips32r5()) {
errs() << "warning: the 'msa' ASE requires MIPS32 revision 5 or "
<< "greater\n";
MSAWarningPrinted = true;
}
StringRef ArchName = hasMips64() ? "MIPS64" : "MIPS32";
if (!hasMips32r5() && hasMSA() && !MSAWarningPrinted) {
errs() << "warning: the 'msa' ASE requires " << ArchName
<< " revision 5 or greater\n";
MSAWarningPrinted = true;
}
if (!hasMips32r5() && hasVirt() && !VirtWarningPrinted) {
errs() << "warning: the 'virt' ASE requires " << ArchName
<< " revision 5 or greater\n";
VirtWarningPrinted = true;
}
if (!hasMips32r6() && hasCRC() && !CRCWarningPrinted) {
errs() << "warning: the 'crc' ASE requires " << ArchName
<< " revision 6 or greater\n";
CRCWarningPrinted = true;
}
if (!hasMips32r6() && hasGINV() && !GINVWarningPrinted) {
errs() << "warning: the 'ginv' ASE requires " << ArchName
<< " revision 6 or greater\n";
GINVWarningPrinted = true;
}
CallLoweringInfo.reset(new MipsCallLowering(*getTargetLowering()));

View File

@ -54,6 +54,15 @@ class MipsSubtarget : public MipsGenSubtargetInfo {
// Used to avoid printing msa warnings multiple times.
static bool MSAWarningPrinted;
// Used to avoid printing crc warnings multiple times.
static bool CRCWarningPrinted;
// Used to avoid printing ginv warnings multiple times.
static bool GINVWarningPrinted;
// Used to avoid printing virt warnings multiple times.
static bool VirtWarningPrinted;
// Mips architecture version
MipsArchEnum MipsArchVersion;

View File

@ -28,6 +28,36 @@
; RUN: llc -march=mips64 -mattr=+mips64r2 -mattr=+dsp < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=DSP_64_NO_WARNING
; Check virt warnings.
; RUN: llc -march=mips -mattr=+mips32r2 -mattr=+virt < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=VIRT_32
; RUN: llc -march=mips64 -mattr=+mips64r2 -mattr=+virt < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=VIRT_64
; RUN: llc -march=mips -mattr=+mips32r5 -mattr=+virt < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=VIRT_32_NO_WARNING
; RUN: llc -march=mips64 -mattr=+mips64r5 -mattr=+virt < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=VIRT_64_NO_WARNING
; Check crc warnings.
; RUN: llc -march=mips -mattr=+mips32r2 -mattr=+crc < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=CRC_32
; RUN: llc -march=mips64 -mattr=+mips64r2 -mattr=+crc < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=CRC_64
; RUN: llc -march=mips -mattr=+mips32r6 -mattr=+crc < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=CRC_32_NO_WARNING
; RUN: llc -march=mips64 -mattr=+mips64r6 -mattr=+crc < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=CRC_64_NO_WARNING
; Check ginv warnings.
; RUN: llc -march=mips -mattr=+mips32r2 -mattr=+ginv < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=GINV_32
; RUN: llc -march=mips64 -mattr=+mips64r2 -mattr=+ginv < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=GINV_64
; RUN: llc -march=mips -mattr=+mips32r6 -mattr=+ginv < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=GINV_32_NO_WARNING
; RUN: llc -march=mips64 -mattr=+mips64r6 -mattr=+ginv < %s 2>&1 | \
; RUN: FileCheck %s -check-prefix=GINV_64_NO_WARNING
; MSA_32: warning: the 'msa' ASE requires MIPS32 revision 5 or greater
; MSA_64: warning: the 'msa' ASE requires MIPS64 revision 5 or greater
; MSA_32_NO_WARNING-NOT: warning: the 'msa' ASE requires MIPS32 revision 5 or greater
@ -42,3 +72,18 @@
; DSP_64: warning: the 'dsp' ASE requires MIPS64 revision 2 or greater
; DSP_32_NO_WARNING-NOT: warning: the 'dsp' ASE requires MIPS32 revision 2 or greater
; DSP_64_NO_WARNING-NOT: warning: the 'dsp' ASE requires MIPS64 revision 2 or greater
; VIRT_32: warning: the 'virt' ASE requires MIPS32 revision 5 or greater
; VIRT_64: warning: the 'virt' ASE requires MIPS64 revision 5 or greater
; VIRT_32_NO_WARNING-NOT: warning: the 'virt' ASE requires MIPS32 revision 5 or greater
; VIRT_64_NO_WARNING-NOT: warning: the 'virt' ASE requires MIPS64 revision 5 or greater
; CRC_32: warning: the 'crc' ASE requires MIPS32 revision 6 or greater
; CRC_64: warning: the 'crc' ASE requires MIPS64 revision 6 or greater
; CRC_32_NO_WARNING-NOT: warning: the 'crc' ASE requires MIPS32 revision 6 or greater
; CRC_64_NO_WARNING-NOT: warning: the 'crc' ASE requires MIPS64 revision 6 or greater
; GINV_32: warning: the 'ginv' ASE requires MIPS32 revision 6 or greater
; GINV_64: warning: the 'ginv' ASE requires MIPS64 revision 6 or greater
; GINV_32_NO_WARNING-NOT: warning: the 'ginv' ASE requires MIPS32 revision 6 or greater
; GINV_64_NO_WARNING-NOT: warning: the 'ginv' ASE requires MIPS64 revision 6 or greater