When TCO is turned on, it is possible to end up with aliasing FrameIndex's. Therefore,
authorOwen Anderson <resistor@mac.com>
Mon, 20 Sep 2010 20:39:59 +0000 (20:39 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 20 Sep 2010 20:39:59 +0000 (20:39 +0000)
CombinerAA cannot assume that different FrameIndex's never alias, but can instead use
MachineFrameInfo to get the actual offsets of these slots and check for actual aliasing.

This fixes CodeGen/X86/2010-02-19-TailCallRetAddrBug.ll and CodeGen/X86/tailcallstack64.ll
when CombinerAA is enabled, modulo a different register allocation sequence.

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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/2010-09-17-SideEffectsInChain.ll

index c9c4d91e973610487a8149e843d45f2e5438c474..91e370b27195f3239a5fdd7b7b72c38eaadcb951 100644 (file)
@@ -7030,8 +7030,19 @@ bool DAGCombiner::isAlias(SDValue Ptr1, int64_t Size1,
   if (Base1 == Base2 || (GV1 && (GV1 == GV2)) || (CV1 && (CV1 == CV2)))
     return !((Offset1 + Size1) <= Offset2 || (Offset2 + Size2) <= Offset1);
 
-  // If we know what the bases are, and they aren't identical, then we know they
-  // cannot alias.
+  // It is possible for different frame indices to alias each other, mostly
+  // when tail call optimization reuses return address slots for arguments.
+  // To catch this case, look up the actual index of frame indices to compute
+  // the real alias relationship.
+  if (isFrameIndex1 && isFrameIndex2) {
+    MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
+    Offset1 += MFI->getObjectOffset(cast<FrameIndexSDNode>(Base1)->getIndex());
+    Offset2 += MFI->getObjectOffset(cast<FrameIndexSDNode>(Base2)->getIndex());
+    return !((Offset1 + Size1) <= Offset2 || (Offset2 + Size2) <= Offset1);
+  }
+
+  // Otherwise, if we know what the bases are, and they aren't identical, then 
+  // we know they cannot alias.
   if ((isFrameIndex1 || CV1 || GV1) && (isFrameIndex2 || CV2 || GV2))
     return false;
 
index 35434ffafaf765a97393b83d56b8d0d30ddb95e2..8fe0309421e509e03a60979f639a982592c441b9 100644 (file)
@@ -19,8 +19,8 @@ entry:
 }
 
 ; CHECK: movq  ___stack_chk_guard@GOTPCREL(%rip), %rax
-; CHECK: movb  (%rsp), %dl
-; CHECK-NEXT: movb     30(%rsp), %sil
-; CHECK: movb  %dl, (%rsp)
-; CHECK-NEXT: movb     %sil, 30(%rsp)
+; CHECK: movb  30(%rsp), %dl
+; CHECK: movb  (%rsp), %sil
+; CHECK: movb  %sil, (%rsp)
+; CHECK: movb  %dl, 30(%rsp)
 ; CHECK: callq ___stack_chk_fail