From b17f036a99eba19194b81a6d56e7f08fa5e0e92c Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Fri, 28 Sep 2018 10:14:11 -0500 Subject: [PATCH] [Hexagon] Consider HVX reg aliases for .cur warning --- .../Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp | 12 +++++++++--- llvm/test/MC/Hexagon/hvx_cur_alias.s | 9 +++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 llvm/test/MC/Hexagon/hvx_cur_alias.s diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp index 5f094dfeb95c..0d43de140ca9 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp @@ -597,9 +597,15 @@ void HexagonMCChecker::checkRegisterCurDefs() { for (auto const &I : HexagonMCInstrInfo::bundleInstructions(MCII, MCB)) { if (HexagonMCInstrInfo::isCVINew(MCII, I) && HexagonMCInstrInfo::getDesc(MCII, I).mayLoad()) { - unsigned Register = I.getOperand(0).getReg(); - if (!registerUsed(Register)) - reportWarning("Register `" + Twine(RI.getName(Register)) + + const unsigned RegDef = I.getOperand(0).getReg(); + + bool HasRegDefUse = false; + for (MCRegAliasIterator Alias(RegDef, &RI, true); Alias.isValid(); + ++Alias) + HasRegDefUse = HasRegDefUse || registerUsed(*Alias); + + if (!HasRegDefUse) + reportWarning("Register `" + Twine(RI.getName(RegDef)) + "' used with `.cur' " "but not used in the same packet"); } diff --git a/llvm/test/MC/Hexagon/hvx_cur_alias.s b/llvm/test/MC/Hexagon/hvx_cur_alias.s new file mode 100644 index 000000000000..ed16659d4522 --- /dev/null +++ b/llvm/test/MC/Hexagon/hvx_cur_alias.s @@ -0,0 +1,9 @@ +# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv60 -mhvx -filetype=obj %s 2>&1 | llvm-objdump --mattr=+hvx -d - | FileCheck %s + +{ v2.cur = vmem(r11++m0) + v5:4.h = vmpa(v3:2.ub,v5:4.ub) +} + +# CHECK-NOT: warning: register `{{.+}}' used with `.cur' but not used in the same packet +# CHECK: vmpa +# CHECK: vmem