Index: llvm/trunk/lib/AsmParser/LLParser.cpp =================================================================== --- llvm/trunk/lib/AsmParser/LLParser.cpp +++ llvm/trunk/lib/AsmParser/LLParser.cpp @@ -6074,7 +6074,7 @@ /// 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 @@ } 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; + } + } } } Index: llvm/trunk/test/Assembler/alloca-addrspace-elems.ll =================================================================== --- llvm/trunk/test/Assembler/alloca-addrspace-elems.ll +++ llvm/trunk/test/Assembler/alloca-addrspace-elems.ll @@ -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 = !{}