diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-07 02:31:53 +0000 | 
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-07 02:31:53 +0000 | 
| commit | 0605f3fdddf5ceac03b26d3ce321aa454125fba4 (patch) | |
| tree | fb890d8c3b7b4350cad5b2feded031af957e4ea3 /llvm/lib/Target/Hexagon | |
| parent | f80403d8ee798b1924d00c580c74f745c538cfab (diff) | |
| download | bcm5719-llvm-0605f3fdddf5ceac03b26d3ce321aa454125fba4.tar.gz bcm5719-llvm-0605f3fdddf5ceac03b26d3ce321aa454125fba4.zip  | |
[Hexagon] Address ASAN and UBSAN failures after r294226
Reinstate r294256 with a fix.
llvm-svn: 294269
Diffstat (limited to 'llvm/lib/Target/Hexagon')
4 files changed, 18 insertions, 16 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp index d756d1bd45c..35f59c67ece 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp +++ b/llvm/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/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h index 83b859af57b..2e989adb5cc 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h +++ b/llvm/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/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp index 1bf04dd9b8e..731ea918fda 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp +++ b/llvm/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/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h index 209a0e61ead..36e8fa19d46 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h +++ b/llvm/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);  | 

