IR: Change inalloca's grammar a bit
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 9 Mar 2014 06:41:58 +0000 (06:41 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 9 Mar 2014 06:41:58 +0000 (06:41 +0000)
The grammar for LLVM IR is not well specified in any document but seems
to obey the following rules:

 - Attributes which have parenthesized arguments are never preceded by
   commas.  This form of attribute is the only one which ever has
   optional arguments.  However, not all of these attributes support
   optional arguments: 'thread_local' supports an optional argument but
   'addrspace' does not.  Interestingly, 'addrspace' is documented as
   being a "qualifier".  What constitutes a qualifier?  I cannot find a
   definition.

 - Some attributes use a space between the keyword and the value.
   Examples of this form are 'align' and 'section'.  These are always
   preceded by a comma.

 - Otherwise, the attribute has no argument.  These attributes do not
   have a preceding comma.

Sometimes an attribute goes before the instruction, between the
instruction and it's type, or after it's type.  'atomicrmw' has
'volatile' between the instruction and the type while 'call' has 'tail'
preceding the instruction.

With all this in mind, it seems most consistent for 'inalloca' on an
'inalloca' instruction to occur before between the instruction and the
type.  Unlike the current formulation, there would be no preceding
comma.  The combination 'alloca inalloca' doesn't look particularly
appetizing, perhaps a better spelling of 'inalloca' is down the road.

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

12 files changed:
docs/LangRef.rst
lib/AsmParser/LLParser.cpp
lib/IR/AsmWriter.cpp
test/Assembler/inalloca.ll
test/CodeGen/X86/dynamic-alloca-in-entry.ll
test/CodeGen/X86/inalloca-ctor.ll
test/CodeGen/X86/inalloca-invoke.ll
test/CodeGen/X86/inalloca-stdcall.ll
test/CodeGen/X86/inalloca.ll
test/Transforms/DeadArgElim/keepalive.ll
test/Verifier/inalloca-vararg.ll
test/Verifier/inalloca2.ll

index e38184ca689c3bd4352637e8f3c861d9f9691e23..760a064f69efaef307c7c5f81bb8684294fe5f0a 100644 (file)
@@ -4713,7 +4713,7 @@ Syntax:
 
 ::
 
 
 ::
 
-      <result> = alloca <type>[, inalloca][, <ty> <NumElements>][, align <alignment>]     ; yields {type*}:result
+      <result> = alloca [inalloca] <type> [, <ty> <NumElements>] [, align <alignment>]     ; yields {type*}:result
 
 Overview:
 """""""""
 
 Overview:
 """""""""
index a4bbcfcefd5478ac24ebdb8d692f59b08bce96cb..f29ceddf643b7e3ba62fc3d98591881a1eaadc23 100644 (file)
@@ -707,7 +707,8 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc,
 ///       OptionalThreadLocal OptionalAddrSpace OptionalUnNammedAddr
 ///       OptionalExternallyInitialized GlobalType Type Const
 ///
 ///       OptionalThreadLocal OptionalAddrSpace OptionalUnNammedAddr
 ///       OptionalExternallyInitialized GlobalType Type Const
 ///
-/// Everything through visibility has been parsed already.
+/// Everything up to and including OptionalDLLStorageClass has been parsed
+/// already.
 ///
 bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc,
                            unsigned Linkage, bool HasLinkage,
 ///
 bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc,
                            unsigned Linkage, bool HasLinkage,
@@ -4071,33 +4072,27 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
 //===----------------------------------------------------------------------===//
 
 /// ParseAlloc
 //===----------------------------------------------------------------------===//
 
 /// ParseAlloc
-///   ::= 'alloca' Type (',' 'inalloca')? (',' TypeAndValue)? (',' OptionalInfo)?
+///   ::= 'alloca' 'inalloca'? Type (',' TypeAndValue)? (',' 'align' i32)?
 int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
   Value *Size = 0;
   LocTy SizeLoc;
   unsigned Alignment = 0;
 int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
   Value *Size = 0;
   LocTy SizeLoc;
   unsigned Alignment = 0;
-  bool IsInAlloca = false;
   Type *Ty = 0;
   Type *Ty = 0;
+
+  bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
+
   if (ParseType(Ty)) return true;
 
   bool AteExtraComma = false;
   if (EatIfPresent(lltok::comma)) {
   if (ParseType(Ty)) return true;
 
   bool AteExtraComma = false;
   if (EatIfPresent(lltok::comma)) {
-    bool HaveComma = true;
-    if (EatIfPresent(lltok::kw_inalloca)) {
-      IsInAlloca = true;
-      HaveComma = EatIfPresent(lltok::comma);
-    }
-
-    if (HaveComma) {
-      if (Lex.getKind() == lltok::kw_align) {
-        if (ParseOptionalAlignment(Alignment)) return true;
-      } else if (Lex.getKind() == lltok::MetadataVar) {
-        AteExtraComma = true;
-      } else {
-        if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
-            ParseOptionalCommaAlign(Alignment, AteExtraComma))
-          return true;
-      }
+    if (Lex.getKind() == lltok::kw_align) {
+      if (ParseOptionalAlignment(Alignment)) return true;
+    } else if (Lex.getKind() == lltok::MetadataVar) {
+      AteExtraComma = true;
+    } else {
+      if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
+          ParseOptionalCommaAlign(Alignment, AteExtraComma))
+        return true;
     }
   }
 
     }
   }
 
