]> granicus.if.org Git - llvm/commitdiff
[Hexagon] Address ASAN and UBSAN failures after r294226
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 7 Feb 2017 02:31:53 +0000 (02:31 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 7 Feb 2017 02:31:53 +0000 (02:31 +0000)
Reinstate r294256 with a fix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294269 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp
lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h
lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp
lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h

index d756d1bd45c141716372ee8d78912c6541ce657b..35f59c67ece539c02e1801ba4f1b68fe6d6b5312 100644 (file)
@@ -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,
index 83b859af57b6e62efdf2984ef60f4940d15e6d07..2e989adb5ccbf0830b73a5128934edec325b7110 100644 (file)
@@ -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
index 1bf04dd9b8ec4f01071299e5c3a06d5ec259fe99..731ea918fda5f3ef1d8758bdd4e16e009482babf 100644 (file)
@@ -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) {
index 209a0e61eadda42f016338fbad888c25b619b5a7..36e8fa19d4671772ad0ba73ec83f8126d07b6d4e 100644 (file)
@@ -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);