[llvm-commits] [llvm] r41132 - /llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Evan Cheng evan.cheng at apple.com
Thu Aug 16 16:46:33 PDT 2007


Author: evancheng
Date: Thu Aug 16 18:46:29 2007
New Revision: 41132

URL: http://llvm.org/viewvc/llvm-project?rev=41132&view=rev
Log:
- If a dynamic_stackalloc alignment requirement is <= stack alignment, then the alignment argument is ignored.
- *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.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=41132&r1=41131&r2=41132&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Aug 16 18:46:29 2007
@@ -2329,21 +2329,21 @@
   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(),





More information about the llvm-commits mailing list