- If a dynamic_stackalloc alignment requirement is <= stack alignment, then the align...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 16 Aug 2007 23:46:29 +0000 (23:46 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 16 Aug 2007 23:46:29 +0000 (23:46 +0000)
- *Always* round up the size of the allocation to multiples of stack
alignment to ensure the stack ptr is never left in an invalid state after a dynamic_stackalloc.

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

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 90ed4545bd0187140c779cfc6bff5865d07d46d0..a99640a1704364147535fa6456f470586ba7ba39 100644 (file)
@@ -2329,21 +2329,21 @@ void SelectionDAGLowering::visitAlloca(AllocaInst &I) {
   AllocSize = DAG.getNode(ISD::MUL, IntPtr, AllocSize,
                           getIntPtrConstant(TySize));
 
-  // Handle alignment.  If the requested alignment is less than the stack
-  // alignment, ignore it and round the size of the allocation up to the stack
-  // alignment size.  If the size is greater than or equal to the stack
-  // alignment, we note this in the DYNAMIC_STACKALLOC node.
+  // Handle alignment.  If the requested alignment is less than or equal to
+  // the stack alignment, ignore it.  If the size is greater than or equal to
+  // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
   unsigned StackAlign =
     TLI.getTargetMachine().getFrameInfo()->getStackAlignment();
-  if (Align < StackAlign) {
+  if (Align <= StackAlign)
     Align = 0;
-    // Add SA-1 to the size.
-    AllocSize = DAG.getNode(ISD::ADD, AllocSize.getValueType(), AllocSize,
-                            getIntPtrConstant(StackAlign-1));
-    // Mask out the low bits for alignment purposes.
-    AllocSize = DAG.getNode(ISD::AND, AllocSize.getValueType(), AllocSize,
-                            getIntPtrConstant(~(uint64_t)(StackAlign-1)));
-  }
+
+  // Round the size of the allocation up to the stack alignment size
+  // by add SA-1 to the size.
+  AllocSize = DAG.getNode(ISD::ADD, AllocSize.getValueType(), AllocSize,
+                          getIntPtrConstant(StackAlign-1));
+  // Mask out the low bits for alignment purposes.
+  AllocSize = DAG.getNode(ISD::AND, AllocSize.getValueType(), AllocSize,
+                          getIntPtrConstant(~(uint64_t)(StackAlign-1)));
 
   SDOperand Ops[] = { getRoot(), AllocSize, getIntPtrConstant(Align) };
   const MVT::ValueType *VTs = DAG.getNodeValueTypes(AllocSize.getValueType(),