It's not necessary to do rounding for alloca operations when the requested
authorDan Gohman <gohman@apple.com>
Wed, 18 Jul 2007 16:29:46 +0000 (16:29 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 18 Jul 2007 16:29:46 +0000 (16:29 +0000)
alignment is equal to the stack alignment.

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

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
test/CodeGen/X86/alloca-align-rounding.ll [new file with mode: 0644]

index d4651fd6abc0f3fea2799faf83ec4e37a6dc7a0f..9256faabeb1548e6baa2b3e08c32fa73bef3d667 100644 (file)
@@ -2327,13 +2327,13 @@ void SelectionDAGLowering::visitAlloca(AllocaInst &I) {
   AllocSize = DAG.getNode(ISD::MUL, IntPtr, AllocSize,
                           getIntPtrConstant(TySize));
 
-  // Handle alignment.  If the requested alignment is less than or equal to the
-  // stack alignment, ignore it and round the size of the allocation up to the
-  // stack alignment size.  If the size is greater than the stack alignment, we
-  // note this in the DYNAMIC_STACKALLOC node.
+  // 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.
   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,
diff --git a/test/CodeGen/X86/alloca-align-rounding.ll b/test/CodeGen/X86/alloca-align-rounding.ll
new file mode 100644 (file)
index 0000000..899dbff
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | not grep and
+
+declare void @bar(<2 x i64>* %n)
+
+define void @foo(i32 %h) {
+  %p = alloca <2 x i64>, i32 %h
+  call void @bar(<2 x i64>* %p)
+  ret void
+}