; RUN: llc < %s
;; Register allocation is doing a very poor job on this routine from yyparse
;; in Burg:
;; -- at least two long-lived values are being allocated to %o? registers
;; -- even worse, those registers are being saved and restored repeatedly
;; at function calls, even though there are no intervening uses.
;; -- outgoing args of some function calls have to be swapped, causing
;; another write/read from stack to do the exchange (use -dregalloc=y).
;;
%Arity = type %struct.arity*
%Binding = type %struct.binding*
%DeltaCost = type [4 x i16]
%Dimension = type %struct.dimension*
%Index_Map = type { i32, %Item_Set* }
%IntList = type %struct.intlist*
%Item = type { %DeltaCost, %Rule }
%ItemArray = type %Item*
%Item_Set = type %struct.item_set*
%List = type %struct.list*
%Mapping = type %struct.mapping*
%NonTerminal = type %struct.nonterminal*
%Operator = type %struct.operator*
%Pattern = type %struct.pattern*
%PatternAST = type %struct.patternAST*
%Plank = type %struct.plank*
%PlankMap = type %struct.plankMap*
%ReadFn = type i32 ()*
%Rule = type %struct.rule*
%RuleAST = type %struct.ruleAST*
%StateMap = type %struct.stateMap*
%StrTableElement = type %struct.strTableElement*
%Symbol = type %struct.symbol*
%Table = type %struct.table*
%YYSTYPE = type { %IntList }
%struct.arity = type { i32, %List }
%struct.binding = type { i8*, i32 }
%struct.dimension = type { i16*, %Index_Map, %Mapping, i32, %PlankMap }
%struct.index_map = type { i32, %Item_Set* }
%struct.intlist = type { i32, %IntList }
%struct.item = type { %DeltaCost, %Rule }
%struct.item_set = type { i32, i32, %Operator, [2 x %Item_Set], %Item_Set, i16*, %ItemArray, %ItemArray }
%struct.list = type { i8*, %List }
%struct.mapping = type { %List*, i32, i32, i32, %Item_Set* }
%struct.nonterminal = type { i8*, i32, i32, i32, %PlankMap, %Rule }
%struct.operator = type { i8*, i32, i32, i32, i32, i32, %Table }
%struct.pattern = type { %NonTerminal, %Operator, [2 x %NonTerminal] }
%struct.patternAST = type { %Symbol, i8*, %List }
%struct.plank = type { i8*, %List, i32 }
%struct.plankMap = type { %List, i32, %StateMap }
%struct.rule = type { %DeltaCost, i32, i32, i32, %NonTerminal, %Pattern, i32 }
%struct.ruleAST = type { i8*, %PatternAST, i32, %IntList, %Rule, %StrTableElement, %StrTableElement }
%struct.stateMap = type { i8*, %Plank, i32, i16* }
%struct.strTableElement = type { i8*, %IntList, i8* }
%struct.symbol = type { i8*, i32, { %Operator } }
%struct.table = type { %Operator, %List, i16*, [2 x %Dimension], %Item_Set* }
@yylval = external global %YYSTYPE ; <%YYSTYPE*> [#uses=1]
@yylhs = external global [25 x i16] ; <[25 x i16]*> [#uses=1]
@yylen = external global [25 x i16] ; <[25 x i16]*> [#uses=1]
@yydefred = external global [43 x i16] ; <[43 x i16]*> [#uses=1]
@yydgoto = external global [12 x i16] ; <[12 x i16]*> [#uses=1]
@yysindex = external global [43 x i16] ; <[43 x i16]*> [#uses=2]
@yyrindex = external global [43 x i16] ; <[43 x i16]*> [#uses=1]
@yygindex = external global [12 x i16] ; <[12 x i16]*> [#uses=1]
@yytable = external global [263 x i16] ; <[263 x i16]*> [#uses=4]
@yycheck = external global [263 x i16] ; <[263 x i16]*> [#uses=4]
@yynerrs = external global i32 ; <i32*> [#uses=3]
@yyerrflag = external global i32 ; <i32*> [#uses=6]
@yychar = external global i32 ; <i32*> [#uses=15]
@yyssp = external global i16* ; <i16**> [#uses=15]
@yyvsp = external global %YYSTYPE* ; <%YYSTYPE**> [#uses=30]
@yyval = external global %YYSTYPE ; <%YYSTYPE*> [#uses=1]
@yyss = external global i16* ; <i16**> [#uses=3]
@yysslim = external global i16* ; <i16**> [#uses=3]
@yyvs = external global %YYSTYPE* ; <%YYSTYPE**> [#uses=1]
@.LC01 = external global [13 x i8] ; <[13