From: Krzysztof Parzyszek Date: Tue, 7 Feb 2017 02:31:53 +0000 (+0000) Subject: [Hexagon] Address ASAN and UBSAN failures after r294226 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1511b08784fa7eb77df003509cfa47370fd33ba3;p=llvm [Hexagon] Address ASAN and UBSAN failures after r294226 Reinstate r294256 with a fix. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294269 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp b/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp index d756d1bd45c..35f59c67ece 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp @@ -78,7 +78,7 @@ bool HexagonMCInstrInfo::canonicalizePacket(MCInstrInfo const &MCII, } // Examines packet and pad the packet, if needed, when an // end-loop is in the bundle. - HexagonMCInstrInfo::padEndloop(MCB); + HexagonMCInstrInfo::padEndloop(MCB, Context); // If compounding and duplexing didn't reduce the size below // 4 or less we have a packet that is too big. if (HexagonMCInstrInfo::bundleSize(MCB) > HEXAGON_PACKET_SIZE) @@ -273,9 +273,8 @@ int HexagonMCInstrInfo::getMaxValue(MCInstrInfo const &MCII, HexagonMCInstrInfo::isExtended(MCII, MCI)); if (S) // if value is signed - return ~(-1 << (HexagonMCInstrInfo::getExtentBits(MCII, MCI) - 1)); - else - return ~(-1 << HexagonMCInstrInfo::getExtentBits(MCII, MCI)); + return (1 << (HexagonMCInstrInfo::getExtentBits(MCII, MCI) - 1)) - 1; + return (1 << HexagonMCInstrInfo::getExtentBits(MCII, MCI)) - 1; } /// Return the minimum value of an extendable operand. @@ -288,9 +287,8 @@ int HexagonMCInstrInfo::getMinValue(MCInstrInfo const &MCII, HexagonMCInstrInfo::isExtended(MCII, MCI)); if (S) // if value is signed - return -1 << (HexagonMCInstrInfo::getExtentBits(MCII, MCI) - 1); - else - return 0; + return -(1 << (HexagonMCInstrInfo::getExtentBits(MCII, MCI) - 1)); + return 0; } StringRef HexagonMCInstrInfo::getName(MCInstrInfo const &MCII, @@ -747,7 +745,7 @@ bool HexagonMCInstrInfo::s23_2_reloc(MCExpr const &Expr) { return HExpr->s23_2_reloc(); } -void HexagonMCInstrInfo::padEndloop(MCInst &MCB) { +void HexagonMCInstrInfo::padEndloop(MCInst &MCB, MCContext &Context) { MCInst Nop; Nop.setOpcode(Hexagon::A2_nop); assert(isBundle(MCB)); @@ -755,7 +753,7 @@ void HexagonMCInstrInfo::padEndloop(MCInst &MCB) { (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_INNER_SIZE)) || ((HexagonMCInstrInfo::isOuterLoop(MCB) && (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_OUTER_SIZE)))) - MCB.addOperand(MCOperand::createInst(new MCInst(Nop))); + MCB.addOperand(MCOperand::createInst(new (Context) MCInst(Nop))); } bool HexagonMCInstrInfo::prefersSlot3(MCInstrInfo const &MCII, diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h b/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h index 83b859af57b..2e989adb5cc 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h @@ -256,7 +256,7 @@ bool mustExtend(MCExpr const &Expr); bool mustNotExtend(MCExpr const &Expr); // Pad the bundle with nops to satisfy endloop requirements -void padEndloop(MCInst &MCI); +void padEndloop(MCInst &MCI, MCContext &Context); bool prefersSlot3(MCInstrInfo const &MCII, MCInst const &MCI); // Replace the instructions inside MCB, represented by Candidate diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp b/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp index 1bf04dd9b8e..731ea918fda 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp @@ -80,15 +80,19 @@ public: unsigned HexagonResource::setWeight(unsigned s) { const unsigned SlotWeight = 8; const unsigned MaskWeight = SlotWeight - 1; - bool Key = (1 << s) & getUnits(); + unsigned Units = getUnits(); + unsigned Key = ((1u << s) & Units) != 0; // Calculate relative weight of the insn for the given slot, weighing it the // heavier the more restrictive the insn is and the lowest the slots that the // insn may be executed in. - Weight = - (Key << (SlotWeight * s)) * ((MaskWeight - countPopulation(getUnits())) - << countTrailingZeros(getUnits())); - return (Weight); + if (Key == 0 || Units == 0 || (SlotWeight*s >= 32)) + return Weight = 0; + + unsigned Ctpop = countPopulation(Units); + unsigned Cttz = countTrailingZeros(Units); + Weight = (1u << (SlotWeight * s)) * ((MaskWeight - Ctpop) << Cttz); + return Weight; } void HexagonCVIResource::SetupTUL(TypeUnitsAndLanes *TUL, StringRef CPU) { diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h b/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h index 209a0e61ead..36e8fa19d46 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h @@ -35,7 +35,7 @@ public: HexagonResource(unsigned s) { setUnits(s); }; void setUnits(unsigned s) { - Slots = s & ~(~0U << HEXAGON_PACKET_SIZE); + Slots = s & ((1u << HEXAGON_PACKET_SIZE) - 1); setWeight(s); }; unsigned setWeight(unsigned s);