Subzero: Make sure alloca with align=0 is handled correctly.

1. Modify dump() to match LLVM.

2. If it weren't for minimum stack alignment, the alignment code would be broken, so add a test in case the alignment code changes.

BUG= none
R=jvoung@chromium.org, kschimpf@google.com

Review URL: https://codereview.chromium.org/557533003
diff --git a/src/IceInst.cpp b/src/IceInst.cpp
index cfcaad3..43291ce 100644
--- a/src/IceInst.cpp
+++ b/src/IceInst.cpp
@@ -534,7 +534,8 @@
   dumpDest(Func);
   Str << " = alloca i8, i32 ";
   getSizeInBytes()->dump(Func);
-  Str << ", align " << getAlignInBytes();
+  if (getAlignInBytes())
+    Str << ", align " << getAlignInBytes();
 }
 
 void InstArithmetic::dump(const Cfg *Func) const {
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index 756508e..c3a6e4d 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -1118,6 +1118,9 @@
   Operand *TotalSize = legalize(Inst->getSizeInBytes());
   Variable *Dest = Inst->getDest();
   uint32_t AlignmentParam = Inst->getAlignInBytes();
+  // For default align=0, set it to the real value 1, to avoid any
+  // bit-manipulation problems below.
+  AlignmentParam = std::max(AlignmentParam, 1u);
 
   // LLVM enforces power of 2 alignment.
   assert((AlignmentParam & (AlignmentParam - 1)) == 0);
diff --git a/tests_lit/llvm2ice_tests/alloc.ll b/tests_lit/llvm2ice_tests/alloc.ll
index 80bba30..d690a19 100644
--- a/tests_lit/llvm2ice_tests/alloc.ll
+++ b/tests_lit/llvm2ice_tests/alloc.ll
@@ -104,6 +104,19 @@
 ; CHECK:      mov     dword ptr [esp], eax
 ; CHECK:      call    f2
 
+; Test alloca with default (0) alignment.
+define void @align0(i32 %n) {
+entry:
+  %array = alloca i8, i32 %n
+  %__2 = ptrtoint i8* %array to i32
+  call void @f2(i32 %__2)
+  ret void
+}
+; CHECK-LABEL: align0
+; CHECK: add [[REG:.*]], 15
+; CHECK: and [[REG]], -16
+; CHECK: sub esp, [[REG]]
+
 define void @f2(i32 %ignored) {
 entry:
   ret void