]> granicus.if.org Git - llvm/commitdiff
[StackColoring] Update AliasAnalysis information in stack coloring pass (part 2)
authorHiroshi Inoue <inouehrs@jp.ibm.com>
Wed, 2 Aug 2017 18:16:32 +0000 (18:16 +0000)
committerHiroshi Inoue <inouehrs@jp.ibm.com>
Wed, 2 Aug 2017 18:16:32 +0000 (18:16 +0000)
This patch is update after the first patch (https://reviews.llvm.org/rL309651) based on the post-commit comments.

Stack coloring pass need to maintain AliasAnalysis information when merging stack slots of different types.
Actually, there is a FIXME comment in StackColoring.cpp

// FIXME: In order to enable the use of TBAA when using AA in CodeGen,
// we'll also need to update the TBAA nodes in MMOs with values
// derived from the merged allocas.

But, TBAA has been already enabled in CodeGen without fixing this pass.
The incorrect TBAA metadata results in recent failures in bootstrap test on ppc64le (PR33928) by allowing unsafe instruction scheduling.
Although we observed the problem on ppc64le, this is a platform neutral issue.

This patch makes the stack coloring pass maintains AliasAnalysis information when merging multiple stack slots.

This patch fixes PR33928.

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

lib/Analysis/ValueTracking.cpp
lib/CodeGen/StackColoring.cpp

index 9e80bbef3c85d0d7a39a78cfe8e5c73b0701f944..9ab98ce6175539d7bd272e451e17a0820c232ddd 100644 (file)
@@ -3319,13 +3319,6 @@ void llvm::getUnderlyingObjectsForCodeGen(const Value *V,
     GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL);
 
     for (Value *V : Objs) {
-      // If GetUnderlyingObjects fails to find an identifiable object,
-      // getUnderlyingObjectsForCodeGen also fails for safety.
-      if (!isIdentifiedObject(V)) {
-        Objects.clear();
-        return;
-      }
-
       if (!Visited.insert(V).second)
         continue;
       if (Operator::getOpcode(V) == Instruction::IntToPtr) {
@@ -3336,6 +3329,12 @@ void llvm::getUnderlyingObjectsForCodeGen(const Value *V,
           continue;
         }
       }
+      // If GetUnderlyingObjects fails to find an identifiable object,
+      // getUnderlyingObjectsForCodeGen also fails for safety.
+      if (!isIdentifiedObject(V)) {
+        Objects.clear();
+        return;
+      }
       Objects.push_back(const_cast<Value *>(V));
     }
   } while (!Working.empty());
index d35bdea44726e1085c8da04d3129567a7682876e..e5fc5402cb41befac43d23b2b68b09c940732d52 100644 (file)
@@ -1001,7 +1001,7 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
       }
 
       // We adjust AliasAnalysis information for merged stack slots.
-      MachineSDNode::mmo_iterator MemOps =
+      MachineSDNode::mmo_iterator NewMemOps =
           MF->allocateMemRefsArray(I.getNumMemOperands());
       unsigned MemOpIdx = 0;
       bool ReplaceMemOps = false;
@@ -1030,17 +1030,17 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
           }
         }
         if (MayHaveConflictingAAMD) {
-          MemOps[MemOpIdx++] = MF->getMachineMemOperand(MMO, AAMDNodes());
+          NewMemOps[MemOpIdx++] = MF->getMachineMemOperand(MMO, AAMDNodes());
           ReplaceMemOps = true;
         }
         else
-          MemOps[MemOpIdx++] = MMO;
+          NewMemOps[MemOpIdx++] = MMO;
       }
 
       // If any memory operand is updated, set memory references of
       // this instruction.
       if (ReplaceMemOps)
-        I.setMemRefs(std::make_pair(MemOps, I.getNumMemOperands()));
+        I.setMemRefs(std::make_pair(NewMemOps, I.getNumMemOperands()));
     }
 
   // Update the location of C++ catch objects for the MSVC personality routine.