OSDN Git Service

Fix assembler for alloca of multiple elements in non-zero addr space
authorYaxun Liu <Yaxun.Liu@amd.com>
Sat, 14 Oct 2017 03:23:18 +0000 (03:23 +0000)
committerYaxun Liu <Yaxun.Liu@amd.com>
Sat, 14 Oct 2017 03:23:18 +0000 (03:23 +0000)
Currently llvm assembler emits parsing error for valid IR assembly

alloca i32, i32 9, addrspace(5)
when alloca addr space is 5.

This patch fixes that.

Differential Revision: https://reviews.llvm.org/D38713

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

lib/AsmParser/LLParser.cpp
test/Assembler/alloca-addrspace-elems.ll [new file with mode: 0644]

index b9b66ba..565b1a2 100644 (file)
@@ -6074,7 +6074,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
 
 /// ParseAlloc
 ///   ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)?
-///       (',' 'align' i32)?
+///       (',' 'align' i32)? (',', 'addrspace(n))?
 int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
   Value *Size = nullptr;
   LocTy SizeLoc, TyLoc, ASLoc;
@@ -6104,11 +6104,22 @@ int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
     } else if (Lex.getKind() == lltok::MetadataVar) {
       AteExtraComma = true;
     } else {
-      if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
-          ParseOptionalCommaAlign(Alignment, AteExtraComma) ||
-          (!AteExtraComma &&
-           ParseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma)))
+      if (ParseTypeAndValue(Size, SizeLoc, PFS))
         return true;
+      if (EatIfPresent(lltok::comma)) {
+        if (Lex.getKind() == lltok::kw_align) {
+          if (ParseOptionalAlignment(Alignment))
+            return true;
+          if (ParseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
+            return true;
+        } else if (Lex.getKind() == lltok::kw_addrspace) {
+          ASLoc = Lex.getLoc();
+          if (ParseOptionalAddrSpace(AddrSpace))
+            return true;
+        } else if (Lex.getKind() == lltok::MetadataVar) {
+          AteExtraComma = true;
+        }
+      }
     }
   }
 
diff --git a/test/Assembler/alloca-addrspace-elems.ll b/test/Assembler/alloca-addrspace-elems.ll
new file mode 100644 (file)
index 0000000..8c02760
--- /dev/null
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+
+target datalayout = "A5"
+; CHECK: target datalayout = "A5"
+
+
+; CHECK: %alloca_array_no_align = alloca i32, i32 9, addrspace(5)
+; CHECK-NEXT: %alloca_array_align4 = alloca i32, i32 9, align 4, addrspace(5)
+; CHECK-NEXT: %alloca_array_no_align_metadata = alloca i32, i32 9, addrspace(5), !foo !0
+; CHECK-NEXT: %alloca_array_align4_metadata = alloca i32, i32 9, align 4, addrspace(5), !foo !0
+; CHECK-NEXT: %alloca_inalloca_array_no_align = alloca inalloca i32, i32 9, addrspace(5)
+; CHECK-NEXT: %alloca_inalloca_array_align4_metadata = alloca inalloca i32, i32 9, align 4, addrspace(5), !foo !0
+
+define void @use_alloca() {
+  %alloca_array_no_align = alloca i32, i32 9, addrspace(5)
+  %alloca_array_align4 = alloca i32, i32 9, align 4, addrspace(5)
+  %alloca_array_no_align_metadata = alloca i32, i32 9, addrspace(5), !foo !0
+  %alloca_array_align4_metadata = alloca i32, i32 9, align 4, addrspace(5), !foo !0
+  %alloca_inalloca_array_no_align = alloca inalloca i32, i32 9, addrspace(5)
+  %alloca_inalloca_array_align4_metadata = alloca inalloca i32, i32 9, align 4, addrspace(5), !foo !0
+
+  ret void
+}
+
+!0 = !{}