index 8a25ff8a979cb8d4d003d2f43ec4378cda1277e7..c9ea49b22248c0656e8c322222115ca274811a26 100644 (file)
@@ -1946,9 +1946,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
 
   } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(&I)) {
     Out << ' ';
 
   } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(&I)) {
     Out << ' ';
-    TypePrinter.print(AI->getAllocatedType(), Out);
     if (AI->isUsedWithInAlloca())
     if (AI->isUsedWithInAlloca())
-      Out << ", inalloca";
+      Out << "inalloca ";
+    TypePrinter.print(AI->getAllocatedType(), Out);
     if (!AI->getArraySize() || AI->isArrayAllocation()) {
       Out << ", ";
       writeOperand(AI->getArraySize(), true);
     if (!AI->getArraySize() || AI->isArrayAllocation()) {
       Out << ", ";
       writeOperand(AI->getArraySize(), true);
index 94fac26265c47d6bf1ca9d79038e869ef67a85fe..ff7a87e0a392c2cc6a27ffc2c43a5e8b2af72ca9 100644 (file)
@@ -2,11 +2,11 @@
 
 define void @a() {
 entry:
 
 define void @a() {
 entry:
-  %0 = alloca i32, inalloca
-  %1 = alloca [2 x i32], inalloca
-  %2 = alloca i32, inalloca, i32 2
-  %3 = alloca i32, inalloca, i32 2, align 16
-  %4 = alloca i32, inalloca, i32 2, align 16, !foo !0
+  %0 = alloca inalloca i32
+  %1 = alloca inalloca [2 x i32]
+  %2 = alloca inalloca i32, i32 2
+  %3 = alloca inalloca i32, i32 2, align 16
+  %4 = alloca inalloca i32, i32 2, align 16, !foo !0
   %5 = alloca i32, i32 2, align 16, !foo !0
   %6 = alloca i32, i32 2, align 16
   ret void
   %5 = alloca i32, i32 2, align 16, !foo !0
   %6 = alloca i32, i32 2, align 16
   ret void
index 2ac89baaf9f7440590632b70a1efeaecc9cbce9e..7ed471c2f502800974854e3f99484e68d22df75d 100644 (file)
@@ -11,7 +11,7 @@ define void @foo(i32 %n) {
 
 ; Use of inalloca implies that that the alloca is not static.
 define void @bar() {
 
 ; Use of inalloca implies that that the alloca is not static.
 define void @bar() {
-  %m = alloca i32, inalloca
+  %m = alloca inalloca i32
   ret void
 }
 ; CHECK-LABEL: _bar:
   ret void
 }
 ; CHECK-LABEL: _bar:
index f81e9675b700d1dbca8ea1a7cb44c9946de819b8..7cfa929135786d5649dff2253d8f3d91a4f5b56b 100644 (file)
@@ -10,7 +10,7 @@ declare void @Foo_ctor(%Foo* %this)
 
 define void @g() {
 entry:
 
 define void @g() {
 entry:
-  %args = alloca %frame, inalloca
+  %args = alloca inalloca %frame
   %c = getelementptr %frame* %args, i32 0, i32 2
 ; CHECK: movl    $20, %eax
 ; CHECK: calll   __chkstk
   %c = getelementptr %frame* %args, i32 0, i32 2
 ; CHECK: movl    $20, %eax
 ; CHECK: calll   __chkstk
index ac530ca5255e82df4667ae387dbe1845767c5d1c..6cff9ac0640c6e0b53538cf368f73c955d3dfdc4 100644 (file)
@@ -16,7 +16,7 @@ define i32 @main() {
 
 blah:
   %inalloca.save = call i8* @llvm.stacksave()
 
 blah:
   %inalloca.save = call i8* @llvm.stacksave()
-  %rev_args = alloca %frame.reverse, inalloca, align 4
+  %rev_args = alloca inalloca %frame.reverse, align 4
   %beg = getelementptr %frame.reverse* %rev_args, i32 0, i32 0
   %end = getelementptr %frame.reverse* %rev_args, i32 0, i32 1
 
   %beg = getelementptr %frame.reverse* %rev_args, i32 0, i32 0
   %end = getelementptr %frame.reverse* %rev_args, i32 0, i32 1
 
index 93ac451a508167aea01bccb2abd22dd08605e15a..54f97d99a9c7450a85e24636138eb4dafbdb86fc 100644 (file)
@@ -6,7 +6,7 @@ declare x86_stdcallcc void @f(%Foo* inalloca %a)
 declare x86_stdcallcc void @i(i32 %a)
 
 define void @g() {
 declare x86_stdcallcc void @i(i32 %a)
 
 define void @g() {
-  %b = alloca %Foo, inalloca
+  %b = alloca inalloca %Foo
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
index ac002863cf593256ce53c10b707181cebfc39b2d..12643f9d0d500d78b2543c665624fd9adc59a78d 100644 (file)
@@ -7,7 +7,7 @@ declare void @f(%Foo* inalloca %b)
 define void @a() {
 ; CHECK-LABEL: _a:
 entry:
 define void @a() {
 ; CHECK-LABEL: _a:
 entry:
-  %b = alloca %Foo, inalloca
+  %b = alloca inalloca %Foo
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
@@ -27,7 +27,7 @@ declare void @inreg_with_inalloca(i32 inreg %a, %Foo* inalloca %b)
 define void @b() {
 ; CHECK-LABEL: _b:
 entry:
 define void @b() {
 ; CHECK-LABEL: _b:
 entry:
-  %b = alloca %Foo, inalloca
+  %b = alloca inalloca %Foo
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
@@ -48,7 +48,7 @@ declare x86_thiscallcc void @thiscall_with_inalloca(i8* %a, %Foo* inalloca %b)
 define void @c() {
 ; CHECK-LABEL: _c:
 entry:
 define void @c() {
 ; CHECK-LABEL: _c:
 entry:
-  %b = alloca %Foo, inalloca
+  %b = alloca inalloca %Foo
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
 ; CHECK: movl    $8, %eax
 ; CHECK: calll   __chkstk
 ; CHECK: movl   %[[REG:[^,]*]], %esp
index b66df792ca84d4e2bb39a5d80ea8cd7c3b535ee1..16569db4d38fce3ed7be00a893843e671f1ce564 100644 (file)
@@ -38,7 +38,7 @@ define internal x86_thiscallcc i32 @unused_this(i32* %this, i32* inalloca %argme
 
 define i32 @caller2() {
        %t = alloca i32
 
 define i32 @caller2() {
        %t = alloca i32
-       %m = alloca i32, inalloca
+       %m = alloca inalloca i32
        store i32 42, i32* %m
        %v = call x86_thiscallcc i32 @unused_this(i32* %t, i32* inalloca %m)
        ret i32 %v
        store i32 42, i32* %m
        %v = call x86_thiscallcc i32 @unused_this(i32* %t, i32* inalloca %m)
        ret i32 %v
index 8521ebce2d9c129ee2066e978bb05060d3a24777..5099fd19927e63321375de1b87058b90a93899d4 100755 (executable)
@@ -2,7 +2,7 @@
 
 declare void @h(i32, ...)
 define void @i() {
 
 declare void @h(i32, ...)
 define void @i() {
-  %args = alloca i32, inalloca
+  %args = alloca inalloca i32
   call void (i32, ...)* @h(i32 1, i32* inalloca %args, i32 3)
 ; CHECK: inalloca isn't on the last argument!
   ret void
   call void (i32, ...)* @h(i32 1, i32* inalloca %args, i32 3)
 ; CHECK: inalloca isn't on the last argument!
   ret void
index e4e81be38615d0d666ae4554f4c6273c2d7cc903..12a454999285737b3166fe94fe462d579e8d7377 100644 (file)
@@ -6,7 +6,7 @@ declare void @doit(i64* inalloca %a)
 
 define void @a() {
 entry:
 
 define void @a() {
 entry:
-  %a = alloca [2 x i32], inalloca
+  %a = alloca inalloca [2 x i32]
   %b = bitcast [2 x i32]* %a to i64*
   call void @doit(i64* inalloca %b)
   ret void
   %b = bitcast [2 x i32]* %a to i64*
   call void @doit(i64* inalloca %b)
   ret void
@@ -14,7 +14,7 @@ entry:
 
 define void @b() {
 entry:
 
 define void @b() {
 entry:
-  %a = alloca i64, inalloca
+  %a = alloca inalloca i64
   call void @doit(i64* inalloca %a)
   call void @doit(i64* inalloca %a)
   ret void
   call void @doit(i64* inalloca %a)
   call void @doit(i64* inalloca %a)
   ret void
@@ -25,11 +25,11 @@ entry:
   br i1 %cond, label %if, label %else
 
 if:
   br i1 %cond, label %if, label %else
 
 if:
-  %a = alloca i64, inalloca
+  %a = alloca inalloca i64
   br label %call
 
 else:
   br label %call
 
 else:
-  %b = alloca i64, inalloca
+  %b = alloca inalloca i64
   br label %call
 
 call:
   br label %call
 
 call: