Hexagon: Paper over the undefined behaviour introduced by r238692
authorJustin Bogner <mail@justinbogner.com>
Wed, 24 Jun 2015 07:03:07 +0000 (07:03 +0000)
committerJustin Bogner <mail@justinbogner.com>
Wed, 24 Jun 2015 07:03:07 +0000 (07:03 +0000)
This stops shifting a 32-bit value by such absurd amounts as 96 and
120. We do this by dropping a call to the function that was doing this
entirely, which rather surprisingly doesn't break *any* tests.

I've also added an assert in the misbehaving function to prove that
it's no longer being called with completely invalid arguments.

This change looks pretty bogus and we should probably be reverting
r238692 instead, but this is hard to do with the number of follow ups
that have happened since. It can't be any worse than the undefined
behaviour that was happening before though.

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

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

index feaaa4f780d50ca97ddc40c57d1e49dd3c9e8d46..41112ac0b46ee9f4e90cb6da9b881c38eaa67f19 100644 (file)
@@ -81,6 +81,9 @@ unsigned HexagonResource::setWeight(unsigned s) {
   const unsigned MaskWeight = SlotWeight - 1;
   bool Key = (1 << s) & getUnits();
 
+  // TODO: Improve this API so that we can prevent misuse statically.
+  assert(SlotWeight * s < 32 && "Argument to setWeight too large.");
+
   // 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.
index 949ad8cebdcd7be4f665df151b79ad74f771246f..8b6c72ee25e647bfad8a06f45790ea934fa0eaab 100644 (file)
@@ -35,7 +35,6 @@ public:
 
   void setUnits(unsigned s) {
     Slots = s & ~(~0U << HEXAGON_PACKET_SIZE);
-    setWeight(s);
   };
   unsigned setWeight(unsigned s);