Allow hasProperty() to be called on bundle-internal instructions.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 10 Jan 2013 18:42:44 +0000 (18:42 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 10 Jan 2013 18:42:44 +0000 (18:42 +0000)
When calling hasProperty() on an instruction inside a bundle, it should
always behave as if IgnoreBundle was passed, and just return properties
for the current instruction.

Only attempt to aggregate bundle properties whan asked about the bundle
header.

The assertion fires on existing ARM test cases without this fix.

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

include/llvm/CodeGen/MachineInstr.h
lib/CodeGen/MachineInstr.cpp

index 3d2c61761c6d5a8a98b2ccf4dd508b3de9a62077..17eeb94e3f728cb97c4c71593c20687ae527cb83 100644 (file)
@@ -313,11 +313,11 @@ public:
   /// The second argument indicates whether the query should look inside
   /// instruction bundles.
   bool hasProperty(unsigned MCFlag, QueryType Type = AnyInBundle) const {
-    // Inline the fast path.
-    if (Type == IgnoreBundle || !isBundled())
+    // Inline the fast path for unbundled or bundle-internal instructions.
+    if (Type == IgnoreBundle || !isBundled() || isBundledWithPred())
       return getDesc().getFlags() & (1 << MCFlag);
 
-    // If we have a bundle, take the slow path.
+    // If this is the first instruction in a bundle, take the slow path.
     return hasPropertyInBundle(1 << MCFlag, Type);
   }
 
index cdf46b631f92af55b909392b9a81bb3f9c0244f8..df82a17a2b21ba3a50815140c56fa14c39022bf3 100644 (file)
@@ -752,6 +752,7 @@ void MachineInstr::addMemOperand(MachineFunction &MF,
 }
 
 bool MachineInstr::hasPropertyInBundle(unsigned Mask, QueryType Type) const {
+  assert(!isBundledWithPred() && "Must be called on bundle header");
   for (MachineBasicBlock::const_instr_iterator MII = this;; ++MII) {
     if (MII->getDesc().getFlags() & Mask) {
       if (Type == AnyInBundle)