From rafael.espindola at gmail.com Mon Oct 9 09:12:29 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 09:12:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMTargetMachine.cpp Message-ID: <200610091412.k99ECTL2014730@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMTargetMachine.cpp updated: 1.10 -> 1.11 --- Log message: most ARM targets are little endian --- Diffs of the changes: (+1 -1) ARMTargetMachine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/ARM/ARMTargetMachine.cpp diff -u llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.10 llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.11 --- llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.10 Tue Sep 19 10:49:24 2006 +++ llvm/lib/Target/ARM/ARMTargetMachine.cpp Mon Oct 9 09:12:15 2006 @@ -34,7 +34,7 @@ /// TargetMachine ctor - Create an ILP32 architecture model /// ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS) - : DataLayout("E-p:32:32") { + : DataLayout("e-p:32:32") { } unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) { From rafael.espindola at gmail.com Mon Oct 9 09:13:55 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 09:13:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200610091413.k99EDtVQ014760@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.58 -> 1.59 --- Log message: expand ISD::EXTLOAD --- Diffs of the changes: (+2 -0) ARMISelDAGToDAG.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.58 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.59 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.58 Sat Oct 7 09:24:52 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Oct 9 09:13:40 2006 @@ -47,6 +47,8 @@ addRegisterClass(MVT::f32, ARM::FPRegsRegisterClass); addRegisterClass(MVT::f64, ARM::DFPRegsRegisterClass); + setLoadXAction(ISD::EXTLOAD, MVT::f32, Expand); + setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); From rafael.espindola at gmail.com Mon Oct 9 09:18:47 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 09:18:47 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/README.txt Message-ID: <200610091418.k99EIlZc014841@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: README.txt updated: 1.4 -> 1.5 --- Log message: add a note --- Diffs of the changes: (+14 -0) README.txt | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/lib/Target/ARM/README.txt diff -u llvm/lib/Target/ARM/README.txt:1.4 llvm/lib/Target/ARM/README.txt:1.5 --- llvm/lib/Target/ARM/README.txt:1.4 Sat Oct 7 09:03:39 2006 +++ llvm/lib/Target/ARM/README.txt Mon Oct 9 09:18:33 2006 @@ -32,3 +32,17 @@ add an offset to FLDS/FLDD addressing mode ---------------------------------------------------------- + +the function + +void %f() { +entry: + call void %g( int 1, int 2, int 3, int 4, int 5 ) + ret void +} + +declare void %g(int, int, int, int, int) + +Only needs 8 bytes of stack space. We currently allocate 16. + +---------------------------------------------------------- From rafael.espindola at gmail.com Mon Oct 9 11:28:48 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 11:28:48 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200610091628.k99GSm9M016777@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.59 -> 1.60 --- Log message: expand ISD::SELECT --- Diffs of the changes: (+2 -0) ARMISelDAGToDAG.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.59 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.60 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.59 Mon Oct 9 09:13:40 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Oct 9 11:28:33 2006 @@ -57,6 +57,8 @@ setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); setOperationAction(ISD::ConstantPool, MVT::i32, Custom); + setOperationAction(ISD::SELECT, MVT::i32, Expand); + setOperationAction(ISD::SETCC, MVT::i32, Expand); setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); setOperationAction(ISD::BR_CC, MVT::i32, Custom); From rafael.espindola at gmail.com Mon Oct 9 12:18:42 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 12:18:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.td Message-ID: <200610091718.k99HIgaJ017573@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMInstrInfo.td updated: 1.36 -> 1.37 --- Log message: add ADDS and ADCS --- Diffs of the changes: (+8 -0) ARMInstrInfo.td | 8 ++++++++ 1 files changed, 8 insertions(+) Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.36 llvm/lib/Target/ARM/ARMInstrInfo.td:1.37 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.36 Sat Oct 7 09:24:52 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Mon Oct 9 12:18:28 2006 @@ -117,6 +117,14 @@ "add $dst, $a, $b", [(set IntRegs:$dst, (add IntRegs:$a, addr_mode1:$b))]>; +def ADCS : InstARM<(ops IntRegs:$dst, IntRegs:$a, op_addr_mode1:$b), + "adcs $dst, $a, $b", + [(set IntRegs:$dst, (adde IntRegs:$a, addr_mode1:$b))]>; + +def ADDS : InstARM<(ops IntRegs:$dst, IntRegs:$a, op_addr_mode1:$b), + "adds $dst, $a, $b", + [(set IntRegs:$dst, (addc IntRegs:$a, addr_mode1:$b))]>; + // "LEA" forms of add def lea_addri : InstARM<(ops IntRegs:$dst, memri:$addr), "add $dst, ${addr:arith}", From sabre at nondot.org Mon Oct 9 12:28:28 2006 From: sabre at nondot.org (Chris Lattner) Date: Mon, 9 Oct 2006 12:28:28 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraph.cpp Message-ID: <200610091728.k99HSSJd017795@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/IPA: CallGraph.cpp updated: 1.57 -> 1.58 --- Log message: Fix a bug pointed out by Zhongxing Xu --- Diffs of the changes: (+1 -1) CallGraph.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Analysis/IPA/CallGraph.cpp diff -u llvm/lib/Analysis/IPA/CallGraph.cpp:1.57 llvm/lib/Analysis/IPA/CallGraph.cpp:1.58 --- llvm/lib/Analysis/IPA/CallGraph.cpp:1.57 Sun Aug 27 19:42:29 2006 +++ llvm/lib/Analysis/IPA/CallGraph.cpp Mon Oct 9 12:28:13 2006 @@ -193,7 +193,7 @@ } void CallGraph::destroy() { - if(!FunctionMap.size()) { + if (!FunctionMap.empty()) { for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); I != E; ++I) delete I->second; From rafael.espindola at gmail.com Mon Oct 9 12:30:29 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 12:30:29 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/long.ll Message-ID: <200610091730.k99HUTXQ017844@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: long.ll updated: 1.2 -> 1.3 --- Log message: add a test for adds adcs --- Diffs of the changes: (+9 -1) long.ll | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletion(-) Index: llvm/test/Regression/CodeGen/ARM/long.ll diff -u llvm/test/Regression/CodeGen/ARM/long.ll:1.2 llvm/test/Regression/CodeGen/ARM/long.ll:1.3 --- llvm/test/Regression/CodeGen/ARM/long.ll:1.2 Thu Sep 21 06:29:52 2006 +++ llvm/test/Regression/CodeGen/ARM/long.ll Mon Oct 9 12:30:15 2006 @@ -3,7 +3,9 @@ ; RUN: llvm-as < %s | llc -march=arm | grep "mov r0, #1" | wc -l | grep 1 && ; RUN: llvm-as < %s | llc -march=arm | grep ".word.*2147483647" | wc -l | grep 2 && ; RUN: llvm-as < %s | llc -march=arm | grep "mov r0, #-2147483648" | wc -l | grep 1 && -; RUN: llvm-as < %s | llc -march=arm | grep ".word.*4294967295" | wc -l | grep 1 +; RUN: llvm-as < %s | llc -march=arm | grep ".word.*4294967295" | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -march=arm | grep "adds" | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -march=arm | grep "adcs" | wc -l | grep 1 long %f1() { entry: @@ -29,3 +31,9 @@ entry: ret long 9223372036854775807 } + +ulong %f6(ulong %x, ulong %y) { +entry: + %tmp1 = add ulong %y, 1 + ret ulong %tmp1 +} From sabre at nondot.org Mon Oct 9 12:34:56 2006 From: sabre at nondot.org (Chris Lattner) Date: Mon, 9 Oct 2006 12:34:56 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/jmp_table.ll Message-ID: <200610091734.k99HYuUU017967@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Alpha: jmp_table.ll updated: 1.3 -> 1.4 --- Log message: xfail this until andrew has a chance to implement the alpha TM method. --- Diffs of the changes: (+2 -0) jmp_table.ll | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/test/Regression/CodeGen/Alpha/jmp_table.ll diff -u llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.3 llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.4 --- llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.3 Wed Oct 4 22:27:52 2006 +++ llvm/test/Regression/CodeGen/Alpha/jmp_table.ll Mon Oct 9 12:34:40 2006 @@ -4,6 +4,8 @@ ; RUN: llvm-as < %s | llc -march=alpha | grep 'ldl' && ; RUN: llvm-as < %s | llc -march=alpha | grep 'rodata' +; XFAIL: * + target endian = little target pointersize = 64 target triple = "alphaev67-unknown-linux-gnu" From reid at x10sys.com Mon Oct 9 12:37:13 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 9 Oct 2006 12:37:13 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs llvmAsmParser.h.cvs llvmAsmParser.y llvmAsmParser.y.cvs Message-ID: <200610091737.k99HbDMv018036@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp.cvs updated: 1.15 -> 1.16 llvmAsmParser.h.cvs updated: 1.10 -> 1.11 llvmAsmParser.y updated: 1.263 -> 1.264 llvmAsmParser.y.cvs updated: 1.15 -> 1.16 --- Log message: Fix PR886: http://llvm.org/PR886 : The result of yyparse() was not being checked. When YYERROR or YYABORT is called it causes yyparse() to return 1 to indicate the error. The code was silently ignoring this situation because it previously expected either an exception or a null ParserResult to indicate an error. The patch corrects this situation. --- Diffs of the changes: (+3881 -2865) llvmAsmParser.cpp.cvs | 6321 ++++++++++++++++++++++++++++---------------------- llvmAsmParser.h.cvs | 367 ++ llvmAsmParser.y | 16 llvmAsmParser.y.cvs | 16 4 files changed, 3881 insertions(+), 2839 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.15 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.16 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.15 Thu Sep 28 18:35:21 2006 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Mon Oct 9 12:36:59 2006 @@ -1,123 +1,288 @@ +/* A Bison parser, made by GNU Bison 2.1. */ -/* A Bison parser, made from /Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 +/* Substitute the variable and function names. */ #define yyparse llvmAsmparse -#define yylex llvmAsmlex +#define yylex llvmAsmlex #define yyerror llvmAsmerror -#define yylval llvmAsmlval -#define yychar llvmAsmchar +#define yylval llvmAsmlval +#define yychar llvmAsmchar #define yydebug llvmAsmdebug #define yynerrs llvmAsmnerrs -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define DLLIMPORT 299 -#define DLLEXPORT 300 -#define EXTERN_WEAK 301 -#define OPAQUE 302 -#define NOT 303 -#define EXTERNAL 304 -#define TARGET 305 -#define TRIPLE 306 -#define ENDIAN 307 -#define POINTERSIZE 308 -#define LITTLE 309 -#define BIG 310 -#define ALIGN 311 -#define DEPLIBS 312 -#define CALL 313 -#define TAIL 314 -#define ASM_TOK 315 -#define MODULE 316 -#define SIDEEFFECT 317 -#define CC_TOK 318 -#define CCC_TOK 319 -#define CSRETCC_TOK 320 -#define FASTCC_TOK 321 -#define COLDCC_TOK 322 -#define X86_STDCALLCC_TOK 323 -#define X86_FASTCALLCC_TOK 324 -#define RET 325 -#define BR 326 -#define SWITCH 327 -#define INVOKE 328 -#define UNWIND 329 -#define UNREACHABLE 330 -#define ADD 331 -#define SUB 332 -#define MUL 333 -#define DIV 334 -#define REM 335 -#define AND 336 -#define OR 337 -#define XOR 338 -#define SETLE 339 -#define SETGE 340 -#define SETLT 341 -#define SETGT 342 -#define SETEQ 343 -#define SETNE 344 -#define MALLOC 345 -#define ALLOCA 346 -#define FREE 347 -#define LOAD 348 -#define STORE 349 -#define GETELEMENTPTR 350 -#define PHI_TOK 351 -#define CAST 352 -#define SELECT 353 -#define SHL 354 -#define SHR 355 -#define VAARG 356 -#define EXTRACTELEMENT 357 -#define INSERTELEMENT 358 -#define SHUFFLEVECTOR 359 -#define VAARG_old 360 -#define VANEXT_old 361 -#line 14 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + DLLIMPORT = 300, + DLLEXPORT = 301, + EXTERN_WEAK = 302, + OPAQUE = 303, + NOT = 304, + EXTERNAL = 305, + TARGET = 306, + TRIPLE = 307, + ENDIAN = 308, + POINTERSIZE = 309, + LITTLE = 310, + BIG = 311, + ALIGN = 312, + DEPLIBS = 313, + CALL = 314, + TAIL = 315, + ASM_TOK = 316, + MODULE = 317, + SIDEEFFECT = 318, + CC_TOK = 319, + CCC_TOK = 320, + CSRETCC_TOK = 321, + FASTCC_TOK = 322, + COLDCC_TOK = 323, + X86_STDCALLCC_TOK = 324, + X86_FASTCALLCC_TOK = 325, + RET = 326, + BR = 327, + SWITCH = 328, + INVOKE = 329, + UNWIND = 330, + UNREACHABLE = 331, + ADD = 332, + SUB = 333, + MUL = 334, + DIV = 335, + REM = 336, + AND = 337, + OR = 338, + XOR = 339, + SETLE = 340, + SETGE = 341, + SETLT = 342, + SETGT = 343, + SETEQ = 344, + SETNE = 345, + MALLOC = 346, + ALLOCA = 347, + FREE = 348, + LOAD = 349, + STORE = 350, + GETELEMENTPTR = 351, + PHI_TOK = 352, + CAST = 353, + SELECT = 354, + SHL = 355, + SHR = 356, + VAARG = 357, + EXTRACTELEMENT = 358, + INSERTELEMENT = 359, + SHUFFLEVECTOR = 360, + VAARG_old = 361, + VANEXT_old = 362 + }; +#endif +/* Tokens. */ +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define DLLIMPORT 300 +#define DLLEXPORT 301 +#define EXTERN_WEAK 302 +#define OPAQUE 303 +#define NOT 304 +#define EXTERNAL 305 +#define TARGET 306 +#define TRIPLE 307 +#define ENDIAN 308 +#define POINTERSIZE 309 +#define LITTLE 310 +#define BIG 311 +#define ALIGN 312 +#define DEPLIBS 313 +#define CALL 314 +#define TAIL 315 +#define ASM_TOK 316 +#define MODULE 317 +#define SIDEEFFECT 318 +#define CC_TOK 319 +#define CCC_TOK 320 +#define CSRETCC_TOK 321 +#define FASTCC_TOK 322 +#define COLDCC_TOK 323 +#define X86_STDCALLCC_TOK 324 +#define X86_FASTCALLCC_TOK 325 +#define RET 326 +#define BR 327 +#define SWITCH 328 +#define INVOKE 329 +#define UNWIND 330 +#define UNREACHABLE 331 +#define ADD 332 +#define SUB 333 +#define MUL 334 +#define DIV 335 +#define REM 336 +#define AND 337 +#define OR 338 +#define XOR 339 +#define SETLE 340 +#define SETGE 341 +#define SETLT 342 +#define SETGT 343 +#define SETEQ 344 +#define SETNE 345 +#define MALLOC 346 +#define ALLOCA 347 +#define FREE 348 +#define LOAD 349 +#define STORE 350 +#define GETELEMENTPTR 351 +#define PHI_TOK 352 +#define CAST 353 +#define SELECT 354 +#define SHL 355 +#define SHR 356 +#define VAARG 357 +#define EXTRACTELEMENT 358 +#define INSERTELEMENT 359 +#define SHUFFLEVECTOR 360 +#define VAARG_old 361 +#define VANEXT_old 362 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -146,7 +311,7 @@ // immediately invokes YYERROR. This would be so much cleaner if it was a // recursive descent parser. static bool TriggerError = false; -#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYERROR; } } +#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } } #define GEN_ERROR(msg) { GenerateError(msg); YYERROR; } int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit @@ -927,12 +1092,20 @@ llvmAsmlineno = 1; // Reset the current line number... ObsoleteVarArgs = false; NewVarArgs = false; - CurModule.CurrentModule = M; - yyparse(); // Parse the file, potentially throwing exception + + // Check to make sure the parser succeeded + if (yyparse()) { + if (ParserResult) + delete ParserResult; + return 0; + } + + // Check to make sure that parsing produced a result if (!ParserResult) return 0; + // Reset ParserResult variable while saving its value for the result. Module *Result = ParserResult; ParserResult = 0; @@ -1069,8 +1242,28 @@ } -#line 966 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -typedef union { + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 974 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -1109,997 +1302,1457 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#include +/* Line 196 of yacc.c. */ +#line 1307 "llvmAsmParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 219 of yacc.c. */ +#line 1319 "llvmAsmParser.tab.c" + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; -#define YYFINAL 514 -#define YYFLAG -32768 -#define YYNTBASE 122 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 361 ? yytranslate[x] : 196) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 111, - 112, 120, 2, 109, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 116, - 108, 117, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 113, 110, 115, 2, 2, 2, 2, 2, 121, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, - 2, 2, 118, 2, 119, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107 -}; +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, - 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, - 60, 62, 64, 67, 68, 70, 72, 74, 76, 78, - 80, 82, 83, 84, 86, 88, 90, 92, 94, 96, - 99, 100, 103, 104, 108, 111, 112, 114, 115, 119, - 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, - 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, - 162, 164, 166, 169, 174, 180, 186, 190, 193, 196, - 198, 202, 204, 208, 210, 211, 216, 220, 224, 229, - 234, 238, 241, 244, 247, 250, 253, 256, 259, 262, - 265, 268, 275, 281, 290, 297, 304, 311, 318, 325, - 334, 343, 347, 349, 351, 353, 355, 358, 361, 366, - 369, 371, 376, 379, 384, 385, 393, 394, 402, 403, - 411, 412, 420, 424, 429, 430, 432, 434, 436, 440, - 444, 448, 452, 456, 458, 459, 461, 463, 465, 466, - 469, 473, 475, 477, 481, 483, 484, 493, 495, 497, - 501, 503, 505, 508, 509, 511, 513, 514, 519, 520, - 522, 524, 526, 528, 530, 532, 534, 536, 538, 542, - 544, 550, 552, 554, 556, 558, 561, 564, 567, 571, - 574, 575, 577, 580, 583, 587, 597, 607, 616, 630, - 632, 634, 641, 647, 650, 657, 665, 667, 671, 673, - 674, 677, 679, 685, 691, 697, 700, 705, 710, 717, - 722, 727, 732, 737, 744, 751, 754, 762, 764, 767, - 768, 770, 771, 775, 782, 786, 793, 796, 801, 808 -}; +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -static const short yyrhs[] = { 5, - 0, 6, 0, 3, 0, 4, 0, 77, 0, 78, - 0, 79, 0, 80, 0, 81, 0, 82, 0, 83, - 0, 84, 0, 85, 0, 86, 0, 87, 0, 88, - 0, 89, 0, 90, 0, 100, 0, 101, 0, 16, - 0, 14, 0, 12, 0, 10, 0, 17, 0, 15, - 0, 13, 0, 11, 0, 128, 0, 129, 0, 18, - 0, 19, 0, 164, 108, 0, 0, 41, 0, 42, - 0, 43, 0, 44, 0, 45, 0, 46, 0, 47, - 0, 0, 0, 65, 0, 66, 0, 67, 0, 68, - 0, 69, 0, 70, 0, 64, 4, 0, 0, 57, - 4, 0, 0, 109, 57, 4, 0, 34, 24, 0, - 0, 137, 0, 0, 109, 140, 139, 0, 137, 0, - 57, 4, 0, 143, 0, 8, 0, 145, 0, 8, - 0, 145, 0, 9, 0, 10, 0, 11, 0, 12, - 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, - 0, 18, 0, 19, 0, 20, 0, 21, 0, 48, - 0, 144, 0, 179, 0, 110, 4, 0, 142, 111, - 147, 112, 0, 113, 4, 114, 145, 115, 0, 116, - 4, 114, 145, 117, 0, 118, 146, 119, 0, 118, - 119, 0, 145, 120, 0, 145, 0, 146, 109, 145, - 0, 146, 0, 146, 109, 37, 0, 37, 0, 0, - 143, 113, 150, 115, 0, 143, 113, 115, 0, 143, - 121, 24, 0, 143, 116, 150, 117, 0, 143, 118, - 150, 119, 0, 143, 118, 119, 0, 143, 38, 0, - 143, 39, 0, 143, 179, 0, 143, 149, 0, 143, - 26, 0, 128, 123, 0, 129, 4, 0, 9, 27, - 0, 9, 28, 0, 131, 7, 0, 98, 111, 148, - 36, 143, 112, 0, 96, 111, 148, 193, 112, 0, - 99, 111, 148, 109, 148, 109, 148, 112, 0, 124, - 111, 148, 109, 148, 112, 0, 125, 111, 148, 109, - 148, 112, 0, 126, 111, 148, 109, 148, 112, 0, - 127, 111, 148, 109, 148, 112, 0, 103, 111, 148, - 109, 148, 112, 0, 104, 111, 148, 109, 148, 109, - 148, 112, 0, 105, 111, 148, 109, 148, 109, 148, - 112, 0, 150, 109, 148, 0, 148, 0, 32, 0, - 33, 0, 153, 0, 153, 173, 0, 153, 175, 0, - 153, 62, 61, 159, 0, 153, 25, 0, 154, 0, - 154, 132, 20, 141, 0, 154, 175, 0, 154, 62, - 61, 159, 0, 0, 154, 132, 133, 151, 148, 155, - 139, 0, 0, 154, 132, 50, 151, 143, 156, 139, - 0, 0, 154, 132, 45, 151, 143, 157, 139, 0, - 0, 154, 132, 47, 151, 143, 158, 139, 0, 154, - 51, 161, 0, 154, 58, 108, 162, 0, 0, 24, - 0, 56, 0, 55, 0, 53, 108, 160, 0, 54, - 108, 4, 0, 52, 108, 24, 0, 113, 163, 115, - 0, 163, 109, 24, 0, 24, 0, 0, 22, 0, - 24, 0, 164, 0, 0, 143, 165, 0, 167, 109, - 166, 0, 166, 0, 167, 0, 167, 109, 37, 0, - 37, 0, 0, 134, 141, 164, 111, 168, 112, 138, - 135, 0, 29, 0, 118, 0, 133, 169, 170, 0, - 30, 0, 119, 0, 182, 172, 0, 0, 45, 0, - 47, 0, 0, 31, 176, 174, 169, 0, 0, 63, - 0, 3, 0, 4, 0, 7, 0, 27, 0, 28, - 0, 38, 0, 39, 0, 26, 0, 116, 150, 117, - 0, 149, 0, 61, 177, 24, 109, 24, 0, 122, - 0, 164, 0, 179, 0, 178, 0, 143, 180, 0, - 182, 183, 0, 171, 183, 0, 184, 132, 185, 0, - 184, 187, 0, 0, 23, 0, 71, 181, 0, 71, - 8, 0, 72, 21, 180, 0, 72, 9, 180, 109, - 21, 180, 109, 21, 180, 0, 73, 130, 180, 109, - 21, 180, 113, 186, 115, 0, 73, 130, 180, 109, - 21, 180, 113, 115, 0, 74, 134, 141, 180, 111, - 190, 112, 36, 21, 180, 75, 21, 180, 0, 75, - 0, 76, 0, 186, 130, 178, 109, 21, 180, 0, - 130, 178, 109, 21, 180, 0, 132, 192, 0, 143, - 113, 180, 109, 180, 115, 0, 188, 109, 113, 180, - 109, 180, 115, 0, 181, 0, 189, 109, 181, 0, - 189, 0, 0, 60, 59, 0, 59, 0, 124, 143, - 180, 109, 180, 0, 125, 143, 180, 109, 180, 0, - 126, 143, 180, 109, 180, 0, 49, 181, 0, 127, - 181, 109, 181, 0, 98, 181, 36, 143, 0, 99, - 181, 109, 181, 109, 181, 0, 102, 181, 109, 143, - 0, 106, 181, 109, 143, 0, 107, 181, 109, 143, - 0, 103, 181, 109, 181, 0, 104, 181, 109, 181, - 109, 181, 0, 105, 181, 109, 181, 109, 181, 0, - 97, 188, 0, 191, 134, 141, 180, 111, 190, 112, - 0, 195, 0, 109, 189, 0, 0, 35, 0, 0, - 91, 143, 136, 0, 91, 143, 109, 15, 180, 136, - 0, 92, 143, 136, 0, 92, 143, 109, 15, 180, - 136, 0, 93, 181, 0, 194, 94, 143, 180, 0, - 194, 95, 181, 109, 143, 180, 0, 96, 143, 180, - 193, 0 -}; +#endif +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; #endif -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 1088, 1089, 1097, 1098, 1108, 1108, 1108, 1108, 1108, 1109, - 1109, 1109, 1110, 1110, 1110, 1110, 1110, 1110, 1112, 1112, - 1116, 1116, 1116, 1116, 1117, 1117, 1117, 1117, 1118, 1118, - 1119, 1119, 1122, 1126, 1131, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1140, 1140, 1141, 1142, 1143, 1144, 1145, 1146, - 1156, 1156, 1163, 1163, 1172, 1180, 1180, 1186, 1186, 1188, - 1193, 1207, 1207, 1208, 1208, 1210, 1220, 1220, 1220, 1220, - 1220, 1220, 1220, 1221, 1221, 1221, 1221, 1221, 1221, 1222, - 1226, 1230, 1238, 1246, 1259, 1264, 1276, 1286, 1290, 1299, - 1304, 1310, 1311, 1315, 1319, 1330, 1356, 1370, 1400, 1426, - 1447, 1460, 1470, 1475, 1536, 1543, 1552, 1558, 1564, 1568, - 1572, 1580, 1591, 1623, 1631, 1653, 1664, 1670, 1678, 1684, - 1690, 1699, 1703, 1711, 1711, 1721, 1729, 1734, 1738, 1742, - 1746, 1761, 1783, 1786, 1789, 1794, 1797, 1801, 1805, 1809, - 1813, 1818, 1822, 1825, 1828, 1832, 1845, 1846, 1848, 1852, - 1861, 1867, 1869, 1874, 1879, 1888, 1888, 1889, 1889, 1891, - 1898, 1904, 1911, 1915, 1921, 1926, 1931, 2026, 2026, 2028, - 2036, 2036, 2038, 2043, 2043, 2044, 2047, 2047, 2057, 2061, - 2066, 2070, 2074, 2078, 2082, 2086, 2090, 2094, 2098, 2123, - 2127, 2141, 2145, 2151, 2151, 2157, 2162, 2166, 2175, 2186, - 2191, 2203, 2216, 2220, 2224, 2229, 2238, 2257, 2266, 2322, - 2326, 2333, 2344, 2357, 2366, 2375, 2385, 2389, 2396, 2396, - 2398, 2402, 2407, 2423, 2438, 2452, 2465, 2473, 2481, 2489, - 2495, 2515, 2538, 2544, 2550, 2556, 2571, 2630, 2637, 2640, - 2645, 2649, 2656, 2661, 2667, 2672, 2678, 2686, 2698, 2713 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1330 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 122 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 75 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 251 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 514 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 362 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 111, 112, 120, 2, 109, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 116, 108, 117, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 113, 110, 115, 2, 2, 2, 2, 2, 121, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 114, 2, 2, 118, 2, 119, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107 }; -#endif +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 63, 65, 67, 70, 71, 73, 75, 77, + 79, 81, 83, 85, 86, 87, 89, 91, 93, 95, + 97, 99, 102, 103, 106, 107, 111, 114, 115, 117, + 118, 122, 124, 127, 129, 131, 133, 135, 137, 139, + 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, + 161, 163, 165, 167, 169, 172, 177, 183, 189, 193, + 196, 199, 201, 205, 207, 211, 213, 214, 219, 223, + 227, 232, 237, 241, 244, 247, 250, 253, 256, 259, + 262, 265, 268, 271, 278, 284, 293, 300, 307, 314, + 321, 328, 337, 346, 350, 352, 354, 356, 358, 361, + 364, 369, 372, 374, 379, 382, 387, 388, 396, 397, + 405, 406, 414, 415, 423, 427, 432, 433, 435, 437, + 439, 443, 447, 451, 455, 459, 461, 462, 464, 466, + 468, 469, 472, 476, 478, 480, 484, 486, 487, 496, + 498, 500, 504, 506, 508, 511, 512, 514, 516, 517, + 522, 523, 525, 527, 529, 531, 533, 535, 537, 539, + 541, 545, 547, 553, 555, 557, 559, 561, 564, 567, + 570, 574, 577, 578, 580, 583, 586, 590, 600, 610, + 619, 633, 635, 637, 644, 650, 653, 660, 668, 670, + 674, 676, 677, 680, 682, 688, 694, 700, 703, 708, + 713, 720, 725, 730, 735, 740, 747, 754, 757, 765, + 767, 770, 771, 773, 774, 778, 785, 789, 796, 799, + 804, 811 +}; -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short int yyrhs[] = +{ + 153, 0, -1, 5, -1, 6, -1, 3, -1, 4, + -1, 77, -1, 78, -1, 79, -1, 80, -1, 81, + -1, 82, -1, 83, -1, 84, -1, 85, -1, 86, + -1, 87, -1, 88, -1, 89, -1, 90, -1, 100, + -1, 101, -1, 16, -1, 14, -1, 12, -1, 10, + -1, 17, -1, 15, -1, 13, -1, 11, -1, 129, + -1, 130, -1, 18, -1, 19, -1, 165, 108, -1, + -1, 41, -1, 42, -1, 43, -1, 44, -1, 45, + -1, 46, -1, 47, -1, -1, -1, 65, -1, 66, + -1, 67, -1, 68, -1, 69, -1, 70, -1, 64, + 4, -1, -1, 57, 4, -1, -1, 109, 57, 4, + -1, 34, 24, -1, -1, 138, -1, -1, 109, 141, + 140, -1, 138, -1, 57, 4, -1, 144, -1, 8, + -1, 146, -1, 8, -1, 146, -1, 9, -1, 10, + -1, 11, -1, 12, -1, 13, -1, 14, -1, 15, + -1, 16, -1, 17, -1, 18, -1, 19, -1, 20, + -1, 21, -1, 48, -1, 145, -1, 180, -1, 110, + 4, -1, 143, 111, 148, 112, -1, 113, 4, 114, + 146, 115, -1, 116, 4, 114, 146, 117, -1, 118, + 147, 119, -1, 118, 119, -1, 146, 120, -1, 146, + -1, 147, 109, 146, -1, 147, -1, 147, 109, 37, + -1, 37, -1, -1, 144, 113, 151, 115, -1, 144, + 113, 115, -1, 144, 121, 24, -1, 144, 116, 151, + 117, -1, 144, 118, 151, 119, -1, 144, 118, 119, + -1, 144, 38, -1, 144, 39, -1, 144, 180, -1, + 144, 150, -1, 144, 26, -1, 129, 124, -1, 130, + 4, -1, 9, 27, -1, 9, 28, -1, 132, 7, + -1, 98, 111, 149, 36, 144, 112, -1, 96, 111, + 149, 194, 112, -1, 99, 111, 149, 109, 149, 109, + 149, 112, -1, 125, 111, 149, 109, 149, 112, -1, + 126, 111, 149, 109, 149, 112, -1, 127, 111, 149, + 109, 149, 112, -1, 128, 111, 149, 109, 149, 112, + -1, 103, 111, 149, 109, 149, 112, -1, 104, 111, + 149, 109, 149, 109, 149, 112, -1, 105, 111, 149, + 109, 149, 109, 149, 112, -1, 151, 109, 149, -1, + 149, -1, 32, -1, 33, -1, 154, -1, 154, 174, + -1, 154, 176, -1, 154, 62, 61, 160, -1, 154, + 25, -1, 155, -1, 155, 133, 20, 142, -1, 155, + 176, -1, 155, 62, 61, 160, -1, -1, 155, 133, + 134, 152, 149, 156, 140, -1, -1, 155, 133, 50, + 152, 144, 157, 140, -1, -1, 155, 133, 45, 152, + 144, 158, 140, -1, -1, 155, 133, 47, 152, 144, + 159, 140, -1, 155, 51, 162, -1, 155, 58, 108, + 163, -1, -1, 24, -1, 56, -1, 55, -1, 53, + 108, 161, -1, 54, 108, 4, -1, 52, 108, 24, + -1, 113, 164, 115, -1, 164, 109, 24, -1, 24, + -1, -1, 22, -1, 24, -1, 165, -1, -1, 144, + 166, -1, 168, 109, 167, -1, 167, -1, 168, -1, + 168, 109, 37, -1, 37, -1, -1, 135, 142, 165, + 111, 169, 112, 139, 136, -1, 29, -1, 118, -1, + 134, 170, 171, -1, 30, -1, 119, -1, 183, 173, + -1, -1, 45, -1, 47, -1, -1, 31, 177, 175, + 170, -1, -1, 63, -1, 3, -1, 4, -1, 7, + -1, 27, -1, 28, -1, 38, -1, 39, -1, 26, + -1, 116, 151, 117, -1, 150, -1, 61, 178, 24, + 109, 24, -1, 123, -1, 165, -1, 180, -1, 179, + -1, 144, 181, -1, 183, 184, -1, 172, 184, -1, + 185, 133, 186, -1, 185, 188, -1, -1, 23, -1, + 71, 182, -1, 71, 8, -1, 72, 21, 181, -1, + 72, 9, 181, 109, 21, 181, 109, 21, 181, -1, + 73, 131, 181, 109, 21, 181, 113, 187, 115, -1, + 73, 131, 181, 109, 21, 181, 113, 115, -1, 74, + 135, 142, 181, 111, 191, 112, 36, 21, 181, 75, + 21, 181, -1, 75, -1, 76, -1, 187, 131, 179, + 109, 21, 181, -1, 131, 179, 109, 21, 181, -1, + 133, 193, -1, 144, 113, 181, 109, 181, 115, -1, + 189, 109, 113, 181, 109, 181, 115, -1, 182, -1, + 190, 109, 182, -1, 190, -1, -1, 60, 59, -1, + 59, -1, 125, 144, 181, 109, 181, -1, 126, 144, + 181, 109, 181, -1, 127, 144, 181, 109, 181, -1, + 49, 182, -1, 128, 182, 109, 182, -1, 98, 182, + 36, 144, -1, 99, 182, 109, 182, 109, 182, -1, + 102, 182, 109, 144, -1, 106, 182, 109, 144, -1, + 107, 182, 109, 144, -1, 103, 182, 109, 182, -1, + 104, 182, 109, 182, 109, 182, -1, 105, 182, 109, + 182, 109, 182, -1, 97, 189, -1, 192, 135, 142, + 181, 111, 191, 112, -1, 196, -1, 109, 190, -1, + -1, 35, -1, -1, 91, 144, 137, -1, 91, 144, + 109, 15, 181, 137, -1, 92, 144, 137, -1, 92, + 144, 109, 15, 181, 137, -1, 93, 182, -1, 195, + 94, 144, 181, -1, 195, 95, 182, 109, 144, 181, + -1, 96, 144, 181, 194, -1 +}; -static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL", -"EUINT64VAL","SINTVAL","UINTVAL","FPVAL","VOID","BOOL","SBYTE","UBYTE","SHORT", -"USHORT","INT","UINT","LONG","ULONG","FLOAT","DOUBLE","TYPE","LABEL","VAR_ID", -"LABELSTR","STRINGCONSTANT","IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK", -"BEGINTOK","ENDTOK","DECLARE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO", -"DOTDOTDOT","NULL_TOK","UNDEF","CONST","INTERNAL","LINKONCE","WEAK","APPENDING", -"DLLIMPORT","DLLEXPORT","EXTERN_WEAK","OPAQUE","NOT","EXTERNAL","TARGET","TRIPLE", -"ENDIAN","POINTERSIZE","LITTLE","BIG","ALIGN","DEPLIBS","CALL","TAIL","ASM_TOK", -"MODULE","SIDEEFFECT","CC_TOK","CCC_TOK","CSRETCC_TOK","FASTCC_TOK","COLDCC_TOK", -"X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","RET","BR","SWITCH","INVOKE","UNWIND", -"UNREACHABLE","ADD","SUB","MUL","DIV","REM","AND","OR","XOR","SETLE","SETGE", -"SETLT","SETGT","SETEQ","SETNE","MALLOC","ALLOCA","FREE","LOAD","STORE","GETELEMENTPTR", -"PHI_TOK","CAST","SELECT","SHL","SHR","VAARG","EXTRACTELEMENT","INSERTELEMENT", -"SHUFFLEVECTOR","VAARG_old","VANEXT_old","'='","','","'\\\\'","'('","')'","'['", -"'x'","']'","'<'","'>'","'{'","'}'","'*'","'c'","INTVAL","EINT64VAL","ArithmeticOps", -"LogicalOps","SetCondOps","ShiftOps","SIntType","UIntType","IntType","FPType", -"OptAssign","OptLinkage","OptCallingConv","OptAlign","OptCAlign","SectionString", -"OptSection","GlobalVarAttributes","GlobalVarAttribute","TypesV","UpRTypesV", -"Types","PrimType","UpRTypes","TypeListI","ArgTypeListI","ConstVal","ConstExpr", -"ConstVector","GlobalType","Module","FunctionList","ConstPool","@1","@2","@3", -"@4","AsmBlock","BigOrLittle","TargetDefinition","LibrariesDefinition","LibList", -"Name","OptName","ArgVal","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader", -"END","Function","FnDeclareLinkage","FunctionProto","@5","OptSideEffect","ConstValueRef", -"SymbolicValueRef","ValueRef","ResolvedVal","BasicBlockList","BasicBlock","InstructionList", -"BBTerminatorInst","JumpTable","Inst","PHIList","ValueRefList","ValueRefListE", -"OptTailCall","InstVal","IndexList","OptVolatile","MemoryInst", NULL +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 1096, 1096, 1097, 1105, 1106, 1116, 1116, 1116, 1116, + 1116, 1117, 1117, 1117, 1118, 1118, 1118, 1118, 1118, 1118, + 1120, 1120, 1124, 1124, 1124, 1124, 1125, 1125, 1125, 1125, + 1126, 1126, 1127, 1127, 1130, 1134, 1139, 1140, 1141, 1142, + 1143, 1144, 1145, 1146, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1164, 1165, 1171, 1172, 1180, 1188, 1189, 1194, + 1195, 1196, 1201, 1215, 1215, 1216, 1216, 1218, 1228, 1228, + 1228, 1228, 1228, 1228, 1228, 1229, 1229, 1229, 1229, 1229, + 1229, 1230, 1234, 1238, 1246, 1254, 1267, 1272, 1284, 1294, + 1298, 1307, 1312, 1318, 1319, 1323, 1327, 1338, 1364, 1378, + 1408, 1434, 1455, 1468, 1478, 1483, 1544, 1551, 1560, 1566, + 1572, 1576, 1580, 1588, 1599, 1631, 1639, 1661, 1672, 1678, + 1686, 1692, 1698, 1707, 1711, 1719, 1719, 1729, 1737, 1742, + 1746, 1750, 1754, 1769, 1791, 1794, 1797, 1797, 1805, 1805, + 1813, 1813, 1821, 1821, 1830, 1833, 1836, 1840, 1853, 1854, + 1856, 1860, 1869, 1875, 1877, 1882, 1887, 1896, 1896, 1897, + 1897, 1899, 1906, 1912, 1919, 1923, 1929, 1934, 1939, 2034, + 2034, 2036, 2044, 2044, 2046, 2051, 2052, 2053, 2055, 2055, + 2065, 2069, 2074, 2078, 2082, 2086, 2090, 2094, 2098, 2102, + 2106, 2131, 2135, 2149, 2153, 2159, 2159, 2165, 2170, 2174, + 2183, 2194, 2199, 2211, 2224, 2228, 2232, 2237, 2246, 2265, + 2274, 2330, 2334, 2341, 2352, 2365, 2374, 2383, 2393, 2397, + 2404, 2404, 2406, 2410, 2415, 2431, 2446, 2460, 2473, 2481, + 2489, 2497, 2503, 2523, 2546, 2552, 2558, 2564, 2579, 2638, + 2645, 2648, 2653, 2657, 2664, 2669, 2675, 2680, 2686, 2694, + 2706, 2721 }; #endif -static const short yyr1[] = { 0, - 122, 122, 123, 123, 124, 124, 124, 124, 124, 125, - 125, 125, 126, 126, 126, 126, 126, 126, 127, 127, - 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, - 131, 131, 132, 132, 133, 133, 133, 133, 133, 133, - 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, - 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, - 140, 141, 141, 142, 142, 143, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 146, - 146, 147, 147, 147, 147, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 150, 150, 151, 151, 152, 153, 153, 153, 153, - 153, 154, 154, 154, 155, 154, 156, 154, 157, 154, - 158, 154, 154, 154, 154, 159, 160, 160, 161, 161, - 161, 162, 163, 163, 163, 164, 164, 165, 165, 166, - 167, 167, 168, 168, 168, 168, 169, 170, 170, 171, - 172, 172, 173, 174, 174, 174, 176, 175, 177, 177, - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 178, 179, 179, 180, 180, 181, 182, 182, 183, 184, - 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 186, 186, 187, 188, 188, 189, 189, 190, 190, - 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, - 194, 194, 195, 195, 195, 195, 195, 195, 195, 195 +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL", + "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT", + "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL", + "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", + "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", + "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", + "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE", + "WEAK", "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE", + "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", "POINTERSIZE", "LITTLE", + "BIG", "ALIGN", "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE", + "SIDEEFFECT", "CC_TOK", "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK", + "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "RET", "BR", + "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "DIV", + "REM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", + "SETNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", + "PHI_TOK", "CAST", "SELECT", "SHL", "SHR", "VAARG", "EXTRACTELEMENT", + "INSERTELEMENT", "SHUFFLEVECTOR", "VAARG_old", "VANEXT_old", "'='", + "','", "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", + "'}'", "'*'", "'c'", "$accept", "INTVAL", "EINT64VAL", "ArithmeticOps", + "LogicalOps", "SetCondOps", "ShiftOps", "SIntType", "UIntType", + "IntType", "FPType", "OptAssign", "OptLinkage", "OptCallingConv", + "OptAlign", "OptCAlign", "SectionString", "OptSection", + "GlobalVarAttributes", "GlobalVarAttribute", "TypesV", "UpRTypesV", + "Types", "PrimType", "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", + "ConstExpr", "ConstVector", "GlobalType", "Module", "FunctionList", + "ConstPool", "@1", "@2", "@3", "@4", "AsmBlock", "BigOrLittle", + "TargetDefinition", "LibrariesDefinition", "LibList", "Name", "OptName", + "ArgVal", "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", + "FunctionHeader", "END", "Function", "FnDeclareLinkage", "FunctionProto", + "@5", "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef", + "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList", + "BBTerminatorInst", "JumpTable", "Inst", "PHIList", "ValueRefList", + "ValueRefListE", "OptTailCall", "InstVal", "IndexList", "OptVolatile", + "MemoryInst", 0 }; +#endif -static const short yyr2[] = { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 1, 1, 1, 1, 1, 2, - 0, 2, 0, 3, 2, 0, 1, 0, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 4, 5, 5, 3, 2, 2, 1, - 3, 1, 3, 1, 0, 4, 3, 3, 4, 4, - 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 6, 5, 8, 6, 6, 6, 6, 6, 8, - 8, 3, 1, 1, 1, 1, 2, 2, 4, 2, - 1, 4, 2, 4, 0, 7, 0, 7, 0, 7, - 0, 7, 3, 4, 0, 1, 1, 1, 3, 3, - 3, 3, 3, 1, 0, 1, 1, 1, 0, 2, - 3, 1, 1, 3, 1, 0, 8, 1, 1, 3, - 1, 1, 2, 0, 1, 1, 0, 4, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 5, 1, 1, 1, 1, 2, 2, 2, 3, 2, - 0, 1, 2, 2, 3, 9, 9, 8, 13, 1, - 1, 6, 5, 2, 6, 7, 1, 3, 1, 0, - 2, 1, 5, 5, 5, 2, 4, 4, 6, 4, - 4, 4, 4, 6, 6, 2, 7, 1, 2, 0, - 1, 0, 3, 6, 3, 6, 2, 4, 6, 4 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 61, 44, + 92, 40, 41, 91, 120, 93, 60, 62, 123, 125, + 42, 99 }; +# endif -static const short yydefact[] = { 145, - 42, 131, 130, 177, 35, 36, 37, 38, 39, 40, - 41, 0, 43, 201, 127, 128, 201, 156, 157, 0, - 0, 0, 42, 0, 133, 174, 0, 0, 44, 45, - 46, 47, 48, 49, 0, 0, 202, 198, 34, 171, - 172, 173, 197, 0, 0, 0, 143, 0, 0, 0, - 0, 0, 0, 0, 33, 175, 176, 43, 146, 129, - 50, 1, 2, 63, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 0, 0, - 0, 0, 192, 0, 0, 62, 81, 66, 193, 82, - 168, 169, 170, 242, 200, 0, 0, 0, 155, 144, - 134, 132, 124, 125, 0, 0, 0, 0, 178, 83, - 0, 0, 65, 88, 90, 0, 0, 95, 89, 241, - 0, 222, 0, 0, 0, 0, 43, 210, 211, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 199, 43, 214, 0, 238, 151, 148, 147, - 149, 150, 154, 0, 139, 141, 137, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 0, 0, - 0, 0, 135, 0, 0, 0, 87, 166, 94, 92, - 0, 0, 226, 221, 204, 203, 0, 0, 24, 28, - 23, 27, 22, 26, 21, 25, 29, 30, 0, 0, - 53, 53, 247, 0, 0, 236, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 152, 58, 58, 58, 109, 110, 3, 4, - 107, 108, 111, 106, 102, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 105, 104, 58, 64, 64, 91, 165, 159, 162, 163, - 0, 0, 84, 181, 182, 183, 188, 184, 185, 186, - 187, 179, 0, 190, 195, 194, 196, 0, 205, 0, - 0, 0, 243, 0, 245, 240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 153, 0, 140, 142, 138, 0, 0, - 0, 0, 0, 0, 97, 123, 0, 0, 101, 0, - 98, 0, 0, 0, 0, 136, 85, 86, 158, 160, - 0, 56, 93, 180, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 250, 0, 0, 228, 0, 230, 233, - 0, 0, 231, 232, 0, 0, 0, 227, 0, 248, - 0, 0, 0, 60, 58, 240, 0, 0, 0, 0, - 0, 0, 96, 99, 100, 0, 0, 0, 0, 164, - 161, 57, 51, 0, 189, 0, 0, 220, 53, 54, - 53, 217, 239, 0, 0, 0, 0, 0, 223, 224, - 225, 220, 0, 55, 61, 59, 0, 0, 0, 0, - 0, 0, 122, 0, 0, 0, 0, 0, 167, 0, - 0, 0, 219, 0, 0, 244, 246, 0, 0, 0, - 229, 234, 235, 0, 249, 113, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 52, 191, 0, 0, 0, - 218, 215, 0, 237, 112, 0, 119, 0, 0, 115, - 116, 117, 118, 0, 208, 0, 0, 0, 216, 0, - 0, 0, 206, 0, 207, 0, 0, 114, 120, 121, - 0, 0, 0, 0, 0, 0, 213, 0, 0, 212, - 209, 0, 0, 0 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 122, 123, 123, 124, 124, 125, 125, 125, 125, + 125, 126, 126, 126, 127, 127, 127, 127, 127, 127, + 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, + 131, 131, 132, 132, 133, 133, 134, 134, 134, 134, + 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, + 135, 135, 136, 136, 137, 137, 138, 139, 139, 140, + 140, 141, 141, 142, 142, 143, 143, 144, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 147, 147, 148, 148, 148, 148, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 151, 151, 152, 152, 153, 154, 154, + 154, 154, 154, 155, 155, 155, 156, 155, 157, 155, + 158, 155, 159, 155, 155, 155, 155, 160, 161, 161, + 162, 162, 162, 163, 164, 164, 164, 165, 165, 166, + 166, 167, 168, 168, 169, 169, 169, 169, 170, 171, + 171, 172, 173, 173, 174, 175, 175, 175, 177, 176, + 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 180, 180, 181, 181, 182, 183, 183, + 184, 185, 185, 185, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 187, 187, 188, 189, 189, 190, 190, + 191, 191, 192, 192, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 194, 194, 195, 195, 196, 196, 196, 196, 196, 196, + 196, 196 }; -static const short yydefgoto[] = { 83, - 251, 267, 268, 269, 270, 189, 190, 219, 191, 23, - 13, 35, 439, 303, 384, 403, 326, 385, 84, 85, - 192, 87, 88, 116, 201, 336, 294, 337, 105, 512, - 1, 2, 273, 246, 244, 245, 60, 171, 47, 100, - 174, 89, 350, 279, 280, 281, 36, 93, 14, 42, - 15, 58, 16, 26, 355, 295, 90, 297, 412, 17, - 38, 39, 163, 487, 95, 226, 443, 444, 164, 165, - 364, 166, 167 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 2, 0, 2, 0, 3, 2, 0, 1, 0, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 4, 5, 5, 3, 2, + 2, 1, 3, 1, 3, 1, 0, 4, 3, 3, + 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 6, 5, 8, 6, 6, 6, 6, + 6, 8, 8, 3, 1, 1, 1, 1, 2, 2, + 4, 2, 1, 4, 2, 4, 0, 7, 0, 7, + 0, 7, 0, 7, 3, 4, 0, 1, 1, 1, + 3, 3, 3, 3, 3, 1, 0, 1, 1, 1, + 0, 2, 3, 1, 1, 3, 1, 0, 8, 1, + 1, 3, 1, 1, 2, 0, 1, 1, 0, 4, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 5, 1, 1, 1, 1, 2, 2, 2, + 3, 2, 0, 1, 2, 2, 3, 9, 9, 8, + 13, 1, 1, 6, 5, 2, 6, 7, 1, 3, + 1, 0, 2, 1, 5, 5, 5, 2, 4, 4, + 6, 4, 4, 4, 4, 6, 6, 2, 7, 1, + 2, 0, 1, 0, 3, 6, 3, 6, 2, 4, + 6, 4 }; -static const short yypact[] = {-32768, - 194, 602,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, -20, 38, 59,-32768,-32768, -18,-32768,-32768, 13, - -8, 75, 115, 58,-32768, 40, 124, 163,-32768,-32768, --32768,-32768,-32768,-32768, 1052, -22,-32768,-32768, -3,-32768, --32768,-32768,-32768, 60, 65, 67,-32768, 57, 124, 1052, - 62, 62, 62, 62,-32768,-32768,-32768, 38,-32768,-32768, --32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 167, 172, - 173, 569,-32768, -3, 68,-32768,-32768, -30,-32768,-32768, --32768,-32768,-32768, 1223,-32768, 159, 42, 180, 162,-32768, --32768,-32768,-32768,-32768, 1093, 1093, 1093, 1134,-32768,-32768, - 73, 74,-32768,-32768, -30, -75, 78, 847,-32768,-32768, - 1093,-32768, 132, 1175, 14, 185, 38,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 1093, 1093, 1093, 1093, 1093, 1093, 1093, --32768,-32768, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, - 1093, 1093,-32768, 38,-32768, 22,-32768,-32768,-32768,-32768, --32768,-32768,-32768, -47,-32768,-32768,-32768, 111, 137, 199, - 140, 203, 142, 204, 147, 205, 210, 211, 151, 206, - 213, 412,-32768, 1093, 1093, 1093,-32768, 888,-32768, 103, - 110, 635,-32768,-32768, 61,-32768, 635, 635,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 635, 1052, - 114, 117,-32768, 635, 134, 118, 188, 119, 139, 141, - 144, 145, 146, 148, 635, 635, 635, 149, 1052, 1093, - 1093, 225,-32768, 150, 150, 150,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 152, 153, 154, 157, - 158, 175, 929, 1134, 589, 227, 176, 178, 179, 182, --32768,-32768, 150, -51, -72, -30,-32768, -3,-32768, 161, - 183, 970,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 197, 1134,-32768,-32768,-32768,-32768, 164,-32768, 187, - 635, -4,-32768, 3,-32768, 189, 635, 171, 1093, 1093, - 1093, 1093, 1093, 1093, 1093, 1093, 193, 195, 200, 1093, - 635, 635, 201,-32768, -17,-32768,-32768,-32768, 1134, 1134, - 1134, 1134, 1134, 1134,-32768,-32768, -16, -26,-32768, -73, --32768, 1134, 1134, 1134, 1134,-32768,-32768,-32768,-32768,-32768, - 1011, 228,-32768,-32768, 237, -25, 270, 273, 186, 635, - 299, 635, 1093,-32768, 214, 635,-32768, 215,-32768,-32768, - 216, 217,-32768,-32768, 635, 635, 635,-32768, 202,-32768, - 1093, 282, 304,-32768, 150, 189, 276, 218, 224, 229, - 230, 1134,-32768,-32768,-32768, 231, 232, 233, 234,-32768, --32768,-32768, 257, 238,-32768, 635, 635, 1093, 239,-32768, - 239,-32768, 241, 635, 244, 1093, 1093, 1093,-32768,-32768, --32768, 1093, 635,-32768,-32768,-32768, 242, 1093, 1134, 1134, - 1134, 1134,-32768, 1134, 1134, 1134, 1134, 311,-32768, 331, - 247, 245, 241, 248, 300,-32768,-32768, 1093, 246, 635, --32768,-32768,-32768, 252,-32768,-32768, 254, 258, 260, 261, - 265, 263, 268, 272, 277,-32768,-32768, 348, 16, 341, --32768,-32768, 275,-32768,-32768, 1134,-32768, 1134, 1134,-32768, --32768,-32768,-32768, 635,-32768, 738, 63, 367,-32768, 279, - 280, 284,-32768, 285,-32768, 738, 635,-32768,-32768,-32768, - 376, 289, 324, 635, 379, 380,-32768, 635, 635,-32768, --32768, 402, 403,-32768 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 146, 0, 43, 132, 1, 131, 178, 36, 37, 38, + 39, 40, 41, 42, 0, 44, 202, 128, 129, 202, + 157, 158, 0, 0, 0, 43, 0, 134, 175, 0, + 0, 45, 46, 47, 48, 49, 50, 0, 0, 203, + 199, 35, 172, 173, 174, 198, 0, 0, 0, 144, + 0, 0, 0, 0, 0, 0, 0, 34, 176, 177, + 44, 147, 130, 51, 2, 3, 64, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 0, 0, 193, 0, 0, 63, 82, + 67, 194, 83, 169, 170, 171, 243, 201, 0, 0, + 0, 156, 145, 135, 133, 125, 126, 0, 0, 0, + 0, 179, 84, 0, 0, 66, 89, 91, 0, 0, + 96, 90, 242, 0, 223, 0, 0, 0, 0, 44, + 211, 212, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 44, 215, 0, 239, + 152, 149, 148, 150, 151, 155, 0, 140, 142, 138, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 0, 0, 0, 0, 136, 0, 0, 0, 88, + 167, 95, 93, 0, 0, 227, 222, 205, 204, 0, + 0, 25, 29, 24, 28, 23, 27, 22, 26, 30, + 31, 0, 0, 54, 54, 248, 0, 0, 237, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 153, 59, 59, 59, 110, + 111, 4, 5, 108, 109, 112, 107, 103, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 106, 105, 59, 65, 65, 92, 166, + 160, 163, 164, 0, 0, 85, 182, 183, 184, 189, + 185, 186, 187, 188, 180, 0, 191, 196, 195, 197, + 0, 206, 0, 0, 0, 244, 0, 246, 241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 154, 0, 141, 143, + 139, 0, 0, 0, 0, 0, 0, 98, 124, 0, + 0, 102, 0, 99, 0, 0, 0, 0, 137, 86, + 87, 159, 161, 0, 57, 94, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 229, + 0, 231, 234, 0, 0, 232, 233, 0, 0, 0, + 228, 0, 249, 0, 0, 0, 61, 59, 241, 0, + 0, 0, 0, 0, 0, 97, 100, 101, 0, 0, + 0, 0, 165, 162, 58, 52, 0, 190, 0, 0, + 221, 54, 55, 54, 218, 240, 0, 0, 0, 0, + 0, 224, 225, 226, 221, 0, 56, 62, 60, 0, + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 168, 0, 0, 0, 220, 0, 0, 245, 247, + 0, 0, 0, 230, 235, 236, 0, 250, 114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 192, + 0, 0, 0, 219, 216, 0, 238, 113, 0, 120, + 0, 0, 116, 117, 118, 119, 0, 209, 0, 0, + 0, 217, 0, 0, 0, 207, 0, 208, 0, 0, + 115, 121, 122, 0, 0, 0, 0, 0, 0, 214, + 0, 0, 213, 210 }; -static const short yypgoto[] = {-32768, --32768, 310, 312, 313, 314, -125, -124, -449,-32768, 366, - 386, -103,-32768, -219, 69,-32768, -236,-32768, -46,-32768, - -35,-32768, -66, 292,-32768, -100, 219, -251, 80,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 363,-32768,-32768,-32768, --32768, 4,-32768, 71,-32768,-32768, 356,-32768,-32768,-32768, --32768,-32768, 413,-32768,-32768, -447, -55, 64, -99,-32768, - 399,-32768,-32768,-32768,-32768,-32768, 56, -2,-32768,-32768, - 37,-32768,-32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 85, 253, 269, 270, 271, 272, 191, 192, 221, + 193, 25, 15, 37, 441, 305, 386, 405, 328, 387, + 86, 87, 194, 89, 90, 118, 203, 338, 296, 339, + 107, 1, 2, 3, 275, 248, 246, 247, 62, 173, + 49, 102, 176, 91, 352, 281, 282, 283, 38, 95, + 16, 44, 17, 60, 18, 28, 357, 297, 92, 299, + 414, 19, 40, 41, 165, 489, 97, 228, 445, 446, + 166, 167, 366, 168, 169 }; - -#define YYLAST 1330 - - -static const short yytable[] = { 86, - 217, 218, 305, 102, 37, 24, 91, 193, 327, 328, - 360, 40, 338, 340, 86, 115, 382, 362, 18, 486, - 19, 203, 207, 220, 206, 209, 210, 211, 212, 213, - 214, 215, 216, 196, 208, 392, 346, 496, 494, 383, - 27, 356, 24, 197, 348, 395, 223, 119, 502, 227, - 228, 115, 361, 229, 230, 231, 232, 233, 234, 361, - 239, 242, 238, 347, 44, 45, 46, 243, 119, 175, - 176, 177, 209, 210, 211, 212, 213, 214, 215, 216, - -64, 37, 392, 392, 56, 202, 57, 117, 202, 119, - 394, 405, 392, 103, 104, 92, 169, 170, 393, 48, - 41, 28, 29, 30, 31, 32, 33, 34, 221, 222, - 202, 224, 225, 202, 202, 240, 241, 202, 202, 202, - 202, 202, 202, 235, 236, 237, 202, 274, 275, 276, - 485, 106, 107, 108, 50, 49, 272, 247, 248, -24, - -24, 323, -23, -23, -22, -22, 296, 59, 426, -21, - -21, 296, 296, 249, 250, 5, 6, 7, 8, 51, - 10, 52, 278, 296, 53, 55, 61, 96, 296, 99, - 110, -65, 97, 301, 98, 111, 112, 495, 118, 296, - 296, 296, 168, 172, 86, 173, 194, 195, 198, 446, - 204, 447, 321, -126, 209, 210, 211, 212, 213, 214, - 215, 216, -28, 86, 322, 202, -27, -26, -25, 252, - 368, 282, 370, 371, 372, 276, -31, -32, 3, 253, - 378, 283, 302, 309, 4, 304, 308, 310, 386, 387, - 388, 389, 390, 391, 5, 6, 7, 8, 9, 10, - 11, 396, 397, 398, 399, 296, 307, 311, 324, 312, - 341, 296, 313, 314, 315, 12, 316, 320, 325, 354, - 404, 382, 329, 330, 331, 296, 296, 332, 333, 351, - 298, 299, 357, 367, 202, 369, 202, 202, 202, 373, - 374, 349, 300, 366, 202, 334, 342, 306, 343, 344, - 406, 433, 345, 407, 352, 358, 408, 363, 317, 318, - 319, 375, 410, 376, 296, 424, 296, 425, 377, 381, - 296, 428, 422, 438, 466, 278, 451, 452, 453, 296, - 296, 296, 414, 416, 417, 418, 429, 202, 458, 459, - 460, 461, 430, 462, 463, 464, 465, 431, 432, 434, - 435, 436, 437, 217, 218, 423, 440, 445, 471, 448, - 296, 296, 450, 456, 467, 468, 361, 469, 296, 470, - 472, 217, 218, 474, 359, 475, 476, 296, 484, 478, - 365, 477, 202, 479, 480, 490, 488, 491, 492, 481, - 202, 202, 202, 482, 379, 380, 202, 497, 483, 489, - 498, 499, 457, 501, 296, 500, 504, 505, 506, 508, - 509, 513, 514, 159, 94, 160, 161, 162, 54, 200, - 271, 101, 202, 109, 25, 43, 62, 63, 413, 454, - 402, 401, 427, 409, 0, 411, 0, 0, 296, 415, - 0, 0, 0, 18, 0, 19, 0, 254, 419, 420, - 421, 296, 0, 0, 0, 0, 0, 0, 296, 255, - 256, 0, 296, 296, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, - 442, 0, 0, 0, 0, 0, 0, 449, 0, 0, - 0, 0, 0, 0, 0, 0, 455, 0, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 0, 0, 0, 0, 0, 257, 0, 258, - 259, 151, 152, 473, 260, 261, 262, 0, 0, 0, - 0, 0, 0, 0, 263, 0, 0, 264, 0, 265, - 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 503, 0, 0, 0, 0, 0, 0, 507, 0, 0, - 0, 510, 511, 62, 63, 0, 113, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 18, 0, 19, 62, 63, 0, 113, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 76, 77, - 18, 0, 19, 0, 0, 0, 78, 0, 0, 0, - 0, -34, 0, 18, 0, 19, 0, 0, 0, 0, - 0, 0, 4, -34, -34, 0, 78, 284, 285, 62, - 63, 286, -34, -34, -34, -34, -34, -34, -34, 0, - 0, -34, 20, 0, 0, 0, 18, 0, 19, 21, - 287, 288, 289, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 290, 291, 0, 0, 0, 0, 79, 0, - 0, 80, 0, 0, 81, 0, 82, 114, 0, 0, - 0, 0, 0, 0, 0, 292, 0, 0, 79, 0, - 0, 80, 0, 0, 81, 0, 82, 339, 0, 0, - 0, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, - 257, 0, 258, 259, 151, 152, 0, 260, 261, 262, - 284, 285, 0, 0, 286, 0, 0, 0, 0, 0, - 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 288, 289, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 290, 291, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 0, 0, - 0, 0, 0, 257, 0, 258, 259, 151, 152, 0, - 260, 261, 262, 0, 0, 0, 0, 0, 0, 0, - 0, 62, 63, 293, 113, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 18, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 63, 78, 113, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 18, - 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 63, 78, 113, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 76, 77, - 18, 0, 19, 0, 0, 0, 79, 0, 0, 80, - 0, 0, 81, 0, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 63, 78, 113, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 18, 0, 19, 0, 0, 0, 79, 0, 0, - 80, 0, 0, 81, 0, 82, 353, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 63, 78, 113, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 18, 0, 19, 0, 0, 0, 79, 0, - 0, 80, 0, 335, 81, 0, 82, 400, 0, 0, - 0, 0, 0, 0, 0, 0, 62, 63, 78, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 18, 0, 19, 0, 0, 0, 79, - 0, 0, 80, 0, 0, 81, 0, 82, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 63, 78, - 113, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 18, 0, 19, 0, 0, 0, - 79, 0, 0, 80, 0, 0, 81, 0, 82, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, - 78, 113, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 76, 77, 18, 0, 19, 0, 0, - 0, 79, 0, 0, 80, 0, 0, 81, 0, 82, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, - 63, 78, 205, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 18, 0, 19, 0, - 0, 0, 79, 0, 0, 80, 0, 0, 81, 0, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 79, 0, 0, 80, 0, 0, 81, - 0, 82, 0, 0, 0, 0, 0, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 122, 123, 0, 79, 0, 0, 80, 0, 0, - 81, 0, 82, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 0, 0, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -428 +static const short int yypact[] = +{ + -428, 45, 194, 602, -428, -428, -428, -428, -428, -428, + -428, -428, -428, -428, 26, 14, 85, -428, -428, -13, + -428, -428, 91, 28, 90, 49, 33, -428, 21, 155, + 158, -428, -428, -428, -428, -428, -428, 1052, -20, -428, + -428, 80, -428, -428, -428, -428, 75, 76, 79, -428, + 73, 155, 1052, 84, 84, 84, 84, -428, -428, -428, + 14, -428, -428, -428, -428, -428, 77, -428, -428, -428, + -428, -428, -428, -428, -428, -428, -428, -428, -428, -428, + -428, 185, 187, 191, 569, -428, 80, 86, -428, -428, + -44, -428, -428, -428, -428, -428, 1223, -428, 175, 78, + 192, 176, -428, -428, -428, -428, -428, 1093, 1093, 1093, + 1134, -428, -428, 87, 88, -428, -428, -44, -95, 92, + 847, -428, -428, 1093, -428, 139, 1175, 52, 144, 14, + -428, -428, -428, -428, -428, -428, -428, -428, -428, -428, + -428, -428, -428, -428, -428, -428, 1093, 1093, 1093, 1093, + 1093, 1093, 1093, -428, -428, 1093, 1093, 1093, 1093, 1093, + 1093, 1093, 1093, 1093, 1093, -428, 14, -428, 44, -428, + -428, -428, -428, -428, -428, -428, -12, -428, -428, -428, + 138, 164, 203, 167, 204, 169, 205, 172, 206, 210, + 211, 174, 208, 213, 412, -428, 1093, 1093, 1093, -428, + 888, -428, 113, 111, 635, -428, -428, 77, -428, 635, + 635, -428, -428, -428, -428, -428, -428, -428, -428, -428, + -428, 635, 1052, 115, 117, -428, 635, 114, 119, 212, + 140, 141, 142, 145, 146, 148, 149, 635, 635, 635, + 150, 1052, 1093, 1093, 223, -428, 151, 151, 151, -428, + -428, -428, -428, -428, -428, -428, -428, -428, -428, 152, + 153, 154, 157, 159, 162, 929, 1134, 589, 229, 173, + 178, 179, 180, -428, -428, 151, -15, 15, -44, -428, + 80, -428, 160, 181, 970, -428, -428, -428, -428, -428, + -428, -428, -428, -428, 198, 1134, -428, -428, -428, -428, + 177, -428, 186, 635, -4, -428, 3, -428, 188, 635, + 183, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 189, + 193, 195, 1093, 635, 635, 197, -428, -11, -428, -428, + -428, 1134, 1134, 1134, 1134, 1134, 1134, -428, -428, -8, + -96, -428, -45, -428, 1134, 1134, 1134, 1134, -428, -428, + -428, -428, -428, 1011, 228, -428, -428, 263, -32, 273, + 282, 199, 635, 304, 635, 1093, -428, 200, 635, -428, + 214, -428, -428, 215, 216, -428, -428, 635, 635, 635, + -428, 201, -428, 1093, 289, 310, -428, 151, 188, 279, + 217, 218, 224, 230, 1134, -428, -428, -428, 231, 232, + 233, 234, -428, -428, -428, 281, 238, -428, 635, 635, + 1093, 239, -428, 239, -428, 241, 635, 244, 1093, 1093, + 1093, -428, -428, -428, 1093, 635, -428, -428, -428, 242, + 1093, 1134, 1134, 1134, 1134, -428, 1134, 1134, 1134, 1134, + 351, -428, 332, 248, 245, 241, 249, 303, -428, -428, + 1093, 251, 635, -428, -428, -428, 252, -428, -428, 255, + 260, 258, 265, 266, 268, 272, 276, 277, -428, -428, + 356, 16, 336, -428, -428, 275, -428, -428, 1134, -428, + 1134, 1134, -428, -428, -428, -428, 635, -428, 738, 25, + 370, -428, 280, 284, 285, -428, 290, -428, 738, 635, + -428, -428, -428, 373, 291, 323, 635, 380, 381, -428, + 635, 635, -428, -428 }; -static const short yycheck[] = { 35, - 126, 126, 222, 50, 23, 2, 29, 108, 245, 246, - 15, 30, 264, 265, 50, 82, 34, 15, 22, 469, - 24, 121, 9, 127, 124, 10, 11, 12, 13, 14, - 15, 16, 17, 109, 21, 109, 273, 487, 486, 57, - 61, 293, 39, 119, 117, 119, 146, 120, 496, 149, - 150, 118, 57, 153, 154, 155, 156, 157, 158, 57, - 164, 109, 162, 115, 52, 53, 54, 115, 120, 105, - 106, 107, 10, 11, 12, 13, 14, 15, 16, 17, - 111, 23, 109, 109, 45, 121, 47, 84, 124, 120, - 117, 117, 109, 32, 33, 118, 55, 56, 115, 108, - 119, 64, 65, 66, 67, 68, 69, 70, 144, 145, - 146, 147, 148, 149, 150, 94, 95, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 194, 195, 196, - 115, 52, 53, 54, 20, 61, 192, 27, 28, 3, - 4, 241, 3, 4, 3, 4, 202, 24, 385, 3, - 4, 207, 208, 3, 4, 41, 42, 43, 44, 45, - 46, 47, 198, 219, 50, 108, 4, 108, 224, 113, - 4, 111, 108, 220, 108, 4, 4, 115, 111, 235, - 236, 237, 24, 4, 220, 24, 114, 114, 111, 409, - 59, 411, 239, 0, 10, 11, 12, 13, 14, 15, - 16, 17, 4, 239, 240, 241, 4, 4, 4, 4, - 310, 109, 312, 313, 314, 282, 7, 7, 25, 7, - 320, 112, 109, 36, 31, 109, 109, 109, 329, 330, - 331, 332, 333, 334, 41, 42, 43, 44, 45, 46, - 47, 342, 343, 344, 345, 301, 113, 109, 24, 109, - 24, 307, 109, 109, 109, 62, 109, 109, 109, 63, - 24, 34, 111, 111, 111, 321, 322, 111, 111, 109, - 207, 208, 109, 309, 310, 311, 312, 313, 314, 315, - 316, 278, 219, 113, 320, 111, 111, 224, 111, 111, - 21, 392, 111, 21, 112, 109, 111, 109, 235, 236, - 237, 109, 4, 109, 360, 24, 362, 4, 109, 109, - 366, 36, 111, 57, 4, 351, 416, 417, 418, 375, - 376, 377, 109, 109, 109, 109, 109, 363, 429, 430, - 431, 432, 109, 434, 435, 436, 437, 109, 109, 109, - 109, 109, 109, 469, 469, 381, 109, 109, 448, 109, - 406, 407, 109, 112, 24, 109, 57, 113, 414, 112, - 115, 487, 487, 112, 301, 112, 109, 423, 21, 109, - 307, 112, 408, 109, 112, 476, 36, 478, 479, 112, - 416, 417, 418, 112, 321, 322, 422, 21, 112, 115, - 112, 112, 428, 109, 450, 112, 21, 109, 75, 21, - 21, 0, 0, 94, 39, 94, 94, 94, 23, 118, - 192, 49, 448, 58, 2, 17, 5, 6, 363, 422, - 352, 351, 386, 360, -1, 362, -1, -1, 484, 366, - -1, -1, -1, 22, -1, 24, -1, 26, 375, 376, - 377, 497, -1, -1, -1, -1, -1, -1, 504, 38, - 39, -1, 508, 509, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 406, - 407, -1, -1, -1, -1, -1, -1, 414, -1, -1, - -1, -1, -1, -1, -1, -1, 423, -1, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, -1, 98, - 99, 100, 101, 450, 103, 104, 105, -1, -1, -1, - -1, -1, -1, -1, 113, -1, -1, 116, -1, 118, - -1, -1, 121, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 484, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 497, -1, -1, -1, -1, -1, -1, 504, -1, -1, - -1, 508, 509, 5, 6, -1, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, 5, 6, -1, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, 48, -1, -1, -1, - -1, 20, -1, 22, -1, 24, -1, -1, -1, -1, - -1, -1, 31, 32, 33, -1, 48, 3, 4, 5, - 6, 7, 41, 42, 43, 44, 45, 46, 47, -1, - -1, 50, 51, -1, -1, -1, 22, -1, 24, 58, - 26, 27, 28, 62, -1, -1, -1, -1, -1, -1, - -1, -1, 38, 39, -1, -1, -1, -1, 110, -1, - -1, 113, -1, -1, 116, -1, 118, 119, -1, -1, - -1, -1, -1, -1, -1, 61, -1, -1, 110, -1, - -1, 113, -1, -1, 116, -1, 118, 119, -1, -1, - -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, - 96, -1, 98, 99, 100, 101, -1, 103, 104, 105, - 3, 4, -1, -1, 7, -1, -1, -1, -1, -1, - 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 26, 27, 28, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, -1, 98, 99, 100, 101, -1, - 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, - -1, 5, 6, 116, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, - -1, -1, 5, 6, 48, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, - -1, -1, -1, 5, 6, 48, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, 110, -1, -1, 113, - -1, -1, 116, -1, 118, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 5, 6, 48, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, -1, 24, -1, -1, -1, 110, -1, -1, - 113, -1, -1, 116, -1, 118, 37, -1, -1, -1, - -1, -1, -1, -1, -1, 5, 6, 48, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, 110, -1, - -1, 113, -1, 115, 116, -1, 118, 37, -1, -1, - -1, -1, -1, -1, -1, -1, 5, 6, 48, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, 110, - -1, -1, 113, -1, -1, 116, -1, 118, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 5, 6, 48, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, - 110, -1, -1, 113, -1, -1, 116, -1, 118, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, - 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, - -1, 110, -1, -1, 113, -1, -1, 116, -1, 118, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, - 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, - -1, -1, 110, -1, -1, 113, -1, -1, 116, -1, - 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 110, -1, -1, 113, -1, -1, 116, - -1, 118, -1, -1, -1, -1, -1, 35, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, 60, -1, 110, -1, -1, 113, -1, -1, - 116, -1, 118, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, -1, -1, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107 +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -428, -428, -428, 307, 308, 309, 311, -127, -126, -427, + -428, 365, 383, -117, -428, -221, 55, -428, -241, -428, + -48, -428, -37, -428, -68, 292, -428, -102, 220, -247, + 94, -428, -428, -428, -428, -428, -428, -428, 359, -428, + -428, -428, -428, 2, -428, 58, -428, -428, 355, -428, + -428, -428, -428, -428, 413, -428, -428, -423, -57, 62, + -101, -428, 400, -428, -428, -428, -428, -428, 56, -2, + -428, -428, 32, -428, -428 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -128 +static const short int yytable[] = +{ + 88, 219, 220, 307, 104, 26, 329, 330, 195, 93, + 39, 362, 222, 394, 198, 88, 117, 42, 364, 340, + 342, 396, 205, 384, 199, 208, 211, 212, 213, 214, + 215, 216, 217, 218, 348, 211, 212, 213, 214, 215, + 216, 217, 218, 26, 488, 4, 385, 225, 358, 241, + 229, 230, 117, 363, 231, 232, 233, 234, 235, 236, + 363, 209, 498, 240, 394, 496, 58, -65, 59, 52, + 177, 178, 179, 210, 397, 504, 121, 394, 30, 31, + 32, 33, 34, 35, 36, 407, 204, 29, 119, 204, + 7, 8, 9, 10, 53, 12, 54, 244, 94, 55, + 349, 394, 20, 245, 21, 121, 43, 395, 39, 223, + 224, 204, 226, 227, 204, 204, 105, 106, 204, 204, + 204, 204, 204, 204, 237, 238, 239, 204, 276, 277, + 278, 487, 350, 171, 172, 121, 50, 274, 242, 243, + 497, 57, 325, 46, 47, 48, 428, 298, 108, 109, + 110, 51, 298, 298, 211, 212, 213, 214, 215, 216, + 217, 218, 63, 280, 298, 249, 250, -25, -25, 298, + -24, -24, -23, -23, 303, -22, -22, 251, 252, 61, + 298, 298, 298, 98, 99, 88, 101, 100, -66, 112, + 448, 113, 449, 323, -127, 114, 174, 120, 206, 170, + 175, 196, 197, 200, 88, 324, 204, -29, -28, -27, + -26, 370, 254, 372, 373, 374, 278, -32, -33, 5, + 255, 380, 284, 285, 304, 6, 306, 309, 310, 388, + 389, 390, 391, 392, 393, 7, 8, 9, 10, 11, + 12, 13, 398, 399, 400, 401, 298, 326, 311, 312, + 313, 314, 298, 343, 315, 316, 14, 317, 318, 322, + 327, 356, 384, 331, 332, 333, 298, 298, 334, 353, + 335, 300, 301, 336, 369, 204, 371, 204, 204, 204, + 375, 376, 351, 302, 344, 204, 359, 406, 308, 345, + 346, 347, 435, 354, 408, 360, 368, 365, 377, 319, + 320, 321, 378, 409, 379, 298, 383, 298, 412, 416, + 410, 298, 424, 426, 427, 430, 280, 453, 454, 455, + 298, 298, 298, 418, 419, 420, 431, 432, 204, 460, + 461, 462, 463, 433, 464, 465, 466, 467, 440, 434, + 436, 437, 438, 439, 219, 220, 425, 442, 447, 473, + 450, 298, 298, 452, 458, 468, 469, 470, 471, 298, + 363, 472, 219, 220, 476, 361, 474, 477, 298, 478, + 479, 367, 490, 204, 480, 481, 492, 486, 493, 494, + 482, 204, 204, 204, 483, 381, 382, 204, 484, 485, + 491, 499, 500, 459, 506, 298, 501, 502, 508, 503, + 507, 510, 511, 161, 162, 163, 96, 164, 56, 404, + 103, 403, 202, 204, 273, 111, 27, 64, 65, 45, + 429, 415, 456, 0, 411, 0, 413, 0, 0, 298, + 417, 0, 0, 0, 20, 0, 21, 0, 256, 421, + 422, 423, 298, 0, 0, 0, 0, 0, 0, 298, + 257, 258, 0, 298, 298, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 443, 444, 0, 0, 0, 0, 0, 0, 451, 0, + 0, 0, 0, 0, 0, 0, 0, 457, 0, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 0, 0, 0, 0, 0, 259, 0, + 260, 261, 153, 154, 475, 262, 263, 264, 0, 0, + 0, 0, 0, 0, 0, 265, 0, 0, 266, 0, + 267, 0, 0, 268, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 505, 0, 0, 0, 0, 0, 0, 509, 0, + 0, 0, 512, 513, 64, 65, 0, 115, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 20, 0, 21, 64, 65, 0, 115, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 78, + 79, 20, 0, 21, 0, 0, 0, 80, 0, 0, + 0, 0, -35, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 6, -35, -35, 0, 80, 286, 287, + 64, 65, 288, -35, -35, -35, -35, -35, -35, -35, + 0, 0, -35, 22, 0, 0, 0, 20, 0, 21, + 23, 289, 290, 291, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 292, 293, 0, 0, 0, 0, 81, + 0, 0, 82, 0, 0, 83, 0, 84, 116, 0, + 0, 0, 0, 0, 0, 0, 294, 0, 0, 81, + 0, 0, 82, 0, 0, 83, 0, 84, 341, 0, + 0, 0, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 0, 0, 0, 0, + 0, 259, 0, 260, 261, 153, 154, 0, 262, 263, + 264, 286, 287, 0, 0, 288, 0, 0, 0, 0, + 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 289, 290, 291, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 292, 293, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, + 0, 0, 0, 0, 259, 0, 260, 261, 153, 154, + 0, 262, 263, 264, 0, 0, 0, 0, 0, 0, + 0, 0, 64, 65, 295, 115, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 20, + 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 65, 80, 115, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 65, 80, 115, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 78, + 79, 20, 0, 21, 0, 0, 0, 81, 0, 0, + 82, 0, 0, 83, 0, 84, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 65, 80, 115, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 20, 0, 21, 0, 0, 0, 81, 0, + 0, 82, 0, 0, 83, 0, 84, 355, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 65, 80, 115, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 20, 0, 21, 0, 0, 0, 81, + 0, 0, 82, 0, 337, 83, 0, 84, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 65, 80, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 20, 0, 21, 0, 0, 0, + 81, 0, 0, 82, 0, 0, 83, 0, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, + 80, 115, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 20, 0, 21, 0, 0, + 0, 81, 0, 0, 82, 0, 0, 83, 0, 84, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, + 65, 80, 115, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 78, 79, 20, 0, 21, 0, + 0, 0, 81, 0, 0, 82, 0, 0, 83, 0, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 65, 80, 207, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 20, 0, 21, + 0, 0, 0, 81, 0, 0, 82, 0, 0, 83, + 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 0, 82, 0, 0, + 83, 0, 84, 0, 0, 0, 0, 0, 122, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 124, 125, 0, 81, 0, 0, 82, 0, + 0, 83, 0, 84, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160 +}; -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc -#endif +static const short int yycheck[] = +{ + 37, 128, 128, 224, 52, 3, 247, 248, 110, 29, + 23, 15, 129, 109, 109, 52, 84, 30, 15, 266, + 267, 117, 123, 34, 119, 126, 10, 11, 12, 13, + 14, 15, 16, 17, 275, 10, 11, 12, 13, 14, + 15, 16, 17, 41, 471, 0, 57, 148, 295, 166, + 151, 152, 120, 57, 155, 156, 157, 158, 159, 160, + 57, 9, 489, 164, 109, 488, 45, 111, 47, 20, + 107, 108, 109, 21, 119, 498, 120, 109, 64, 65, + 66, 67, 68, 69, 70, 117, 123, 61, 86, 126, + 41, 42, 43, 44, 45, 46, 47, 109, 118, 50, + 115, 109, 22, 115, 24, 120, 119, 115, 23, 146, + 147, 148, 149, 150, 151, 152, 32, 33, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 196, 197, + 198, 115, 117, 55, 56, 120, 108, 194, 94, 95, + 115, 108, 243, 52, 53, 54, 387, 204, 54, 55, + 56, 61, 209, 210, 10, 11, 12, 13, 14, 15, + 16, 17, 4, 200, 221, 27, 28, 3, 4, 226, + 3, 4, 3, 4, 222, 3, 4, 3, 4, 24, + 237, 238, 239, 108, 108, 222, 113, 108, 111, 4, + 411, 4, 413, 241, 0, 4, 4, 111, 59, 24, + 24, 114, 114, 111, 241, 242, 243, 4, 4, 4, + 4, 312, 4, 314, 315, 316, 284, 7, 7, 25, + 7, 322, 109, 112, 109, 31, 109, 113, 109, 331, + 332, 333, 334, 335, 336, 41, 42, 43, 44, 45, + 46, 47, 344, 345, 346, 347, 303, 24, 36, 109, + 109, 109, 309, 24, 109, 109, 62, 109, 109, 109, + 109, 63, 34, 111, 111, 111, 323, 324, 111, 109, + 111, 209, 210, 111, 311, 312, 313, 314, 315, 316, + 317, 318, 280, 221, 111, 322, 109, 24, 226, 111, + 111, 111, 394, 112, 21, 109, 113, 109, 109, 237, + 238, 239, 109, 21, 109, 362, 109, 364, 4, 109, + 111, 368, 111, 24, 4, 36, 353, 418, 419, 420, + 377, 378, 379, 109, 109, 109, 109, 109, 365, 431, + 432, 433, 434, 109, 436, 437, 438, 439, 57, 109, + 109, 109, 109, 109, 471, 471, 383, 109, 109, 450, + 109, 408, 409, 109, 112, 4, 24, 109, 113, 416, + 57, 112, 489, 489, 112, 303, 115, 112, 425, 109, + 112, 309, 36, 410, 109, 109, 478, 21, 480, 481, + 112, 418, 419, 420, 112, 323, 324, 424, 112, 112, + 115, 21, 112, 430, 21, 452, 112, 112, 75, 109, + 109, 21, 21, 96, 96, 96, 41, 96, 25, 354, + 51, 353, 120, 450, 194, 60, 3, 5, 6, 19, + 388, 365, 424, -1, 362, -1, 364, -1, -1, 486, + 368, -1, -1, -1, 22, -1, 24, -1, 26, 377, + 378, 379, 499, -1, -1, -1, -1, -1, -1, 506, + 38, 39, -1, 510, 511, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 408, 409, -1, -1, -1, -1, -1, -1, 416, -1, + -1, -1, -1, -1, -1, -1, -1, 425, -1, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, -1, -1, -1, -1, -1, 96, -1, + 98, 99, 100, 101, 452, 103, 104, 105, -1, -1, + -1, -1, -1, -1, -1, 113, -1, -1, 116, -1, + 118, -1, -1, 121, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 486, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 499, -1, -1, -1, -1, -1, -1, 506, -1, + -1, -1, 510, 511, 5, 6, -1, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, 5, 6, -1, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, 48, -1, -1, + -1, -1, 20, -1, 22, -1, 24, -1, -1, -1, + -1, -1, -1, 31, 32, 33, -1, 48, 3, 4, + 5, 6, 7, 41, 42, 43, 44, 45, 46, 47, + -1, -1, 50, 51, -1, -1, -1, 22, -1, 24, + 58, 26, 27, 28, 62, -1, -1, -1, -1, -1, + -1, -1, -1, 38, 39, -1, -1, -1, -1, 110, + -1, -1, 113, -1, -1, 116, -1, 118, 119, -1, + -1, -1, -1, -1, -1, -1, 61, -1, -1, 110, + -1, -1, 113, -1, -1, 116, -1, 118, 119, -1, + -1, -1, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + -1, 96, -1, 98, 99, 100, 101, -1, 103, 104, + 105, 3, 4, -1, -1, 7, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 26, 27, 28, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 38, 39, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, + -1, -1, -1, -1, 96, -1, 98, 99, 100, 101, + -1, 103, 104, 105, -1, -1, -1, -1, -1, -1, + -1, -1, 5, 6, 116, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, -1, 5, 6, 48, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, + -1, -1, -1, -1, 5, 6, 48, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, 110, -1, -1, + 113, -1, -1, 116, -1, 118, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5, 6, 48, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, -1, 24, -1, -1, -1, 110, -1, + -1, 113, -1, -1, 116, -1, 118, 37, -1, -1, + -1, -1, -1, -1, -1, -1, 5, 6, 48, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, 110, + -1, -1, 113, -1, 115, 116, -1, 118, 37, -1, + -1, -1, -1, -1, -1, -1, -1, 5, 6, 48, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + 110, -1, -1, 113, -1, -1, 116, -1, 118, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, + 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + -1, 110, -1, -1, 113, -1, -1, 116, -1, 118, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, + 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, + -1, -1, 110, -1, -1, 113, -1, -1, 116, -1, + 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5, 6, 48, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, + -1, -1, -1, 110, -1, -1, 113, -1, -1, 116, + -1, 118, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 110, -1, -1, 113, -1, -1, + 116, -1, 118, -1, -1, -1, -1, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 59, 60, -1, 110, -1, -1, 113, -1, + -1, 116, -1, 118, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, -1, -1, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107 +}; -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 153, 154, 155, 0, 25, 31, 41, 42, 43, + 44, 45, 46, 47, 62, 134, 172, 174, 176, 183, + 22, 24, 51, 58, 62, 133, 165, 176, 177, 61, + 64, 65, 66, 67, 68, 69, 70, 135, 170, 23, + 184, 185, 30, 119, 173, 184, 52, 53, 54, 162, + 108, 61, 20, 45, 47, 50, 134, 108, 45, 47, + 175, 24, 160, 4, 5, 6, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 48, 110, 113, 116, 118, 123, 142, 143, 144, 145, + 146, 165, 180, 29, 118, 171, 133, 188, 108, 108, + 108, 113, 163, 160, 142, 32, 33, 152, 152, 152, + 152, 170, 4, 4, 4, 8, 119, 146, 147, 165, + 111, 120, 35, 49, 59, 60, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 125, 126, 127, 128, 186, 192, 193, 195, 196, + 24, 55, 56, 161, 4, 24, 164, 144, 144, 144, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 129, 130, 132, 144, 149, 114, 114, 109, 119, + 111, 37, 147, 148, 144, 182, 59, 8, 182, 9, + 21, 10, 11, 12, 13, 14, 15, 16, 17, 129, + 130, 131, 135, 144, 144, 182, 144, 144, 189, 182, + 182, 182, 182, 182, 182, 182, 182, 144, 144, 144, + 182, 135, 94, 95, 109, 115, 158, 159, 157, 27, + 28, 3, 4, 124, 4, 7, 26, 38, 39, 96, + 98, 99, 103, 104, 105, 113, 116, 118, 121, 125, + 126, 127, 128, 150, 180, 156, 146, 146, 146, 37, + 144, 167, 168, 169, 109, 112, 3, 4, 7, 26, + 27, 28, 38, 39, 61, 116, 150, 179, 180, 181, + 181, 181, 181, 142, 109, 137, 109, 137, 181, 113, + 109, 36, 109, 109, 109, 109, 109, 109, 109, 181, + 181, 181, 109, 142, 144, 182, 24, 109, 140, 140, + 140, 111, 111, 111, 111, 111, 111, 115, 149, 151, + 151, 119, 151, 24, 111, 111, 111, 111, 140, 115, + 117, 165, 166, 109, 112, 37, 63, 178, 151, 109, + 109, 181, 15, 57, 15, 109, 194, 181, 113, 144, + 182, 144, 182, 182, 182, 144, 144, 109, 109, 109, + 182, 181, 181, 109, 34, 57, 138, 141, 149, 149, + 149, 149, 149, 149, 109, 115, 117, 119, 149, 149, + 149, 149, 37, 167, 138, 139, 24, 117, 21, 21, + 111, 181, 4, 181, 182, 190, 109, 181, 109, 109, + 109, 181, 181, 181, 111, 144, 24, 4, 140, 194, + 36, 109, 109, 109, 109, 149, 109, 109, 109, 109, + 57, 136, 109, 181, 181, 190, 191, 109, 137, 137, + 109, 181, 109, 182, 182, 182, 191, 181, 112, 144, + 149, 149, 149, 149, 149, 149, 149, 149, 4, 24, + 109, 113, 112, 182, 115, 181, 112, 112, 109, 112, + 109, 109, 112, 112, 112, 112, 21, 115, 131, 187, + 36, 115, 149, 149, 149, 181, 179, 115, 131, 21, + 112, 112, 112, 109, 179, 181, 21, 109, 75, 181, + 21, 21, 181, 181 +}; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 +#define YYEMPTY (-2) #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ while (0) + #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) #endif -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif #endif -#else /* not YYLSP_NEEDED */ + + +/* YYLEX -- calling `yylex' with the right arguments. */ + #ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) +# define YYLEX yylex (YYLEX_PARAM) #else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ +# define YYLEX yylex () #endif -/* If nonreentrant, generate the variables here */ +/* Enable debugging if requested. */ +#if YYDEBUG -#ifndef YYPURE +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; #endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; #endif +{ + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif + -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif { - register char *f = from; - register char *t = to; - register int i = count; + const char *yys = yystr; - while (i-- > 0) - *t++ = *f++; + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; } +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + char *yyd = yydest; + const char *yys = yysrc; -#else /* __cplusplus */ + while ((*yyd++ = *yys++) != '\0') + continue; -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) { - register char *t = to; - register char *f = from; - register int i = count; + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); - while (i-- > 0) - *t++ = *f++; + return yystpcpy (yyres, yystr) - yyres; } +# endif + +#endif /* YYERROR_VERBOSE */ + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; #endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; #endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} -#line 217 "/usr/share/bison.simple" -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ +/* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ #ifdef YYPARSE_PARAM -int yyparse (void *); +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) #else -int yyparse (void); +int +yyparse () + #endif #endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL { - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -2111,740 +2764,747 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) + if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - if (yyssp >= yyss + yystacksize - 1) + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ +/* Read a look-ahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to lookahead token. */ + /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ + /* Not known => get a look-ahead token if don't already have one. */ + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ + if (yychar <= YYEOF) { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; + -/* Do a reduction. yyn is the number of a rule to reduce with. */ +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; - switch (yyn) { -case 2: -#line 1089 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 1097 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX) // Outside of my range! GEN_ERROR("Value too large for type!"); - yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; + (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal); CHECK_FOR_ERROR -; - break;} -case 4: -#line 1098 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! +;} + break; + + case 5: +#line 1106 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX) // Outside of my range! GEN_ERROR("Value too large for type!"); - yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; + (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val); CHECK_FOR_ERROR -; - break;} -case 33: -#line 1122 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = yyvsp[-1].StrVal; +;} + break; + + case 34: +#line 1130 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = (yyvsp[-1].StrVal); CHECK_FOR_ERROR - ; - break;} -case 34: -#line 1126 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.StrVal = 0; + ;} + break; + + case 35: +#line 1134 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = 0; CHECK_FOR_ERROR - ; - break;} -case 35: -#line 1131 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::InternalLinkage; ; - break;} -case 36: -#line 1132 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; - break;} -case 37: -#line 1133 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::WeakLinkage; ; - break;} -case 38: -#line 1134 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::AppendingLinkage; ; - break;} -case 39: -#line 1135 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLImportLinkage; ; - break;} -case 40: -#line 1136 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::DLLExportLinkage; ; - break;} -case 41: -#line 1137 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ; - break;} -case 42: -#line 1138 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 43: -#line 1140 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 44: -#line 1141 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 45: -#line 1142 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::CSRet; ; - break;} -case 46: -#line 1143 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Fast; ; - break;} -case 47: -#line 1144 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Cold; ; - break;} -case 48: -#line 1145 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::X86_StdCall; ; - break;} -case 49: -#line 1146 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::X86_FastCall; ; - break;} -case 50: -#line 1147 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) + ;} + break; + + case 36: +#line 1139 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} + break; + + case 37: +#line 1140 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} + break; + + case 38: +#line 1141 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} + break; + + case 39: +#line 1142 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} + break; + + case 40: +#line 1143 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} + break; + + case 41: +#line 1144 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} + break; + + case 42: +#line 1145 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} + break; + + case 43: +#line 1146 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} + break; + + case 44: +#line 1148 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} + break; + + case 45: +#line 1149 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} + break; + + case 46: +#line 1150 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::CSRet; ;} + break; + + case 47: +#line 1151 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Fast; ;} + break; + + case 48: +#line 1152 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Cold; ;} + break; + + case 49: +#line 1153 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_StdCall; ;} + break; + + case 50: +#line 1154 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_FastCall; ;} + break; + + case 51: +#line 1155 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) GEN_ERROR("Calling conv too large!"); - yyval.UIntVal = yyvsp[0].UInt64Val; + (yyval.UIntVal) = (yyvsp[0].UInt64Val); CHECK_FOR_ERROR - ; - break;} -case 51: -#line 1156 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 52: -#line 1157 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + ;} + break; + + case 52: +#line 1164 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} + break; + + case 53: +#line 1165 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR -; - break;} -case 53: -#line 1163 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 54: -#line 1164 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) +;} + break; + + case 54: +#line 1171 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} + break; + + case 55: +#line 1172 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR -; - break;} -case 55: -#line 1172 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) - if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') +;} + break; + + case 56: +#line 1180 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) + if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') GEN_ERROR("Invalid character in section name!"); - yyval.StrVal = yyvsp[0].StrVal; + (yyval.StrVal) = (yyvsp[0].StrVal); CHECK_FOR_ERROR -; - break;} -case 56: -#line 1180 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 57: -#line 1181 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = yyvsp[0].StrVal; ; - break;} -case 58: -#line 1186 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 59: -#line 1187 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 60: -#line 1188 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurGV->setSection(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); +;} + break; + + case 57: +#line 1188 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} + break; + + case 58: +#line 1189 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = (yyvsp[0].StrVal); ;} + break; + + case 59: +#line 1194 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 60: +#line 1195 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 61: +#line 1196 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurGV->setSection((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 61: -#line 1193 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) + ;} + break; + + case 62: +#line 1201 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) GEN_ERROR("Alignment must be a power of two!"); - CurGV->setAlignment(yyvsp[0].UInt64Val); + CurGV->setAlignment((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 63: -#line 1207 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 65: -#line 1208 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 66: -#line 1210 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 64: +#line 1215 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} + break; + + case 66: +#line 1216 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} + break; + + case 67: +#line 1218 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - yyval.TypeVal = yyvsp[0].TypeVal; + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + (yyval.TypeVal) = (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 80: -#line 1222 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeVal = new PATypeHolder(OpaqueType::get()); + ;} + break; + + case 81: +#line 1230 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeVal) = new PATypeHolder(OpaqueType::get()); CHECK_FOR_ERROR - ; - break;} -case 81: -#line 1226 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); + ;} + break; + + case 82: +#line 1234 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); CHECK_FOR_ERROR - ; - break;} -case 82: -#line 1230 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Named types are also simple types... - const Type* tmp = getTypeVal(yyvsp[0].ValIDVal); + ;} + break; + + case 83: +#line 1238 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Named types are also simple types... + const Type* tmp = getTypeVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.TypeVal = new PATypeHolder(tmp); -; - break;} -case 83: -#line 1238 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Type UpReference - if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + (yyval.TypeVal) = new PATypeHolder(tmp); +;} + break; + + case 84: +#line 1246 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Type UpReference + if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder - UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... - yyval.TypeVal = new PATypeHolder(OT); + UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector... + (yyval.TypeVal) = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); CHECK_FOR_ERROR - ; - break;} -case 84: -#line 1246 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Function derived type? + ;} + break; + + case 85: +#line 1254 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Function derived type? std::vector Params; - for (std::list::iterator I = yyvsp[-1].TypeList->begin(), - E = yyvsp[-1].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), + E = (yyvsp[-1].TypeList)->end(); I != E; ++I) Params.push_back(*I); bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); - delete yyvsp[-1].TypeList; // Delete the argument list - delete yyvsp[-3].TypeVal; // Delete the return type handle - CHECK_FOR_ERROR - ; - break;} -case 85: -#line 1259 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Sized array type? - yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 86: -#line 1264 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Packed array type? - const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); - if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FunctionType::get(*(yyvsp[-3].TypeVal),Params,isVarArg))); + delete (yyvsp[-1].TypeList); // Delete the argument list + delete (yyvsp[-3].TypeVal); // Delete the return type handle + CHECK_FOR_ERROR + ;} + break; + + case 86: +#line 1267 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Sized array type? + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 87: +#line 1272 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Packed array type? + const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get(); + if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) GEN_ERROR("Unsigned result not equal to signed result"); if (!ElemTy->isPrimitiveType()) GEN_ERROR("Elemental type of a PackedType must be primitive"); - if (!isPowerOf2_32(yyvsp[-3].UInt64Val)) + if (!isPowerOf2_32((yyvsp[-3].UInt64Val))) GEN_ERROR("Vector length should be a power of 2!"); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 87: -#line 1276 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Structure type? + ;} + break; + + case 88: +#line 1284 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Structure type? std::vector Elements; - for (std::list::iterator I = yyvsp[-1].TypeList->begin(), - E = yyvsp[-1].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), + E = (yyvsp[-1].TypeList)->end(); I != E; ++I) Elements.push_back(*I); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); - delete yyvsp[-1].TypeList; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + delete (yyvsp[-1].TypeList); CHECK_FOR_ERROR - ; - break;} -case 88: -#line 1286 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Empty structure type? - yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); - CHECK_FOR_ERROR - ; - break;} -case 89: -#line 1290 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Pointer type? - yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 90: -#line 1299 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeList = new std::list(); - yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 89: +#line 1294 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? + (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector())); CHECK_FOR_ERROR - ; - break;} -case 91: -#line 1304 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 90: +#line 1298 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Pointer type? + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 93: -#line 1311 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); + ;} + break; + + case 91: +#line 1307 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList) = new std::list(); + (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 94: -#line 1315 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.TypeList = new std::list())->push_back(Type::VoidTy); + ;} + break; + + case 92: +#line 1312 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 95: -#line 1319 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TypeList = new std::list(); + ;} + break; + + case 94: +#line 1319 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(Type::VoidTy); CHECK_FOR_ERROR - ; - break;} -case 96: -#line 1330 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr - const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); + ;} + break; + + case 95: +#line 1323 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.TypeList) = new std::list())->push_back(Type::VoidTy); + CHECK_FOR_ERROR + ;} + break; + + case 96: +#line 1327 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList) = new std::list(); + CHECK_FOR_ERROR + ;} + break; + + case 97: +#line 1338 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr + const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 97: -#line 1356 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + ;} + break; + + case 98: +#line 1364 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +"!"); - yyval.ConstVal = ConstantArray::get(ATy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantArray::get(ATy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 98: -#line 1370 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + ;} + break; + + case 99: +#line 1378 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); - char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); - if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal)) + char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); + if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal))) GEN_ERROR("Can't build string constant of size " + - itostr((int)(EndStr-yyvsp[0].StrVal)) + + itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " + itostr(NumElements) + "!"); std::vector Vals; if (ETy == Type::SByteTy) { - for (signed char *C = (signed char *)yyvsp[0].StrVal; C != (signed char *)EndStr; ++C) + for (signed char *C = (signed char *)(yyvsp[0].StrVal); C != (signed char *)EndStr; ++C) Vals.push_back(ConstantSInt::get(ETy, *C)); } else if (ETy == Type::UByteTy) { - for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; + for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); C != (unsigned char*)EndStr; ++C) Vals.push_back(ConstantUInt::get(ETy, *C)); } else { - free(yyvsp[0].StrVal); + free((yyvsp[0].StrVal)); GEN_ERROR("Cannot build string arrays of non byte sized elements!"); } - free(yyvsp[0].StrVal); - yyval.ConstVal = ConstantArray::get(ATy, Vals); - delete yyvsp[-2].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 99: -#line 1400 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr - const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); + free((yyvsp[0].StrVal)); + (yyval.ConstVal) = ConstantArray::get(ATy, Vals); + delete (yyvsp[-2].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 100: +#line 1408 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr + const PackedType *PTy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantPacked::get(PTy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 100: -#line 1426 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); + ;} + break; + + case 101: +#line 1434 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); - if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes()) + if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes()) GEN_ERROR("Illegal number of initializers for structure type!"); // Check to ensure that constants are compatible with the type initializer! - for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) - if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i)) + for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) + if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i)) GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + " of structure initializer!"); - yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 101: -#line 1447 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); + ;} + break; + + case 102: +#line 1455 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); if (STy->getNumContainedTypes() != 0) GEN_ERROR("Illegal number of initializers for structure type!"); - yyval.ConstVal = ConstantStruct::get(STy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantStruct::get(STy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 102: -#line 1460 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); + ;} + break; + + case 103: +#line 1468 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*yyvsp[-1].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-1].TypeVal))->getDescription() + "'!"); - yyval.ConstVal = ConstantPointerNull::get(PTy); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = ConstantPointerNull::get(PTy); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 103: -#line 1470 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); - delete yyvsp[-1].TypeVal; + ;} + break; + + case 104: +#line 1478 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get()); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 104: -#line 1475 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); + ;} + break; + + case 105: +#line 1483 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal)->get()); if (Ty == 0) GEN_ERROR("Global const reference must be a pointer type!"); @@ -2858,7 +3518,7 @@ Function *SavedCurFn = CurFun.CurrentFunction; CurFun.CurrentFunction = 0; - Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal); + Value *V = getValNonImprovising(Ty, (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR CurFun.CurrentFunction = SavedCurFn; @@ -2873,14 +3533,14 @@ // First check to see if the forward references value is already created! PerModuleInfo::GlobalRefsType::iterator I = - CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal)); + CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal))); if (I != CurModule.GlobalRefs.end()) { V = I->second; // Placeholder already exists, use it... - yyvsp[0].ValIDVal.destroy(); + (yyvsp[0].ValIDVal).destroy(); } else { std::string Name; - if (yyvsp[0].ValIDVal.Type == ValID::NameVal) Name = yyvsp[0].ValIDVal.Name; + if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name; // Create the forward referenced global. GlobalValue *GV; @@ -2895,149 +3555,160 @@ } // Keep track of the fact that we have a forward ref to recycle it - CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV)); + CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV)); V = GV; } } - yyval.ConstVal = cast(V); - delete yyvsp[-1].TypeVal; // Free the type handle + (yyval.ConstVal) = cast(V); + delete (yyvsp[-1].TypeVal); // Free the type handle CHECK_FOR_ERROR - ; - break;} -case 105: -#line 1536 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) + ;} + break; + + case 106: +#line 1544 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType()) GEN_ERROR("Mismatched types for constant expression!"); - yyval.ConstVal = yyvsp[0].ConstVal; - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = (yyvsp[0].ConstVal); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 106: -#line 1543 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const Type *Ty = yyvsp[-1].TypeVal->get(); + ;} + break; + + case 107: +#line 1551 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const Type *Ty = (yyvsp[-1].TypeVal)->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) GEN_ERROR("Cannot create a null initialized value of this type!"); - yyval.ConstVal = Constant::getNullValue(Ty); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = Constant::getNullValue(Ty); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 107: -#line 1552 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants - if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) + ;} + break; + + case 108: +#line 1560 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantSInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) GEN_ERROR("Constant value doesn't fit in type!"); - yyval.ConstVal = ConstantSInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); + (yyval.ConstVal) = ConstantSInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 108: -#line 1558 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants - if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) + ;} + break; + + case 109: +#line 1566 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantUInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) GEN_ERROR("Constant value doesn't fit in type!"); - yyval.ConstVal = ConstantUInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); + (yyval.ConstVal) = ConstantUInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)); + CHECK_FOR_ERROR + ;} + break; + + case 110: +#line 1572 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + (yyval.ConstVal) = ConstantBool::getTrue(); CHECK_FOR_ERROR - ; - break;} -case 109: -#line 1564 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants - yyval.ConstVal = ConstantBool::getTrue(); - CHECK_FOR_ERROR - ; - break;} -case 110: -#line 1568 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants - yyval.ConstVal = ConstantBool::getFalse(); - CHECK_FOR_ERROR - ; - break;} -case 111: -#line 1572 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Float & Double constants - if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) + ;} + break; + + case 111: +#line 1576 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + (yyval.ConstVal) = ConstantBool::getFalse(); + CHECK_FOR_ERROR + ;} + break; + + case 112: +#line 1580 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Float & Double constants + if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) GEN_ERROR("Floating point constant invalid for type!!"); - yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); + (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal)); CHECK_FOR_ERROR - ; - break;} -case 112: -#line 1580 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) + ;} + break; + + case 113: +#line 1588 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(yyvsp[-3].ConstVal)->getType()->isFirstClassType()) GEN_ERROR("cast constant expression from a non-primitive type: '" + - yyvsp[-3].ConstVal->getType()->getDescription() + "'!"); - if (!yyvsp[-1].TypeVal->get()->isFirstClassType()) + (yyvsp[-3].ConstVal)->getType()->getDescription() + "'!"); + if (!(yyvsp[-1].TypeVal)->get()->isFirstClassType()) GEN_ERROR("cast constant expression to a non-primitive type: '" + - yyvsp[-1].TypeVal->get()->getDescription() + "'!"); - yyval.ConstVal = ConstantExpr::getCast(yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); - delete yyvsp[-1].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 113: -#line 1591 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[-2].ConstVal->getType())) + (yyvsp[-1].TypeVal)->get()->getDescription() + "'!"); + (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-3].ConstVal), (yyvsp[-1].TypeVal)->get()); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 114: +#line 1599 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[-2].ConstVal)->getType())) GEN_ERROR("GetElementPtr requires a pointer operand!"); // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct // indices to uint struct indices for compatibility. generic_gep_type_iterator::iterator> - GTI = gep_type_begin(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()), - GTE = gep_type_end(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()); - for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) + GTI = gep_type_begin((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end()), + GTE = gep_type_end((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end()); + for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI) if (isa(*GTI)) // Only change struct indices - if (ConstantUInt *CUI = dyn_cast((*yyvsp[-1].ValueList)[i])) + if (ConstantUInt *CUI = dyn_cast((*(yyvsp[-1].ValueList))[i])) if (CUI->getType() == Type::UByteTy) - (*yyvsp[-1].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + (*(yyvsp[-1].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy); const Type *IdxTy = - GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), *yyvsp[-1].ValueList, true); + GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true); if (!IdxTy) GEN_ERROR("Index list invalid for constant getelementptr!"); std::vector IdxVec; - for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i) - if (Constant *C = dyn_cast((*yyvsp[-1].ValueList)[i])) + for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i) + if (Constant *C = dyn_cast((*(yyvsp[-1].ValueList))[i])) IdxVec.push_back(C); else GEN_ERROR("Indices to constant getelementptr must be constants!"); - delete yyvsp[-1].ValueList; + delete (yyvsp[-1].ValueList); - yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); + (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), IdxVec); CHECK_FOR_ERROR - ; - break;} -case 114: -#line 1623 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) + ;} + break; + + case 115: +#line 1631 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-5].ConstVal)->getType() != Type::BoolTy) GEN_ERROR("Select condition must be of boolean type!"); - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Select operand types must match!"); - yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 115: -#line 1631 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ;} + break; + + case 116: +#line 1639 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Binary operator types must match!"); // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. // To retain backward compatibility with these early compilers, we emit a // cast to the appropriate integer type automatically if we are in the // broken case. See PR424 for more information. - if (!isa(yyvsp[-3].ConstVal->getType())) { - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + if (!isa((yyvsp[-3].ConstVal)->getType())) { + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); } else { const Type *IntPtrTy = 0; switch (CurModule.CurrentModule->getPointerSize()) { @@ -3045,138 +3716,154 @@ case Module::Pointer64: IntPtrTy = Type::LongTy; break; default: GEN_ERROR("invalid pointer binary constant expr!"); } - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, ConstantExpr::getCast(yyvsp[-3].ConstVal, IntPtrTy), - ConstantExpr::getCast(yyvsp[-1].ConstVal, IntPtrTy)); - yyval.ConstVal = ConstantExpr::getCast(yyval.ConstVal, yyvsp[-3].ConstVal->getType()); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), ConstantExpr::getCast((yyvsp[-3].ConstVal), IntPtrTy), + ConstantExpr::getCast((yyvsp[-1].ConstVal), IntPtrTy)); + (yyval.ConstVal) = ConstantExpr::getCast((yyval.ConstVal), (yyvsp[-3].ConstVal)->getType()); } CHECK_FOR_ERROR - ; - break;} -case 116: -#line 1653 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ;} + break; + + case 117: +#line 1661 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Logical operator types must match!"); - if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { - if (!isa(yyvsp[-3].ConstVal->getType()) || - !cast(yyvsp[-3].ConstVal->getType())->getElementType()->isIntegral()) + if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) { + if (!isa((yyvsp[-3].ConstVal)->getType()) || + !cast((yyvsp[-3].ConstVal)->getType())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 117: -#line 1664 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ;} + break; + + case 118: +#line 1672 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("setcc operand types must match!"); - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 118: -#line 1670 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) + ;} + break; + + case 119: +#line 1678 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-1].ConstVal)->getType() != Type::UByteTy) GEN_ERROR("Shift count for shift constant must be unsigned byte!"); - if (!yyvsp[-3].ConstVal->getType()->isInteger()) + if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 119: -#line 1678 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + ;} + break; + + case 120: +#line 1686 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid extractelement operands!"); - yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 120: -#line 1684 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + ;} + break; + + case 121: +#line 1692 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid insertelement operands!"); - yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 121: -#line 1690 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + ;} + break; + + case 122: +#line 1698 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid shufflevector operands!"); - yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 122: -#line 1699 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 123: +#line 1707 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 123: -#line 1703 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ConstVector = new std::vector(); - yyval.ConstVector->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 124: +#line 1711 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ConstVector) = new std::vector(); + (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 124: -#line 1711 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = false; ; - break;} -case 125: -#line 1711 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = true; ; - break;} -case 126: -#line 1721 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; + ;} + break; + + case 125: +#line 1719 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = false; ;} + break; + + case 126: +#line 1719 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = true; ;} + break; + + case 127: +#line 1729 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal); CurModule.ModuleDone(); - CHECK_FOR_ERROR -; - break;} -case 127: -#line 1729 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = yyvsp[-1].ModuleVal; + CHECK_FOR_ERROR; +;} + break; + + case 128: +#line 1737 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); CHECK_FOR_ERROR - ; - break;} -case 128: -#line 1734 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = yyvsp[-1].ModuleVal; + ;} + break; + + case 129: +#line 1742 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CHECK_FOR_ERROR - ; - break;} -case 129: -#line 1738 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = yyvsp[-3].ModuleVal; + ;} + break; + + case 130: +#line 1746 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); CHECK_FOR_ERROR - ; - break;} -case 130: -#line 1742 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = yyvsp[-1].ModuleVal; + ;} + break; + + case 131: +#line 1750 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CHECK_FOR_ERROR - ; - break;} -case 131: -#line 1746 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ModuleVal = CurModule.CurrentModule; + ;} + break; + + case 132: +#line 1754 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ModuleVal) = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { const ValID &DID = CurModule.LateResolveTypes.begin()->first; @@ -3187,11 +3874,12 @@ } } CHECK_FOR_ERROR - ; - break;} -case 132: -#line 1761 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 133: +#line 1769 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: // @@ -3201,266 +3889,297 @@ // If types are not resolved eagerly, then the two types will not be // determined to be the same type! // - ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal); + ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal)); - if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { + if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) { CHECK_FOR_ERROR // If this is a named type that is not a redefinition, add it to the slot // table. - CurModule.Types.push_back(*yyvsp[0].TypeVal); + CurModule.Types.push_back(*(yyvsp[0].TypeVal)); } - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 133: -#line 1783 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Function prototypes can be in const pool - CHECK_FOR_ERROR - ; - break;} -case 134: -#line 1786 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Asm blocks can be in the const pool - CHECK_FOR_ERROR - ; - break;} -case 135: -#line 1789 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].ConstVal == 0) + ;} + break; + + case 134: +#line 1791 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Function prototypes can be in const pool + CHECK_FOR_ERROR + ;} + break; + + case 135: +#line 1794 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Asm blocks can be in the const pool + CHECK_FOR_ERROR + ;} + break; + + case 136: +#line 1797 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].ConstVal) == 0) GEN_ERROR("Global value initializer is not a constant!"); - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 136: -#line 1794 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 137: +#line 1802 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 137: -#line 1797 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + ;} + break; + + case 138: +#line 1805 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; - ; - break;} -case 138: -#line 1801 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[0].TypeVal); + ;} + break; + + case 139: +#line 1809 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; CHECK_FOR_ERROR - ; - break;} -case 139: -#line 1805 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::DLLImportLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + ;} + break; + + case 140: +#line 1813 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; - ; - break;} -case 140: -#line 1809 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[0].TypeVal); + ;} + break; + + case 141: +#line 1817 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; CHECK_FOR_ERROR - ; - break;} -case 141: -#line 1813 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 142: +#line 1821 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurGV = - ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalWeakLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; - ; - break;} -case 142: -#line 1818 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[0].TypeVal); + ;} + break; + + case 143: +#line 1826 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; CHECK_FOR_ERROR - ; - break;} -case 143: -#line 1822 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CHECK_FOR_ERROR - ; - break;} -case 144: -#line 1825 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 144: +#line 1830 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 145: -#line 1828 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 146: -#line 1832 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 145: +#line 1833 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CHECK_FOR_ERROR + ;} + break; + + case 146: +#line 1836 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 147: +#line 1840 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm(); - char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); - std::string NewAsm(yyvsp[0].StrVal, EndStr); - free(yyvsp[0].StrVal); + char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); + std::string NewAsm((yyvsp[0].StrVal), EndStr); + free((yyvsp[0].StrVal)); if (AsmSoFar.empty()) CurModule.CurrentModule->setModuleInlineAsm(NewAsm); else CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm); CHECK_FOR_ERROR -; - break;} -case 147: -#line 1845 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::BigEndian; ; - break;} -case 148: -#line 1846 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::LittleEndian; ; - break;} -case 149: -#line 1848 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); +;} + break; + + case 148: +#line 1853 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Endianness) = Module::BigEndian; ;} + break; + + case 149: +#line 1854 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.Endianness) = Module::LittleEndian; ;} + break; + + case 150: +#line 1856 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setEndianness((yyvsp[0].Endianness)); CHECK_FOR_ERROR - ; - break;} -case 150: -#line 1852 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].UInt64Val == 32) + ;} + break; + + case 151: +#line 1860 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].UInt64Val) == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); - else if (yyvsp[0].UInt64Val == 64) + else if ((yyvsp[0].UInt64Val) == 64) CurModule.CurrentModule->setPointerSize(Module::Pointer64); else - GEN_ERROR("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); + GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'!"); CHECK_FOR_ERROR - ; - break;} -case 151: -#line 1861 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + ;} + break; + + case 152: +#line 1869 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 153: -#line 1869 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + ;} + break; + + case 154: +#line 1877 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 154: -#line 1874 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + ;} + break; + + case 155: +#line 1882 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 155: -#line 1879 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 156: +#line 1887 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CHECK_FOR_ERROR - ; - break;} -case 159: -#line 1889 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 160: -#line 1891 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (*yyvsp[-1].TypeVal == Type::VoidTy) + ;} + break; + + case 160: +#line 1897 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} + break; + + case 161: +#line 1899 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (*(yyvsp[-1].TypeVal) == Type::VoidTy) GEN_ERROR("void typed arguments are invalid!"); - yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); + (yyval.ArgVal) = new std::pair((yyvsp[-1].TypeVal), (yyvsp[0].StrVal)); CHECK_FOR_ERROR -; - break;} -case 161: -#line 1898 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = yyvsp[-2].ArgList; - yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); - delete yyvsp[0].ArgVal; - CHECK_FOR_ERROR - ; - break;} -case 162: -#line 1904 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = new std::vector >(); - yyval.ArgList->push_back(*yyvsp[0].ArgVal); - delete yyvsp[0].ArgVal; - CHECK_FOR_ERROR - ; - break;} -case 163: -#line 1911 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = yyvsp[0].ArgList; +;} + break; + + case 162: +#line 1906 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = (yyvsp[-2].ArgList); + (yyvsp[-2].ArgList)->push_back(*(yyvsp[0].ArgVal)); + delete (yyvsp[0].ArgVal); CHECK_FOR_ERROR - ; - break;} -case 164: -#line 1915 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = yyvsp[-2].ArgList; - yyval.ArgList->push_back(std::pair >(); + (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); + delete (yyvsp[0].ArgVal); + CHECK_FOR_ERROR + ;} + break; + + case 164: +#line 1919 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = (yyvsp[0].ArgList); + CHECK_FOR_ERROR + ;} + break; + + case 165: +#line 1923 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = (yyvsp[-2].ArgList); + (yyval.ArgList)->push_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); CHECK_FOR_ERROR - ; - break;} -case 165: -#line 1921 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = new std::vector >(); - yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); + ;} + break; + + case 166: +#line 1929 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = new std::vector >(); + (yyval.ArgList)->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); CHECK_FOR_ERROR - ; - break;} -case 166: -#line 1926 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ArgList = 0; + ;} + break; + + case 167: +#line 1934 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ArgList) = 0; CHECK_FOR_ERROR - ; - break;} -case 167: -#line 1932 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - UnEscapeLexed(yyvsp[-5].StrVal); - std::string FunctionName(yyvsp[-5].StrVal); - free(yyvsp[-5].StrVal); // Free strdup'd memory! + ;} + break; + + case 168: +#line 1940 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + UnEscapeLexed((yyvsp[-5].StrVal)); + std::string FunctionName((yyvsp[-5].StrVal)); + free((yyvsp[-5].StrVal)); // Free strdup'd memory! - if (!(*yyvsp[-6].TypeVal)->isFirstClassType() && *yyvsp[-6].TypeVal != Type::VoidTy) + if (!(*(yyvsp[-6].TypeVal))->isFirstClassType() && *(yyvsp[-6].TypeVal) != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); std::vector ParamTypeList; - if (yyvsp[-3].ArgList) { // If there are arguments... - for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); - I != yyvsp[-3].ArgList->end(); ++I) + if ((yyvsp[-3].ArgList)) { // If there are arguments... + for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); + I != (yyvsp[-3].ArgList)->end(); ++I) ParamTypeList.push_back(I->first->get()); } bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; if (isVarArg) ParamTypeList.pop_back(); - const FunctionType *FT = FunctionType::get(*yyvsp[-6].TypeVal, ParamTypeList, isVarArg); + const FunctionType *FT = FunctionType::get(*(yyvsp[-6].TypeVal), ParamTypeList, isVarArg); const PointerType *PFT = PointerType::get(FT); - delete yyvsp[-6].TypeVal; + delete (yyvsp[-6].TypeVal); ValID ID; if (!FunctionName.empty()) { @@ -3504,24 +4223,24 @@ // another function. Fn->setLinkage(CurFun.Linkage); } - Fn->setCallingConv(yyvsp[-7].UIntVal); - Fn->setAlignment(yyvsp[0].UIntVal); - if (yyvsp[-1].StrVal) { - Fn->setSection(yyvsp[-1].StrVal); - free(yyvsp[-1].StrVal); + Fn->setCallingConv((yyvsp[-7].UIntVal)); + Fn->setAlignment((yyvsp[0].UIntVal)); + if ((yyvsp[-1].StrVal)) { + Fn->setSection((yyvsp[-1].StrVal)); + free((yyvsp[-1].StrVal)); } // Add all of the arguments we parsed to the function... - if (yyvsp[-3].ArgList) { // Is null if empty... + if ((yyvsp[-3].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert(yyvsp[-3].ArgList->back().first->get() == Type::VoidTy && yyvsp[-3].ArgList->back().second == 0&& + assert((yyvsp[-3].ArgList)->back().first->get() == Type::VoidTy && (yyvsp[-3].ArgList)->back().second == 0&& "Not a varargs marker!"); - delete yyvsp[-3].ArgList->back().first; - yyvsp[-3].ArgList->pop_back(); // Delete the last entry + delete (yyvsp[-3].ArgList)->back().first; + (yyvsp[-3].ArgList)->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); - I != yyvsp[-3].ArgList->end(); ++I, ++ArgIt) { + for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); + I != (yyvsp[-3].ArgList)->end(); ++I, ++ArgIt) { delete I->first; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... @@ -3529,123 +4248,140 @@ InsertValue(ArgIt); } - delete yyvsp[-3].ArgList; // We're now done with the argument list + delete (yyvsp[-3].ArgList); // We're now done with the argument list } CHECK_FOR_ERROR -; - break;} -case 170: -#line 2028 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = CurFun.CurrentFunction; +;} + break; + + case 171: +#line 2036 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = CurFun.CurrentFunction; // Make sure that we keep track of the linkage type even if there was a // previous "declare". - yyval.FunctionVal->setLinkage(yyvsp[-2].Linkage); -; - break;} -case 173: -#line 2038 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = yyvsp[-1].FunctionVal; + (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage)); +;} + break; + + case 174: +#line 2046 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR -; - break;} -case 175: -#line 2044 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.Linkage = GlobalValue::DLLImportLinkage ; - break;} -case 176: -#line 2045 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.Linkage = GlobalValue::DLLImportLinkage ; - break;} -case 177: -#line 2047 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.isDeclare = true; ; - break;} -case 178: -#line 2047 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = CurFun.CurrentFunction; +;} + break; + + case 176: +#line 2052 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurFun.Linkage = GlobalValue::DLLImportLinkage ;} + break; + + case 177: +#line 2053 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurFun.Linkage = GlobalValue::DLLImportLinkage ;} + break; + + case 178: +#line 2055 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = true; ;} + break; + + case 179: +#line 2055 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = CurFun.CurrentFunction; CurFun.FunctionDone(); CHECK_FOR_ERROR - ; - break;} -case 179: -#line 2057 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 180: +#line 2065 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; CHECK_FOR_ERROR - ; - break;} -case 180: -#line 2061 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 181: +#line 2069 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - ; - break;} -case 181: -#line 2066 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A reference to a direct constant - yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); - CHECK_FOR_ERROR - ; - break;} -case 182: -#line 2070 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); + ;} + break; + + case 182: +#line 2074 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // A reference to a direct constant + (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 183: -#line 2074 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Perhaps it's an FP constant? - yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); - CHECK_FOR_ERROR - ; - break;} -case 184: -#line 2078 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(ConstantBool::getTrue()); + ;} + break; + + case 183: +#line 2078 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR - ; - break;} -case 185: -#line 2082 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(ConstantBool::getFalse()); + ;} + break; + + case 184: +#line 2082 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Perhaps it's an FP constant? + (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); CHECK_FOR_ERROR - ; - break;} -case 186: -#line 2086 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::createNull(); + ;} + break; + + case 185: +#line 2086 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create(ConstantBool::getTrue()); CHECK_FOR_ERROR - ; - break;} -case 187: -#line 2090 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::createUndef(); + ;} + break; + + case 186: +#line 2090 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create(ConstantBool::getFalse()); CHECK_FOR_ERROR - ; - break;} -case 188: -#line 2094 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A vector zero constant. - yyval.ValIDVal = ValID::createZeroInit(); - CHECK_FOR_ERROR - ; - break;} -case 189: -#line 2098 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized packed vector - const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); - int NumElements = yyvsp[-1].ConstVector->size(); + ;} + break; + + case 187: +#line 2094 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::createNull(); + CHECK_FOR_ERROR + ;} + break; + + case 188: +#line 2098 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::createUndef(); + CHECK_FOR_ERROR + ;} + break; + + case 189: +#line 2102 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // A vector zero constant. + (yyval.ValIDVal) = ValID::createZeroInit(); + CHECK_FOR_ERROR + ;} + break; + + case 190: +#line 2106 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized packed vector + const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType(); + int NumElements = (yyvsp[-1].ConstVector)->size(); PackedType* pt = PackedType::get(ETy, NumElements); PATypeHolder* PTy = new PATypeHolder( @@ -3657,98 +4393,108 @@ ); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '" + - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); - delete PTy; delete yyvsp[-1].ConstVector; + (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, *(yyvsp[-1].ConstVector))); + delete PTy; delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR - ; - break;} -case 190: -#line 2123 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); + ;} + break; + + case 191: +#line 2131 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal)); CHECK_FOR_ERROR - ; - break;} -case 191: -#line 2127 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - char *End = UnEscapeLexed(yyvsp[-2].StrVal, true); - std::string AsmStr = std::string(yyvsp[-2].StrVal, End); - End = UnEscapeLexed(yyvsp[0].StrVal, true); - std::string Constraints = std::string(yyvsp[0].StrVal, End); - yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal); - free(yyvsp[-2].StrVal); - free(yyvsp[0].StrVal); - CHECK_FOR_ERROR - ; - break;} -case 192: -#line 2141 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it an integer reference...? - yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); - CHECK_FOR_ERROR - ; - break;} -case 193: -#line 2145 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it a named reference...? - yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); - CHECK_FOR_ERROR - ; - break;} -case 196: -#line 2157 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; + ;} + break; + + case 192: +#line 2135 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); + std::string AsmStr = std::string((yyvsp[-2].StrVal), End); + End = UnEscapeLexed((yyvsp[0].StrVal), true); + std::string Constraints = std::string((yyvsp[0].StrVal), End); + (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal)); + free((yyvsp[-2].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR - ; - break;} -case 197: -#line 2162 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.FunctionVal = yyvsp[-1].FunctionVal; + ;} + break; + + case 193: +#line 2149 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Is it an integer reference...? + (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); CHECK_FOR_ERROR - ; - break;} -case 198: -#line 2166 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Do not allow functions with 0 basic blocks - yyval.FunctionVal = yyvsp[-1].FunctionVal; - CHECK_FOR_ERROR - ; - break;} -case 199: -#line 2175 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); + ;} + break; + + case 194: +#line 2153 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? + (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); + CHECK_FOR_ERROR + ;} + break; + + case 197: +#line 2165 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 198: +#line 2170 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + CHECK_FOR_ERROR + ;} + break; + + case 199: +#line 2174 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Do not allow functions with 0 basic blocks + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + CHECK_FOR_ERROR + ;} + break; + + case 200: +#line 2183 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); + CHECK_FOR_ERROR + InsertValue((yyvsp[0].TermInstVal)); + + (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal)); + InsertValue((yyvsp[-2].BasicBlockVal)); + (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal); + CHECK_FOR_ERROR + ;} + break; + + case 201: +#line 2194 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal)); + (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal); CHECK_FOR_ERROR - InsertValue(yyvsp[0].TermInstVal); + ;} + break; - yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); - InsertValue(yyvsp[-2].BasicBlockVal); - yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; - CHECK_FOR_ERROR - ; - break;} -case 200: -#line 2186 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); - yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; - CHECK_FOR_ERROR - ; - break;} -case 201: -#line 2191 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); + case 202: +#line 2199 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -3756,14 +4502,15 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR - ; - break;} -case 202: -#line 2203 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); + ;} + break; + + case 203: +#line 2211 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -3771,90 +4518,97 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR - ; - break;} -case 203: -#line 2216 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with a result... - yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); - CHECK_FOR_ERROR - ; - break;} -case 204: -#line 2220 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with no result... - yyval.TermInstVal = new ReturnInst(); - CHECK_FOR_ERROR - ; - break;} -case 205: -#line 2224 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Unconditional Branch... - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBB); - ; - break;} -case 206: -#line 2229 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal); - CHECK_FOR_ERROR - BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - Value* tmpVal = getVal(Type::BoolTy, yyvsp[-6].ValIDVal); - CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal); - ; - break;} -case 207: -#line 2238 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal); + ;} + break; + + case 204: +#line 2224 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Return with a result... + (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal)); + CHECK_FOR_ERROR + ;} + break; + + case 205: +#line 2228 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Return with no result... + (yyval.TermInstVal) = new ReturnInst(); + CHECK_FOR_ERROR + ;} + break; + + case 206: +#line 2232 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Unconditional Branch... + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); + CHECK_FOR_ERROR + (yyval.TermInstVal) = new BranchInst(tmpBB); + ;} + break; + + case 207: +#line 2237 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); + CHECK_FOR_ERROR + BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); + CHECK_FOR_ERROR + Value* tmpVal = getVal(Type::BoolTy, (yyvsp[-6].ValIDVal)); + CHECK_FOR_ERROR + (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal); + ;} + break; + + case 208: +#line 2246 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size()); - yyval.TermInstVal = S; + SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size()); + (yyval.TermInstVal) = S; - std::vector >::iterator I = yyvsp[-1].JumpTable->begin(), - E = yyvsp[-1].JumpTable->end(); + std::vector >::iterator I = (yyvsp[-1].JumpTable)->begin(), + E = (yyvsp[-1].JumpTable)->end(); for (; I != E; ++I) { if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else GEN_ERROR("Switch case is constant, but not a simple integer!"); } - delete yyvsp[-1].JumpTable; + delete (yyvsp[-1].JumpTable); CHECK_FOR_ERROR - ; - break;} -case 208: -#line 2257 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal); + ;} + break; + + case 209: +#line 2265 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0); - yyval.TermInstVal = S; + (yyval.TermInstVal) = S; CHECK_FOR_ERROR - ; - break;} -case 209: -#line 2267 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 210: +#line 2275 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast(yyvsp[-10].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-10].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if (yyvsp[-7].ValueList) { - for (std::vector::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end(); + if ((yyvsp[-7].ValueList)) { + for (std::vector::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -3862,27 +4616,27 @@ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - Ty = FunctionType::get(yyvsp[-10].TypeVal->get(), ParamTypes, isVarArg); + Ty = FunctionType::get((yyvsp[-10].TypeVal)->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-9].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR - BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal); + BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR // Create the call node... - if (!yyvsp[-7].ValueList) { // Has no arguments? - yyval.TermInstVal = new InvokeInst(V, Normal, Except, std::vector()); + if (!(yyvsp[-7].ValueList)) { // Has no arguments? + (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = yyvsp[-7].ValueList->begin(), ArgE = yyvsp[-7].ValueList->end(); + std::vector::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -3892,242 +4646,263 @@ if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - yyval.TermInstVal = new InvokeInst(V, Normal, Except, *yyvsp[-7].ValueList); + (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[-7].ValueList)); } - cast(yyval.TermInstVal)->setCallingConv(yyvsp[-11].UIntVal); + cast((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal)); - delete yyvsp[-10].TypeVal; - delete yyvsp[-7].ValueList; + delete (yyvsp[-10].TypeVal); + delete (yyvsp[-7].ValueList); CHECK_FOR_ERROR - ; - break;} -case 210: -#line 2322 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TermInstVal = new UnwindInst(); + ;} + break; + + case 211: +#line 2330 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TermInstVal) = new UnwindInst(); CHECK_FOR_ERROR - ; - break;} -case 211: -#line 2326 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.TermInstVal = new UnreachableInst(); + ;} + break; + + case 212: +#line 2334 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TermInstVal) = new UnreachableInst(); CHECK_FOR_ERROR - ; - break;} -case 212: -#line 2333 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.JumpTable = yyvsp[-5].JumpTable; - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + ;} + break; + + case 213: +#line 2341 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.JumpTable) = (yyvsp[-5].JumpTable); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); - ; - break;} -case 213: -#line 2344 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.JumpTable = new std::vector >(); - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); + ;} + break; + + case 214: +#line 2352 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.JumpTable) = new std::vector >(); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); - ; - break;} -case 214: -#line 2357 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); + ;} + break; + + case 215: +#line 2365 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Is this definition named?? if so, assign the name... - setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); + setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR - InsertValue(yyvsp[0].InstVal); - yyval.InstVal = yyvsp[0].InstVal; + InsertValue((yyvsp[0].InstVal)); + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR -; - break;} -case 215: -#line 2366 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Used for PHI nodes - yyval.PHIList = new std::list >(); - Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal); - CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); - CHECK_FOR_ERROR - yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB)); - delete yyvsp[-5].TypeVal; - ; - break;} -case 216: -#line 2375 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.PHIList = yyvsp[-6].PHIList; - Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal); +;} + break; + + case 216: +#line 2374 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Used for PHI nodes + (yyval.PHIList) = new std::list >(); + Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal)); + CHECK_FOR_ERROR + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); + CHECK_FOR_ERROR + (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); + delete (yyvsp[-5].TypeVal); + ;} + break; + + case 217: +#line 2383 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.PHIList) = (yyvsp[-6].PHIList); + Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB)); - ; - break;} -case 217: -#line 2385 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Used for call statements, and memory insts... - yyval.ValueList = new std::vector(); - yyval.ValueList->push_back(yyvsp[0].ValueVal); - ; - break;} -case 218: -#line 2389 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValueList = yyvsp[-2].ValueList; - yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); + (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); + ;} + break; + + case 218: +#line 2393 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { // Used for call statements, and memory insts... + (yyval.ValueList) = new std::vector(); + (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); + ;} + break; + + case 219: +#line 2397 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValueList) = (yyvsp[-2].ValueList); + (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 220: -#line 2396 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ValueList = 0; ; - break;} -case 221: -#line 2398 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 221: +#line 2404 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { (yyval.ValueList) = 0; ;} + break; + + case 222: +#line 2406 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - ; - break;} -case 222: -#line 2402 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 223: +#line 2410 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; CHECK_FOR_ERROR - ; - break;} -case 223: -#line 2407 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && - !isa((*yyvsp[-3].TypeVal).get())) + ;} + break; + + case 224: +#line 2415 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && + !isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR( "Arithmetic operator requires integer, FP, or packed operands!"); - if (isa((*yyvsp[-3].TypeVal).get()) && yyvsp[-4].BinaryOpVal == Instruction::Rem) + if (isa((*(yyvsp[-3].TypeVal)).get()) && (yyvsp[-4].BinaryOpVal) == Instruction::Rem) GEN_ERROR("Rem not supported on packed types!"); - Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; - ; - break;} -case 224: -#line 2423 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!(*yyvsp[-3].TypeVal)->isIntegral()) { - if (!isa(yyvsp[-3].TypeVal->get()) || - !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) + delete (yyvsp[-3].TypeVal); + ;} + break; + + case 225: +#line 2431 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(*(yyvsp[-3].TypeVal))->isIntegral()) { + if (!isa((yyvsp[-3].TypeVal)->get()) || + !cast((yyvsp[-3].TypeVal)->get())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; - ; - break;} -case 225: -#line 2438 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if(isa((*yyvsp[-3].TypeVal).get())) { + delete (yyvsp[-3].TypeVal); + ;} + break; + + case 226: +#line 2446 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if(isa((*(yyvsp[-3].TypeVal)).get())) { GEN_ERROR( "PackedTypes currently not supported in setcc instructions!"); } - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new SetCondInst(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = new SetCondInst((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; - ; - break;} -case 226: -#line 2452 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + delete (yyvsp[-3].TypeVal); + ;} + break; + + case 227: +#line 2460 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; - Value *Ones = ConstantIntegral::getAllOnesValue(yyvsp[0].ValueVal->getType()); + Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[0].ValueVal)->getType()); if (Ones == 0) GEN_ERROR("Expected integral type for not instruction!"); - yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal), Ones); + if ((yyval.InstVal) == 0) GEN_ERROR("Could not create a xor instruction!"); CHECK_FOR_ERROR - ; - break;} -case 227: -#line 2465 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[0].ValueVal->getType() != Type::UByteTy) + ;} + break; + + case 228: +#line 2473 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[0].ValueVal)->getType() != Type::UByteTy) GEN_ERROR("Shift amount must be ubyte!"); - if (!yyvsp[-2].ValueVal->getType()->isInteger()) + if (!(yyvsp[-2].ValueVal)->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); - yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ShiftInst((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 228: -#line 2473 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!yyvsp[0].TypeVal->get()->isFirstClassType()) + ;} + break; + + case 229: +#line 2481 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(yyvsp[0].TypeVal)->get()->isFirstClassType()) GEN_ERROR("cast instruction to a non-primitive type: '" + - yyvsp[0].TypeVal->get()->getDescription() + "'!"); - yyval.InstVal = new CastInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); - delete yyvsp[0].TypeVal; - CHECK_FOR_ERROR - ; - break;} -case 229: -#line 2481 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) + (yyvsp[0].TypeVal)->get()->getDescription() + "'!"); + (yyval.InstVal) = new CastInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); + delete (yyvsp[0].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 230: +#line 2489 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((yyvsp[-4].ValueVal)->getType() != Type::BoolTy) GEN_ERROR("select condition must be boolean!"); - if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) + if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType()) GEN_ERROR("select value types should match!"); - yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 230: -#line 2489 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 231: +#line 2497 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { NewVarArgs = true; - yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); - delete yyvsp[0].TypeVal; + (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 231: -#line 2495 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 232: +#line 2503 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; - const Type* ArgTy = yyvsp[-2].ValueVal->getType(); + const Type* ArgTy = (yyvsp[-2].ValueVal)->getType(); Function* NF = CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0); @@ -4138,19 +4913,20 @@ //b = vaarg foo, t AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix"); CurBB->getInstList().push_back(foo); - CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); + CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal)); CurBB->getInstList().push_back(bar); CurBB->getInstList().push_back(new StoreInst(bar, foo)); - yyval.InstVal = new VAArgInst(foo, *yyvsp[0].TypeVal); - delete yyvsp[0].TypeVal; + (yyval.InstVal) = new VAArgInst(foo, *(yyvsp[0].TypeVal)); + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 232: -#line 2515 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 233: +#line 2523 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; - const Type* ArgTy = yyvsp[-2].ValueVal->getType(); + const Type* ArgTy = (yyvsp[-2].ValueVal)->getType(); Function* NF = CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0); @@ -4162,73 +4938,78 @@ //b = load foo AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix"); CurBB->getInstList().push_back(foo); - CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); + CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal)); CurBB->getInstList().push_back(bar); CurBB->getInstList().push_back(new StoreInst(bar, foo)); - Instruction* tmp = new VAArgInst(foo, *yyvsp[0].TypeVal); + Instruction* tmp = new VAArgInst(foo, *(yyvsp[0].TypeVal)); CurBB->getInstList().push_back(tmp); - yyval.InstVal = new LoadInst(foo); - delete yyvsp[0].TypeVal; + (yyval.InstVal) = new LoadInst(foo); + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR - ; - break;} -case 233: -#line 2538 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + ;} + break; + + case 234: +#line 2546 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid extractelement operands!"); - yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 234: -#line 2544 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + ;} + break; + + case 235: +#line 2552 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid insertelement operands!"); - yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 235: -#line 2550 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + ;} + break; + + case 236: +#line 2558 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid shufflevector operands!"); - yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 236: -#line 2556 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const Type *Ty = yyvsp[0].PHIList->front().first->getType(); + ;} + break; + + case 237: +#line 2564 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); if (!Ty->isFirstClassType()) GEN_ERROR("PHI node operands must be of first class type!"); - yyval.InstVal = new PHINode(Ty); - ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size()); - while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) { - if (yyvsp[0].PHIList->front().first->getType() != Ty) + (yyval.InstVal) = new PHINode(Ty); + ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size()); + while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) { + if ((yyvsp[0].PHIList)->front().first->getType() != Ty) GEN_ERROR("All elements of a PHI node must be of the same type!"); - cast(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second); - yyvsp[0].PHIList->pop_front(); + cast((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second); + (yyvsp[0].PHIList)->pop_front(); } - delete yyvsp[0].PHIList; // Free the list... + delete (yyvsp[0].PHIList); // Free the list... CHECK_FOR_ERROR - ; - break;} -case 237: -#line 2571 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 238: +#line 2579 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast(yyvsp[-4].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-4].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if (yyvsp[-1].ValueList) { - for (std::vector::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end(); + if ((yyvsp[-1].ValueList)) { + for (std::vector::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -4236,31 +5017,31 @@ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - if (!(*yyvsp[-4].TypeVal)->isFirstClassType() && *yyvsp[-4].TypeVal != Type::VoidTy) + if (!(*(yyvsp[-4].TypeVal))->isFirstClassType() && *(yyvsp[-4].TypeVal) != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); - Ty = FunctionType::get(yyvsp[-4].TypeVal->get(), ParamTypes, isVarArg); + Ty = FunctionType::get((yyvsp[-4].TypeVal)->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-3].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR // Create the call node... - if (!yyvsp[-1].ValueList) { // Has no arguments? + if (!(yyvsp[-1].ValueList)) { // Has no arguments? // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " "expects arguments!"); - yyval.InstVal = new CallInst(V, std::vector()); + (yyval.InstVal) = new CallInst(V, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end(); + std::vector::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -4270,377 +5051,442 @@ if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - yyval.InstVal = new CallInst(V, *yyvsp[-1].ValueList); + (yyval.InstVal) = new CallInst(V, *(yyvsp[-1].ValueList)); } - cast(yyval.InstVal)->setTailCall(yyvsp[-6].BoolVal); - cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); - delete yyvsp[-4].TypeVal; - delete yyvsp[-1].ValueList; - CHECK_FOR_ERROR - ; - break;} -case 238: -#line 2630 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.InstVal = yyvsp[0].InstVal; + cast((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal)); + cast((yyval.InstVal))->setCallingConv((yyvsp[-5].UIntVal)); + delete (yyvsp[-4].TypeVal); + delete (yyvsp[-1].ValueList); CHECK_FOR_ERROR - ; - break;} -case 239: -#line 2637 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValueList = yyvsp[0].ValueList; - CHECK_FOR_ERROR - ; - break;} -case 240: -#line 2640 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.ValueList = new std::vector(); - CHECK_FOR_ERROR - ; - break;} -case 241: -#line 2645 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = true; + ;} + break; + + case 239: +#line 2638 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR - ; - break;} -case 242: -#line 2649 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.BoolVal = false; + ;} + break; + + case 240: +#line 2645 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValueList) = (yyvsp[0].ValueList); CHECK_FOR_ERROR - ; - break;} -case 243: -#line 2656 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; + ;} + break; + + case 241: +#line 2648 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ValueList) = new std::vector(); CHECK_FOR_ERROR - ; - break;} -case 244: -#line 2661 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + ;} + break; + + case 242: +#line 2653 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = true; CHECK_FOR_ERROR - yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; - ; - break;} -case 245: -#line 2667 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; + ;} + break; + + case 243: +#line 2657 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.BoolVal) = false; CHECK_FOR_ERROR - ; - break;} -case 246: -#line 2672 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + ;} + break; + + case 244: +#line 2664 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR - yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; - ; - break;} -case 247: -#line 2678 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[0].ValueVal->getType())) + ;} + break; + + case 245: +#line 2669 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); + CHECK_FOR_ERROR + (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); + ;} + break; + + case 246: +#line 2675 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); + CHECK_FOR_ERROR + ;} + break; + + case 247: +#line 2680 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); + CHECK_FOR_ERROR + (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); + ;} + break; + + case 248: +#line 2686 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[0].ValueVal)->getType())) GEN_ERROR("Trying to free nonpointer type " + - yyvsp[0].ValueVal->getType()->getDescription() + "!"); - yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); + (yyvsp[0].ValueVal)->getType()->getDescription() + "!"); + (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR - ; - break;} -case 248: -#line 2686 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[-1].TypeVal->get())) + ;} + break; + + case 249: +#line 2694 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[-1].TypeVal)->get())) GEN_ERROR("Can't load from nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - if (!cast(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType()) + (*(yyvsp[-1].TypeVal))->getDescription()); + if (!cast((yyvsp[-1].TypeVal)->get())->getElementType()->isFirstClassType()) GEN_ERROR("Can't load from pointer of non-first-class type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + (*(yyvsp[-1].TypeVal))->getDescription()); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal); - delete yyvsp[-1].TypeVal; - ; - break;} -case 249: -#line 2698 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); + (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal)); + delete (yyvsp[-1].TypeVal); + ;} + break; + + case 250: +#line 2706 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PT = dyn_cast((yyvsp[-1].TypeVal)->get()); if (!PT) GEN_ERROR("Can't store to a nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); + (*(yyvsp[-1].TypeVal))->getDescription()); const Type *ElTy = PT->getElementType(); - if (ElTy != yyvsp[-3].ValueVal->getType()) - GEN_ERROR("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() + + if (ElTy != (yyvsp[-3].ValueVal)->getType()) + GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() + "' into space of type '" + ElTy->getDescription() + "'!"); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, tmpVal, yyvsp[-5].BoolVal); - delete yyvsp[-1].TypeVal; - ; - break;} -case 250: -#line 2713 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if (!isa(yyvsp[-2].TypeVal->get())) + (yyval.InstVal) = new StoreInst((yyvsp[-3].ValueVal), tmpVal, (yyvsp[-5].BoolVal)); + delete (yyvsp[-1].TypeVal); + ;} + break; + + case 251: +#line 2721 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa((yyvsp[-2].TypeVal)->get())) GEN_ERROR("getelementptr insn requires pointer operand!"); // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct // indices to uint struct indices for compatibility. generic_gep_type_iterator::iterator> - GTI = gep_type_begin(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()), - GTE = gep_type_end(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()); - for (unsigned i = 0, e = yyvsp[0].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) + GTI = gep_type_begin((yyvsp[-2].TypeVal)->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end()), + GTE = gep_type_end((yyvsp[-2].TypeVal)->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end()); + for (unsigned i = 0, e = (yyvsp[0].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI) if (isa(*GTI)) // Only change struct indices - if (ConstantUInt *CUI = dyn_cast((*yyvsp[0].ValueList)[i])) + if (ConstantUInt *CUI = dyn_cast((*(yyvsp[0].ValueList))[i])) if (CUI->getType() == Type::UByteTy) - (*yyvsp[0].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + (*(yyvsp[0].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy); - if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, *yyvsp[0].ValueList, true)) + if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), *(yyvsp[0].ValueList), true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); - Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal); + (*(yyvsp[-2].TypeVal))->getDescription()+ "'!"); + Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new GetElementPtrInst(tmpVal, *yyvsp[0].ValueList); - delete yyvsp[-2].TypeVal; - delete yyvsp[0].ValueList; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[0].ValueList)); + delete (yyvsp[-2].TypeVal); + delete (yyvsp[0].ValueList); + ;} + break; + + + default: break; + } + +/* Line 1126 of yacc.c. */ +#line 5222 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif + + YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; - if (count < 5) +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror (YY_("syntax error")); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval); + yychar = YYEMPTY; + } } - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; - goto yyerrhandle; -yyerrdefault: /* current state does not do anything special for the error token. */ +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (0) + goto yyerrorlab; -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif +yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; -yyerrpop: /* pop the current state because it cannot handle the error token */ - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ -#if YYDEBUG != 0 - if (yydebug) + for (;;) { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 2739 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" + + +#line 2747 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" void llvm::GenerateError(const std::string &message, int LineNo) { @@ -4663,3 +5509,4 @@ GenerateError(errMsg); return 0; } + Index: llvm/lib/AsmParser/llvmAsmParser.h.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.10 llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.11 --- llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.10 Thu Sep 28 18:35:22 2006 +++ llvm/lib/AsmParser/llvmAsmParser.h.cvs Mon Oct 9 12:36:59 2006 @@ -1,4 +1,254 @@ -typedef union { +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + DLLIMPORT = 300, + DLLEXPORT = 301, + EXTERN_WEAK = 302, + OPAQUE = 303, + NOT = 304, + EXTERNAL = 305, + TARGET = 306, + TRIPLE = 307, + ENDIAN = 308, + POINTERSIZE = 309, + LITTLE = 310, + BIG = 311, + ALIGN = 312, + DEPLIBS = 313, + CALL = 314, + TAIL = 315, + ASM_TOK = 316, + MODULE = 317, + SIDEEFFECT = 318, + CC_TOK = 319, + CCC_TOK = 320, + CSRETCC_TOK = 321, + FASTCC_TOK = 322, + COLDCC_TOK = 323, + X86_STDCALLCC_TOK = 324, + X86_FASTCALLCC_TOK = 325, + RET = 326, + BR = 327, + SWITCH = 328, + INVOKE = 329, + UNWIND = 330, + UNREACHABLE = 331, + ADD = 332, + SUB = 333, + MUL = 334, + DIV = 335, + REM = 336, + AND = 337, + OR = 338, + XOR = 339, + SETLE = 340, + SETGE = 341, + SETLT = 342, + SETGT = 343, + SETEQ = 344, + SETNE = 345, + MALLOC = 346, + ALLOCA = 347, + FREE = 348, + LOAD = 349, + STORE = 350, + GETELEMENTPTR = 351, + PHI_TOK = 352, + CAST = 353, + SELECT = 354, + SHL = 355, + SHR = 356, + VAARG = 357, + EXTRACTELEMENT = 358, + INSERTELEMENT = 359, + SHUFFLEVECTOR = 360, + VAARG_old = 361, + VANEXT_old = 362 + }; +#endif +/* Tokens. */ +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define DLLIMPORT 300 +#define DLLEXPORT 301 +#define EXTERN_WEAK 302 +#define OPAQUE 303 +#define NOT 304 +#define EXTERNAL 305 +#define TARGET 306 +#define TRIPLE 307 +#define ENDIAN 308 +#define POINTERSIZE 309 +#define LITTLE 310 +#define BIG 311 +#define ALIGN 312 +#define DEPLIBS 313 +#define CALL 314 +#define TAIL 315 +#define ASM_TOK 316 +#define MODULE 317 +#define SIDEEFFECT 318 +#define CC_TOK 319 +#define CCC_TOK 320 +#define CSRETCC_TOK 321 +#define FASTCC_TOK 322 +#define COLDCC_TOK 323 +#define X86_STDCALLCC_TOK 324 +#define X86_FASTCALLCC_TOK 325 +#define RET 326 +#define BR 327 +#define SWITCH 328 +#define INVOKE 329 +#define UNWIND 330 +#define UNREACHABLE 331 +#define ADD 332 +#define SUB 333 +#define MUL 334 +#define DIV 335 +#define REM 336 +#define AND 337 +#define OR 338 +#define XOR 339 +#define SETLE 340 +#define SETGE 341 +#define SETLT 342 +#define SETGT 343 +#define SETEQ 344 +#define SETNE 345 +#define MALLOC 346 +#define ALLOCA 347 +#define FREE 348 +#define LOAD 349 +#define STORE 350 +#define GETELEMENTPTR 351 +#define PHI_TOK 352 +#define CAST 353 +#define SELECT 354 +#define SHL 355 +#define SHR 356 +#define VAARG 357 +#define EXTRACTELEMENT 358 +#define INSERTELEMENT 359 +#define SHUFFLEVECTOR 360 +#define VAARG_old 361 +#define VANEXT_old 362 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 974 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -37,111 +287,14 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define DLLIMPORT 299 -#define DLLEXPORT 300 -#define EXTERN_WEAK 301 -#define OPAQUE 302 -#define NOT 303 -#define EXTERNAL 304 -#define TARGET 305 -#define TRIPLE 306 -#define ENDIAN 307 -#define POINTERSIZE 308 -#define LITTLE 309 -#define BIG 310 -#define ALIGN 311 -#define DEPLIBS 312 -#define CALL 313 -#define TAIL 314 -#define ASM_TOK 315 -#define MODULE 316 -#define SIDEEFFECT 317 -#define CC_TOK 318 -#define CCC_TOK 319 -#define CSRETCC_TOK 320 -#define FASTCC_TOK 321 -#define COLDCC_TOK 322 -#define X86_STDCALLCC_TOK 323 -#define X86_FASTCALLCC_TOK 324 -#define RET 325 -#define BR 326 -#define SWITCH 327 -#define INVOKE 328 -#define UNWIND 329 -#define UNREACHABLE 330 -#define ADD 331 -#define SUB 332 -#define MUL 333 -#define DIV 334 -#define REM 335 -#define AND 336 -#define OR 337 -#define XOR 338 -#define SETLE 339 -#define SETGE 340 -#define SETLT 341 -#define SETGT 342 -#define SETEQ 343 -#define SETNE 344 -#define MALLOC 345 -#define ALLOCA 346 -#define FREE 347 -#define LOAD 348 -#define STORE 349 -#define GETELEMENTPTR 350 -#define PHI_TOK 351 -#define CAST 352 -#define SELECT 353 -#define SHL 354 -#define SHR 355 -#define VAARG 356 -#define EXTRACTELEMENT 357 -#define INSERTELEMENT 358 -#define SHUFFLEVECTOR 359 -#define VAARG_old 360 -#define VANEXT_old 361 - +/* Line 1447 of yacc.c. */ +#line 292 "llvmAsmParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif extern YYSTYPE llvmAsmlval; + + + Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.263 llvm/lib/AsmParser/llvmAsmParser.y:1.264 --- llvm/lib/AsmParser/llvmAsmParser.y:1.263 Thu Sep 28 18:35:22 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Oct 9 12:36:59 2006 @@ -39,7 +39,7 @@ // immediately invokes YYERROR. This would be so much cleaner if it was a // recursive descent parser. static bool TriggerError = false; -#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYERROR; } } +#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } } #define GEN_ERROR(msg) { GenerateError(msg); YYERROR; } int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit @@ -820,12 +820,20 @@ llvmAsmlineno = 1; // Reset the current line number... ObsoleteVarArgs = false; NewVarArgs = false; - CurModule.CurrentModule = M; - yyparse(); // Parse the file, potentially throwing exception + + // Check to make sure the parser succeeded + if (yyparse()) { + if (ParserResult) + delete ParserResult; + return 0; + } + + // Check to make sure that parsing produced a result if (!ParserResult) return 0; + // Reset ParserResult variable while saving its value for the result. Module *Result = ParserResult; ParserResult = 0; @@ -1721,7 +1729,7 @@ Module : FunctionList { $$ = ParserResult = $1; CurModule.ModuleDone(); - CHECK_FOR_ERROR + CHECK_FOR_ERROR; }; // FunctionList - A list of functions, preceeded by a constant pool. Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.15 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.16 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.15 Thu Sep 28 18:35:22 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Mon Oct 9 12:36:59 2006 @@ -39,7 +39,7 @@ // immediately invokes YYERROR. This would be so much cleaner if it was a // recursive descent parser. static bool TriggerError = false; -#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYERROR; } } +#define CHECK_FOR_ERROR { if (TriggerError) { TriggerError = false; YYABORT; } } #define GEN_ERROR(msg) { GenerateError(msg); YYERROR; } int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit @@ -820,12 +820,20 @@ llvmAsmlineno = 1; // Reset the current line number... ObsoleteVarArgs = false; NewVarArgs = false; - CurModule.CurrentModule = M; - yyparse(); // Parse the file, potentially throwing exception + + // Check to make sure the parser succeeded + if (yyparse()) { + if (ParserResult) + delete ParserResult; + return 0; + } + + // Check to make sure that parsing produced a result if (!ParserResult) return 0; + // Reset ParserResult variable while saving its value for the result. Module *Result = ParserResult; ParserResult = 0; @@ -1721,7 +1729,7 @@ Module : FunctionList { $$ = ParserResult = $1; CurModule.ModuleDone(); - CHECK_FOR_ERROR + CHECK_FOR_ERROR; }; // FunctionList - A list of functions, preceeded by a constant pool. From rafael.espindola at gmail.com Mon Oct 9 12:50:46 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 12:50:46 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.td Message-ID: <200610091750.k99HokFH018396@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMInstrInfo.td updated: 1.37 -> 1.38 --- Log message: add float -> double and double -> float conversion --- Diffs of the changes: (+5 -0) ARMInstrInfo.td | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.37 llvm/lib/Target/ARM/ARMInstrInfo.td:1.38 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.37 Mon Oct 9 12:18:28 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Mon Oct 9 12:50:29 2006 @@ -200,6 +200,11 @@ def FUITOD : InstARM<(ops DFPRegs:$dst, FPRegs:$src), "fuitod $dst, $src", [(set DFPRegs:$dst, (armfuitod FPRegs:$src))]>; +def FCVTDS : InstARM<(ops DFPRegs:$dst, FPRegs:$src), + "fcvtds $dst, $src", [(set DFPRegs:$dst, (fextend FPRegs:$src))]>; + +def FCVTSD : InstARM<(ops FPRegs:$dst, DFPRegs:$src), + "fcvtsd $dst, $src", [(set FPRegs:$dst, (fround DFPRegs:$src))]>; // Floating Point Arithmetic def FADDS : InstARM<(ops FPRegs:$dst, FPRegs:$a, FPRegs:$b), From rafael.espindola at gmail.com Mon Oct 9 12:50:46 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 12:50:46 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpconv.ll Message-ID: <200610091750.k99Hokku018391@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fpconv.ll added (r1.1) --- Log message: add float -> double and double -> float conversion --- Diffs of the changes: (+15 -0) fpconv.ll | 15 +++++++++++++++ 1 files changed, 15 insertions(+) Index: llvm/test/Regression/CodeGen/ARM/fpconv.ll diff -c /dev/null llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.1 *** /dev/null Mon Oct 9 12:50:39 2006 --- llvm/test/Regression/CodeGen/ARM/fpconv.ll Mon Oct 9 12:50:29 2006 *************** *** 0 **** --- 1,15 ---- + ; RUN: llvm-as < %s | llc -march=arm && + ; RUN: llvm-as < %s | llc -march=arm | grep fcvtds && + ; RUN: llvm-as < %s | llc -march=arm | grep fcvtsd + + float %f(double %x) { + entry: + %tmp1 = cast double %x to float + ret float %tmp1 + } + + double %g(float %x) { + entry: + %tmp1 = cast float %x to double + ret double %tmp1 + } From isanbard at gmail.com Mon Oct 9 13:24:17 2006 From: isanbard at gmail.com (Bill Wendling) Date: Mon, 9 Oct 2006 13:24:17 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.tests Message-ID: <200610091824.k99IOH3U019037@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.tests updated: 1.11 -> 1.12 --- Log message: Reverting patch from the weekend so that we have something to compare against for PR928: http://llvm.org/PR928 . --- Diffs of the changes: (+4 -4) Makefile.tests | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm-test/Makefile.tests diff -u llvm-test/Makefile.tests:1.11 llvm-test/Makefile.tests:1.12 --- llvm-test/Makefile.tests:1.11 Sun Oct 8 02:16:29 2006 +++ llvm-test/Makefile.tests Mon Oct 9 13:24:03 2006 @@ -50,19 +50,19 @@ # Compile from X.c to Output/X.ll Output/%.ll: %.c $(LCC1) Output/.dir $(INCLUDES) - -$(LLVMGCC) $(CPPFLAGS) $(LCCFLAGS) $(TARGET_FLAGS) -S $< -o $@ -emit-llvm + -$(LLVMGCC) $(CPPFLAGS) $(LCCFLAGS) $(TARGET_FLAGS) -O0 -S $< -o $@ -emit-llvm # Compile from X.cpp to Output/X.ll Output/%.ll: %.cpp $(LCC1XX) Output/.dir $(INCLUDES) - -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -S $< -o $@ -emit-llvm + -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -O0 -S $< -o $@ -emit-llvm # Compile from X.cc to Output/X.ll Output/%.ll: %.cc $(LCC1XX) Output/.dir $(INCLUDES) - -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -S $< -o $@ -emit-llvm + -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -O0 -S $< -o $@ -emit-llvm # Compile from X.C to Output/X.ll Output/%.ll: %.C $(LCC1XX) Output/.dir $(INCLUDES) - -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -S $< -o $@ -emit-llvm + -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) $(TARGET_FLAGS) -O0 -S $< -o $@ -emit-llvm # LLVM Assemble from Output/X.ll to Output/X.bc. Output/X.ll must have come # from GCC output, so use GCCAS. From nicholas at mxc.ca Mon Oct 9 13:33:23 2006 From: nicholas at mxc.ca (Nick Lewycky) Date: Mon, 9 Oct 2006 13:33:23 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/InstVisitor.h Message-ID: <200610091833.k99IXNlK019248@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: InstVisitor.h updated: 1.40 -> 1.41 --- Log message: Fix usage example. --- Diffs of the changes: (+1 -1) InstVisitor.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Support/InstVisitor.h diff -u llvm/include/llvm/Support/InstVisitor.h:1.40 llvm/include/llvm/Support/InstVisitor.h:1.41 --- llvm/include/llvm/Support/InstVisitor.h:1.40 Wed May 31 10:30:18 2006 +++ llvm/include/llvm/Support/InstVisitor.h Mon Oct 9 13:33:08 2006 @@ -53,7 +53,7 @@ /// unsigned Count; /// CountMallocVisitor() : Count(0) {} /// -/// void visitMallocInst(MallocInst *MI) { ++Count; } +/// void visitMallocInst(MallocInst &MI) { ++Count; } /// }; /// /// And this class would be used like this: From dpatel at apple.com Mon Oct 9 14:05:05 2006 From: dpatel at apple.com (Devang Patel) Date: Mon, 9 Oct 2006 14:05:05 -0500 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200610091905.k99J55qs019846@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.17 -> 1.18 --- Log message: Use GetTemporaryDirectory. Fix http://llvm.org/bugs/show_bug.cgi?id=894 --- Diffs of the changes: (+15 -2) lto.cpp | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.17 llvm/tools/lto/lto.cpp:1.18 --- llvm/tools/lto/lto.cpp:1.17 Thu Sep 21 12:22:55 2006 +++ llvm/tools/lto/lto.cpp Mon Oct 9 14:04:51 2006 @@ -341,18 +341,28 @@ exportList[i] = allSymbols[name]->getName(); } - sys::Path tmpAsmFilePath("/tmp/"); + std::string ErrMsg; + sys::Path TempDir = sys::Path::GetTemporaryDirectory(&ErrMsg); + sys::Path tmpAsmFilePath(TempDir); + if (!tmpAsmFilePath.appendComponent("lto")) { + std::cerr << "lto: " << ErrMsg << "\n"; + TempDir.eraseFromDisk(true); + return LTO_WRITE_FAILURE; + } if (tmpAsmFilePath.createTemporaryFileOnDisk(&ErrMsg)) { std::cerr << "lto: " << ErrMsg << "\n"; + TempDir.eraseFromDisk(true); return LTO_WRITE_FAILURE; } sys::RemoveFileOnSignal(tmpAsmFilePath); std::ofstream asmFile(tmpAsmFilePath.c_str(), io_mode); if (!asmFile.is_open() || asmFile.bad()) { - if (tmpAsmFilePath.exists()) + if (tmpAsmFilePath.exists()) { tmpAsmFilePath.eraseFromDisk(); + TempDir.eraseFromDisk(true); + } return LTO_WRITE_FAILURE; } @@ -360,6 +370,7 @@ asmFile.close(); if (status != LTO_OPT_SUCCESS) { tmpAsmFilePath.eraseFromDisk(); + TempDir.eraseFromDisk(true); return status; } @@ -374,6 +385,7 @@ const sys::Path gcc = FindExecutable("gcc", "/"); if (gcc.isEmpty()) { tmpAsmFilePath.eraseFromDisk(); + TempDir.eraseFromDisk(true); return LTO_ASM_FAILURE; } @@ -390,6 +402,7 @@ sys::Program::ExecuteAndWait(gcc, &args[0], 0, 0, 1); tmpAsmFilePath.eraseFromDisk(); + TempDir.eraseFromDisk(true); return LTO_OPT_SUCCESS; } From alenhar2 at cs.uiuc.edu Mon Oct 9 14:05:58 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 9 Oct 2006 14:05:58 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/SmallVector.h Message-ID: <200610091905.k99J5wwq019897@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: SmallVector.h updated: 1.19 -> 1.20 --- Log message: Fix build error in gcc 3.4 and make more this general --- Diffs of the changes: (+1 -1) SmallVector.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/SmallVector.h diff -u llvm/include/llvm/ADT/SmallVector.h:1.19 llvm/include/llvm/ADT/SmallVector.h:1.20 --- llvm/include/llvm/ADT/SmallVector.h:1.19 Sun Oct 8 17:28:34 2006 +++ llvm/include/llvm/ADT/SmallVector.h Mon Oct 9 14:05:44 2006 @@ -35,7 +35,7 @@ protected: #ifdef __GNUC__ typedef char U; - U FirstEl __attribute__((aligned(__alignof__(double)))); + U FirstEl __attribute__((aligned)); #else union U { double D; From rafael.espindola at gmail.com Mon Oct 9 14:15:31 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 9 Oct 2006 14:15:31 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fparith.ll Message-ID: <200610091915.k99JFVRi020046@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fparith.ll added (r1.1) --- Log message: add some tests for floating point arithmetic --- Diffs of the changes: (+29 -0) fparith.ll | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+) Index: llvm/test/Regression/CodeGen/ARM/fparith.ll diff -c /dev/null llvm/test/Regression/CodeGen/ARM/fparith.ll:1.1 *** /dev/null Mon Oct 9 14:15:27 2006 --- llvm/test/Regression/CodeGen/ARM/fparith.ll Mon Oct 9 14:15:17 2006 *************** *** 0 **** --- 1,29 ---- + ; RUN: llvm-as < %s | llc -march=arm && + ; RUN: llvm-as < %s | llc -march=arm | grep fadds && + ; RUN: llvm-as < %s | llc -march=arm | grep faddd && + ; RUN: llvm-as < %s | llc -march=arm | grep fmuls && + ; RUN: llvm-as < %s | llc -march=arm | grep fmuld + + float %f(float %a, float %b) { + entry: + %tmp = add float %a, %b + ret float %tmp + } + + double %g(double %a, double %b) { + entry: + %tmp = add double %a, %b + ret double %tmp + } + + float %h(float %a, float %b) { + entry: + %tmp = mul float %a, %b + ret float %tmp + } + + double %i(double %a, double %b) { + entry: + %tmp = mul double %a, %b + ret double %tmp + } From rspencer at reidspencer.com Mon Oct 9 14:33:16 2006 From: rspencer at reidspencer.com (Reid Spencer) Date: Mon, 09 Oct 2006 12:33:16 -0700 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/SmallVector.h In-Reply-To: <200610091905.k99J5wwq019897@zion.cs.uiuc.edu> References: <200610091905.k99J5wwq019897@zion.cs.uiuc.edu> Message-ID: <1160422396.20547.351.camel@bashful.x10sys.com> Andrew, ... On Mon, 2006-10-09 at 14:05 -0500, Andrew Lenharth wrote: > > Changes in directory llvm/include/llvm/ADT: > > SmallVector.h updated: 1.19 -> 1.20 > --- > Log message: > > Fix build error in gcc 3.4 and make more this general This compiled on my 3.4.6 compiler on Linux just fine before the patch. What was the error you were trying to fix? > > --- > Diffs of the changes: (+1 -1) > > SmallVector.h | 2 +- > 1 files changed, 1 insertion(+), 1 deletion(-) > > > Index: llvm/include/llvm/ADT/SmallVector.h > diff -u llvm/include/llvm/ADT/SmallVector.h:1.19 llvm/include/llvm/ADT/SmallVector.h:1.20 > --- llvm/include/llvm/ADT/SmallVector.h:1.19 Sun Oct 8 17:28:34 2006 > +++ llvm/include/llvm/ADT/SmallVector.h Mon Oct 9 14:05:44 2006 > @@ -35,7 +35,7 @@ > protected: > #ifdef __GNUC__ > typedef char U; > - U FirstEl __attribute__((aligned(__alignof__(double)))); > + U FirstEl __attribute__((aligned)); Are you sure this is right? In section 5.31 of the GCC Manual it indicates that if an alignment size is not given with the aligned attribute keyword then it defaults to: "the maximum useful alignment for the target machine you are compiling for. Whenever you leave out the alignment factor in an `aligned' attribute specification, the compiler automatically sets the alignment for the declared variable or field to the largest alignment which is ever used for any data type on the target machine you are compiling for". Is this what we want here? Reid. > #else > union U { > double D; > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From andrewl at lenharth.org Mon Oct 9 14:56:40 2006 From: andrewl at lenharth.org (Andrew Lenharth) Date: Mon, 9 Oct 2006 14:56:40 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/SmallVector.h In-Reply-To: <1160422396.20547.351.camel@bashful.x10sys.com> References: <200610091905.k99J5wwq019897@zion.cs.uiuc.edu> <1160422396.20547.351.camel@bashful.x10sys.com> Message-ID: <85dfcd7f0610091256o66f514fbpb1adb7347f7413af@mail.gmail.com> > This compiled on my 3.4.6 compiler on Linux just fine before the patch. > What was the error you were trying to fix? "Allignment Value not constant" was the error. This was gcc 3.4.4 > Are you sure this is right? In section 5.31 of the GCC Manual it > indicates that if an alignment size is not given with the aligned > attribute keyword then it defaults to: > > "the maximum useful alignment for the target machine you are compiling > for. Whenever you leave out the alignment factor in an `aligned' > attribute specification, the compiler automatically sets the alignment > for the declared variable or field to the largest alignment which is > ever used for any data type on the target machine you are compiling > for". > > Is this what we want here? I believe so. The alignment of that field needs to be sufficient for any data type put there. The non-gcc version does that with a union. My reading of the gcc manual is that without a value, this attribute does exactly that (and since doubles are not always the most constrained types, vectors tend to be, this is more general, though I doubt altivec vectors are going to be used directly by LLVM in small vectors anytime soon). Andrew From clattner at apple.com Mon Oct 9 15:02:37 2006 From: clattner at apple.com (Chris Lattner) Date: Mon, 9 Oct 2006 13:02:37 -0700 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/SmallVector.h In-Reply-To: <85dfcd7f0610091256o66f514fbpb1adb7347f7413af@mail.gmail.com> References: <200610091905.k99J5wwq019897@zion.cs.uiuc.edu> <1160422396.20547.351.camel@bashful.x10sys.com> <85dfcd7f0610091256o66f514fbpb1adb7347f7413af@mail.gmail.com> Message-ID: <6CA106F6-0F85-472D-B01D-B59A9655E839@apple.com> On Oct 9, 2006, at 12:56 PM, Andrew Lenharth wrote: >> >> Is this what we want here? > > I believe so. I agree, Andrew's patch looks great to me. -Chris From sabre at nondot.org Mon Oct 9 15:12:52 2006 From: sabre at nondot.org (Chris Lattner) Date: Mon, 9 Oct 2006 15:12:52 -0500 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/ListReducer.h Message-ID: <200610092012.k99KCqig020992@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: ListReducer.h updated: 1.16 -> 1.17 --- Log message: Remove a dead var noticed by Yorion --- Diffs of the changes: (+0 -1) ListReducer.h | 1 - 1 files changed, 1 deletion(-) Index: llvm/tools/bugpoint/ListReducer.h diff -u llvm/tools/bugpoint/ListReducer.h:1.16 llvm/tools/bugpoint/ListReducer.h:1.17 --- llvm/tools/bugpoint/ListReducer.h:1.16 Wed May 24 12:04:04 2006 +++ llvm/tools/bugpoint/ListReducer.h Mon Oct 9 15:12:37 2006 @@ -103,7 +103,6 @@ std::vector EmptyList; while (Changed) { Changed = false; - std::vector TrimmedList; for (unsigned i = 1; i < TheList.size()-1; ++i) { // Check interior elts if (BugpointIsInterrupted) { std::cerr << "\n\n*** Reduction Interrupted, cleaning up...\n\n"; From dpatel at apple.com Mon Oct 9 15:20:27 2006 From: dpatel at apple.com (Devang Patel) Date: Mon, 9 Oct 2006 15:20:27 -0500 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200610092020.k99KKRH0021147@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.18 -> 1.19 --- Log message: Do error checking. --- Diffs of the changes: (+8 -1) lto.cpp | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletion(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.18 llvm/tools/lto/lto.cpp:1.19 --- llvm/tools/lto/lto.cpp:1.18 Mon Oct 9 14:04:51 2006 +++ llvm/tools/lto/lto.cpp Mon Oct 9 15:20:13 2006 @@ -344,6 +344,10 @@ std::string ErrMsg; sys::Path TempDir = sys::Path::GetTemporaryDirectory(&ErrMsg); + if (TempDir.isEmpty()) { + std::cerr << "lto: " << ErrMsg << "\n"; + return LTO_WRITE_FAILURE; + } sys::Path tmpAsmFilePath(TempDir); if (!tmpAsmFilePath.appendComponent("lto")) { std::cerr << "lto: " << ErrMsg << "\n"; @@ -399,7 +403,10 @@ args.push_back(tmpAsmFilePath.c_str()); args.push_back(0); - sys::Program::ExecuteAndWait(gcc, &args[0], 0, 0, 1); + if (sys::Program::ExecuteAndWait(gcc, &args[0], 0, 0, 1, &ErrMsg)) { + std::cerr << "lto: " << ErrMsg << "\n"; + return LTO_ASM_FAILURE; + } tmpAsmFilePath.eraseFromDisk(); TempDir.eraseFromDisk(true); From evan.cheng at apple.com Mon Oct 9 15:55:35 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:55:35 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200610092055.k99KtZg4021749@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.80 -> 1.81 --- Log message: Merging ISD::LOAD and ISD::LOADX. Added LoadSDNode to represent load nodes. Chain and address ptr remains as operands. SrcValue, extending mode, extending VT (or rather loaded VT before extension) are now instance variables of LoadSDNode. Introduce load / store addressing modes to represent pre- and post-indexed load and store. Also added an additional operand offset that is only used in post-indexed mode (i.e. base ptr += offset after load/store). Added alignment info (not yet used) and isVolatile fields. --- Diffs of the changes: (+5 -7) TargetLowering.h | 12 +++++------- 1 files changed, 5 insertions(+), 7 deletions(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.80 llvm/include/llvm/Target/TargetLowering.h:1.81 --- llvm/include/llvm/Target/TargetLowering.h:1.80 Fri Oct 6 17:46:34 2006 +++ llvm/include/llvm/Target/TargetLowering.h Mon Oct 9 15:55:20 2006 @@ -219,14 +219,12 @@ /// expanded to some other code sequence, or the target has a custom expander /// for it. LegalizeAction getOperationAction(unsigned Op, MVT::ValueType VT) const { - assert(Op != ISD::LOADX && "Should use getLoadXAction instead"); return (LegalizeAction)((OpActions[Op] >> (2*VT)) & 3); } /// isOperationLegal - Return true if the specified operation is legal on this /// target. bool isOperationLegal(unsigned Op, MVT::ValueType VT) const { - assert(Op != ISD::LOADX && "Should use isLoadXLegal instead"); return getOperationAction(Op, VT) == Legal || getOperationAction(Op, VT) == Custom; } @@ -545,7 +543,6 @@ /// with the specified type and indicate what to do about it. void setOperationAction(unsigned Op, MVT::ValueType VT, LegalizeAction Action) { - assert(Op != ISD::LOADX && "Should use setLoadXAction instead"); assert(VT < 32 && Op < sizeof(OpActions)/sizeof(OpActions[0]) && "Table isn't big enough!"); OpActions[Op] &= ~(uint64_t(3UL) << VT*2); @@ -554,11 +551,12 @@ /// setLoadXAction - Indicate that the specified load with extension does not /// work with the with specified type and indicate what to do about it. - void setLoadXAction(unsigned LType, MVT::ValueType VT, LegalizeAction Action){ - assert(VT < 32 && LType < sizeof(LoadXActions)/sizeof(LoadXActions[0]) && + void setLoadXAction(unsigned ExtType, MVT::ValueType VT, + LegalizeAction Action) { + assert(VT < 32 && ExtType < sizeof(LoadXActions)/sizeof(LoadXActions[0]) && "Table isn't big enough!"); - LoadXActions[LType] &= ~(uint64_t(3UL) << VT*2); - LoadXActions[LType] |= (uint64_t)Action << VT*2; + LoadXActions[ExtType] &= ~(uint64_t(3UL) << VT*2); + LoadXActions[ExtType] |= (uint64_t)Action << VT*2; } /// AddPromotedToType - If Opc/OrigVT is specified as being promoted, the From evan.cheng at apple.com Mon Oct 9 15:55:36 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:55:36 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h Message-ID: <200610092055.k99KtaoD021756@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.133 -> 1.134 SelectionDAGNodes.h updated: 1.149 -> 1.150 --- Log message: Merging ISD::LOAD and ISD::LOADX. Added LoadSDNode to represent load nodes. Chain and address ptr remains as operands. SrcValue, extending mode, extending VT (or rather loaded VT before extension) are now instance variables of LoadSDNode. Introduce load / store addressing modes to represent pre- and post-indexed load and store. Also added an additional operand offset that is only used in post-indexed mode (i.e. base ptr += offset after load/store). Added alignment info (not yet used) and isVolatile fields. --- Diffs of the changes: (+148 -25) SelectionDAG.h | 8 +- SelectionDAGNodes.h | 165 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 148 insertions(+), 25 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.133 llvm/include/llvm/CodeGen/SelectionDAG.h:1.134 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.133 Thu Oct 5 17:54:31 2006 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Mon Oct 9 15:55:20 2006 @@ -300,12 +300,12 @@ /// determined by their operands, and they produce a value AND a token chain. /// SDOperand getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr, - SDOperand SV); + const Value *SV, int SVOffset, bool isVolatile=false); + SDOperand getExtLoad(ISD::LoadExtType ExtType, MVT::ValueType VT, + SDOperand Chain, SDOperand Ptr, const Value *SV, + int SVOffset, MVT::ValueType EVT, bool isVolatile=false); SDOperand getVecLoad(unsigned Count, MVT::ValueType VT, SDOperand Chain, SDOperand Ptr, SDOperand SV); - SDOperand getExtLoad(ISD::LoadExtType LType, MVT::ValueType VT, - SDOperand Chain, SDOperand Ptr, SDOperand SV, - MVT::ValueType EVT); /// getStore - Helper function to build ISD::STORE nodes. /// Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.149 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.150 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.149 Tue Oct 3 19:50:21 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Mon Oct 9 15:55:20 2006 @@ -380,21 +380,6 @@ // the elements, a token chain, a pointer operand, and a SRCVALUE node. VLOAD, - // Load a value from memory and extend them to a larger value (e.g. load a - // byte into a word register). All three of these have four operands, a - // token chain, a pointer to load from, a SRCVALUE for alias analysis, a - // VALUETYPE node indicating the type to load, and an enum indicating what - // sub-type of LOADX it is: - // - // SEXTLOAD loads the integer operand and sign extends it to a larger - // integer result type. - // ZEXTLOAD loads the integer operand and zero extends it to a larger - // integer result type. - // EXTLOAD is used for three things: floating point extending loads, - // integer extending loads [the top bits are undefined], and vector - // extending loads [load into low elt]. - LOADX, - // TRUNCSTORE - This operators truncates (for integer) or rounds (for FP) a // value and stores it to memory in one operation. This can be used for // either integer or floating point operands. The first four operands of @@ -534,10 +519,52 @@ bool isBuildVectorAllZeros(const SDNode *N); //===--------------------------------------------------------------------===// + /// MemOpAddrMode enum - This enum defines the three load / store addressing + /// modes. + /// + /// UNINDEXED "Normal" load / store. The effective address is already + /// computed and is available in the base pointer. The offset + /// operand is always undefined. An unindexed load produces one + /// value (result of the load); an unindexed store does not + /// produces a value. + /// + /// PRE_INDEXED Similar to the unindexed mode where the effective address is + /// the result of computation of the base pointer. However, it + /// considers the computation as being folded into the load / + /// store operation (i.e. the load / store does the address + /// computation as well as performing the memory transaction). + /// The base operand is always undefined. A pre-indexed load + /// produces two values (result of the load and the result of + /// the address computation); a pre-indexed store produces one + /// value (result of the address computation). + /// + /// POST_INDEXED The effective address is the value of the base pointer. The + /// value of the offset operand is then added to the base after + /// memory transaction. A post-indexed load produces two values + /// (the result of the load and the result of the base + offset + /// computation); a post-indexed store produces one value (the + /// the result of the base + offset computation). + /// + enum MemOpAddrMode { + UNINDEXED = 0, + PRE_INDEXED, + POST_INDEXED + }; + + //===--------------------------------------------------------------------===// /// LoadExtType enum - This enum defines the three variants of LOADEXT /// (load with extension). /// + /// SEXTLOAD loads the integer operand and sign extends it to a larger + /// integer result type. + /// ZEXTLOAD loads the integer operand and zero extends it to a larger + /// integer result type. + /// EXTLOAD is used for three things: floating point extending loads, + /// integer extending loads [the top bits are undefined], and vector + /// extending loads [load into low elt]. + /// enum LoadExtType { + NON_EXTLOAD = 0, EXTLOAD, SEXTLOAD, ZEXTLOAD, @@ -1345,6 +1372,95 @@ } }; +/// LoadSDNode - This class is used to represent ISD::LOAD nodes. +/// +class LoadSDNode : public SDNode { + ISD::MemOpAddrMode AddrMode; // unindexed, pre-indexed, post-indexed. + ISD::LoadExtType ExtType; // non-ext, anyext, sext, zext. + MVT::ValueType LoadVT; // VT of loaded value before extension. + const Value *SrcValue; + int SVOffset; + unsigned Alignment; + bool IsVolatile; +protected: + friend class SelectionDAG; + LoadSDNode(SDOperand Chain, SDOperand Ptr, SDOperand Off, + ISD::MemOpAddrMode AM, ISD::LoadExtType ETy, MVT::ValueType LVT, + const Value *SV, int O=0, unsigned Align=1, bool Vol=false) + : SDNode(ISD::LOAD, Chain, Ptr, Off), + AddrMode(AM), ExtType(ETy), LoadVT(LVT), SrcValue(SV), SVOffset(O), + Alignment(Align), IsVolatile(Vol) { + assert((Off.getOpcode() == ISD::UNDEF || AddrMode == ISD::POST_INDEXED) && + "Only post-indexed load has a non-undef offset operand"); + } + LoadSDNode(SDOperand Chain, SDOperand Ptr, SDOperand Off, + ISD::LoadExtType ETy, MVT::ValueType LVT, + const Value *SV, int O=0, unsigned Align=1, bool Vol=false) + : SDNode(ISD::LOAD, Chain, Ptr, Off), + AddrMode(ISD::UNINDEXED), ExtType(ETy), LoadVT(LVT), SrcValue(SV), + SVOffset(O), Alignment(Align), IsVolatile(Vol) { + assert((Off.getOpcode() == ISD::UNDEF || AddrMode == ISD::POST_INDEXED) && + "Only post-indexed load has a non-undef offset operand"); + } +public: + + const SDOperand &getChain() const { return getOperand(0); } + const SDOperand &getBasePtr() const { return getOperand(1); } + const SDOperand &getOffset() const { return getOperand(2); } + ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; } + ISD::LoadExtType getExtensionType() const { return ExtType; } + MVT::ValueType getLoadVT() const { return LoadVT; } + const Value *getSrcValue() const { return SrcValue; } + int getSrcValueOffset() const { return SVOffset; } + unsigned getAlignment() const { return Alignment; } + bool isVolatile() const { return IsVolatile; } + + static bool classof(const LoadSDNode *) { return true; } + static bool classof(const SDNode *N) { + return N->getOpcode() == ISD::LOAD; + } +}; + +/// StoreSDNode - This class is used to represent ISD::STORE nodes. +/// +class StoreSDNode : public SDNode { + ISD::MemOpAddrMode AddrMode; // unindexed, pre-indexed, post-indexed. + bool IsTruncStore; // is value truncated before store? + MVT::ValueType StoredVT; // VT of value that's actually stored. + const Value *SrcValue; + int SVOffset; + unsigned Alignment; + bool IsVolatile; +protected: + friend class SelectionDAG; + StoreSDNode(SDOperand Chain, SDOperand Ptr, SDOperand Off, + ISD::MemOpAddrMode AM, bool isTrunc, MVT::ValueType SVT, + const Value *SV, int O=0, unsigned Align=0, bool Vol=false) + : SDNode(ISD::STORE, Chain, Ptr, Off), + AddrMode(AM), IsTruncStore(isTrunc), StoredVT(SVT), SrcValue(SV), + SVOffset(O), Alignment(Align), IsVolatile(Vol) { + assert((Off.getOpcode() == ISD::UNDEF || AddrMode == ISD::POST_INDEXED) && + "Only post-indexed store has a non-undef offset operand"); + } +public: + + const SDOperand &getChain() const { return getOperand(0); } + const SDOperand &getBasePtr() const { return getOperand(1); } + const SDOperand &getOffset() const { return getOperand(2); } + ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; } + bool isTruncatingStore() const { return IsTruncStore; } + MVT::ValueType getStoredVT() const { return StoredVT; } + const Value *getSrcValue() const { return SrcValue; } + int getSrcValueOffset() const { return SVOffset; } + unsigned getAlignment() const { return Alignment; } + bool isVolatile() const { return IsVolatile; } + + static bool classof(const LoadSDNode *) { return true; } + static bool classof(const SDNode *N) { + return N->getOpcode() == ISD::STORE; + } +}; + class SDNodeIterator : public forward_iterator { SDNode *Node; @@ -1420,25 +1536,32 @@ }; namespace ISD { + /// isNON_EXTLoad - Returns true if the specified node is a non-extending + /// load. + inline bool isNON_EXTLoad(const SDNode *N) { + return N->getOpcode() == ISD::LOAD && + cast(N)->getExtensionType() == ISD::NON_EXTLOAD; + } + /// isEXTLoad - Returns true if the specified node is a EXTLOAD. /// inline bool isEXTLoad(const SDNode *N) { - return N->getOpcode() == ISD::LOADX && - N->getConstantOperandVal(4) == ISD::EXTLOAD; + return N->getOpcode() == ISD::LOAD && + cast(N)->getExtensionType() == ISD::EXTLOAD; } /// isSEXTLoad - Returns true if the specified node is a SEXTLOAD. /// inline bool isSEXTLoad(const SDNode *N) { - return N->getOpcode() == ISD::LOADX && - N->getConstantOperandVal(4) == ISD::SEXTLOAD; + return N->getOpcode() == ISD::LOAD && + cast(N)->getExtensionType() == ISD::SEXTLOAD; } /// isZEXTLoad - Returns true if the specified node is a ZEXTLOAD. /// inline bool isZEXTLoad(const SDNode *N) { - return N->getOpcode() == ISD::LOADX && - N->getConstantOperandVal(4) == ISD::ZEXTLOAD; + return N->getOpcode() == ISD::LOAD && + cast(N)->getExtensionType() == ISD::ZEXTLOAD; } } From evan.cheng at apple.com Mon Oct 9 15:57:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp IA64ISelLowering.cpp Message-ID: <200610092057.k99KvnYo021863@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.55 -> 1.56 IA64ISelLowering.cpp updated: 1.45 -> 1.46 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+10 -10) IA64ISelDAGToDAG.cpp | 11 +++++------ IA64ISelLowering.cpp | 9 +++++---- 2 files changed, 10 insertions(+), 10 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.55 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.56 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.55 Tue Oct 3 19:55:13 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Mon Oct 9 15:57:24 2006 @@ -453,15 +453,14 @@ } */ - case ISD::LOAD: - case ISD::LOADX: { // FIXME: load -1, not 1, for bools? - SDOperand Chain = N->getOperand(0); - SDOperand Address = N->getOperand(1); + case ISD::LOAD: { // FIXME: load -1, not 1, for bools? + LoadSDNode *LD = cast(N); + SDOperand Chain = LD->getChain(); + SDOperand Address = LD->getBasePtr(); AddToISelQueue(Chain); AddToISelQueue(Address); - MVT::ValueType TypeBeingLoaded = (N->getOpcode() == ISD::LOAD) ? - N->getValueType(0) : cast(N->getOperand(3))->getVT(); + MVT::ValueType TypeBeingLoaded = LD->getLoadVT(); unsigned Opc; switch (TypeBeingLoaded) { default: Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.45 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.46 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.45 Thu Oct 5 18:00:04 2006 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Mon Oct 9 15:57:25 2006 @@ -133,7 +133,7 @@ static bool isFloatingPointZero(SDOperand Op) { if (ConstantFPSDNode *CFP = dyn_cast(Op)) return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0); - else if (Op.getOpcode() == ISD::EXTLOAD || Op.getOpcode() == ISD::LOAD) { + else if (ISD::isEXTLoad(Op.Val) || ISD::isNON_EXTLoad(Op.Val)) { // Maybe this has already been legalized into the constant pool? if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(1))) if (ConstantFP *CFP = dyn_cast(CP->getConstVal())) @@ -226,7 +226,7 @@ //from this parameter SDOperand FIN = DAG.getFrameIndex(FI, MVT::i64); argt = newroot = DAG.getLoad(getValueType(I->getType()), - DAG.getEntryNode(), FIN, DAG.getSrcValue(NULL)); + DAG.getEntryNode(), FIN, NULL, 0); } ++count; DAG.setRoot(newroot.getValue(1)); @@ -583,8 +583,9 @@ } case ISD::VAARG: { MVT::ValueType VT = getPointerTy(); + SrcValueSDNode *SV = cast(Op.getOperand(2)); SDOperand VAList = DAG.getLoad(VT, Op.getOperand(0), Op.getOperand(1), - Op.getOperand(2)); + SV->getValue(), SV->getOffset()); // Increment the pointer, VAList, to the next vaarg SDOperand VAIncr = DAG.getNode(ISD::ADD, VT, VAList, DAG.getConstant(MVT::getSizeInBits(VT)/8, @@ -593,7 +594,7 @@ VAIncr = DAG.getStore(VAList.getValue(1), VAIncr, Op.getOperand(1), Op.getOperand(2)); // Load the actual argument out of the pointer VAList - return DAG.getLoad(Op.getValueType(), VAIncr, VAList, DAG.getSrcValue(0)); + return DAG.getLoad(Op.getValueType(), VAIncr, VAList, NULL, 0); } case ISD::VASTART: { // vastart just stores the address of the VarArgsFrameIndex slot into the From evan.cheng at apple.com Mon Oct 9 15:57:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp SparcInstrInfo.td Message-ID: <200610092057.k99Kvnsd021858@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Sparc: SparcISelDAGToDAG.cpp updated: 1.110 -> 1.111 SparcInstrInfo.td updated: 1.127 -> 1.128 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+26 -26) SparcISelDAGToDAG.cpp | 20 ++++++++++---------- SparcInstrInfo.td | 32 ++++++++++++++++---------------- 2 files changed, 26 insertions(+), 26 deletions(-) Index: llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp diff -u llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.110 llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.111 --- llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.110 Thu Oct 5 18:00:34 2006 +++ llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp Mon Oct 9 15:57:25 2006 @@ -330,7 +330,7 @@ SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); SDOperand Load; if (ObjectVT == MVT::i32) { - Load = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0)); + Load = DAG.getLoad(MVT::i32, Root, FIPtr, NULL, 0); } else { ISD::LoadExtType LoadOp = I->getType()->isSigned() ? ISD::SEXTLOAD : ISD::ZEXTLOAD; @@ -340,7 +340,7 @@ FIPtr = DAG.getNode(ISD::ADD, MVT::i32, FIPtr, DAG.getConstant(Offset, MVT::i32)); Load = DAG.getExtLoad(LoadOp, MVT::i32, Root, FIPtr, - DAG.getSrcValue(0), ObjectVT); + NULL, 0, ObjectVT); Load = DAG.getNode(ISD::TRUNCATE, ObjectVT, Load); } ArgValues.push_back(Load); @@ -363,7 +363,7 @@ } else { int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset); SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand Load = DAG.getLoad(MVT::f32, Root, FIPtr, DAG.getSrcValue(0)); + SDOperand Load = DAG.getLoad(MVT::f32, Root, FIPtr, NULL, 0); ArgValues.push_back(Load); } ArgOffset += 4; @@ -384,8 +384,7 @@ // because the double wouldn't be aligned! int FrameIdx = MF.getFrameInfo()->CreateFixedObject(8, ArgOffset); SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - ArgValues.push_back(DAG.getLoad(MVT::f64, Root, FIPtr, - DAG.getSrcValue(0))); + ArgValues.push_back(DAG.getLoad(MVT::f64, Root, FIPtr, NULL, 0)); } else { SDOperand HiVal; if (CurArgReg < ArgRegEnd) { // Lives in an incoming GPR @@ -395,7 +394,7 @@ } else { int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset); SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - HiVal = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0)); + HiVal = DAG.getLoad(MVT::i32, Root, FIPtr, NULL, 0); } SDOperand LoVal; @@ -406,7 +405,7 @@ } else { int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset+4); SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - LoVal = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0)); + LoVal = DAG.getLoad(MVT::i32, Root, FIPtr, NULL, 0); } // Compose the two halves together into an i64 unit. @@ -794,8 +793,9 @@ MVT::ValueType VT = Node->getValueType(0); SDOperand InChain = Node->getOperand(0); SDOperand VAListPtr = Node->getOperand(1); + SrcValueSDNode *SV = cast(Node->getOperand(2)); SDOperand VAList = DAG.getLoad(getPointerTy(), InChain, VAListPtr, - Node->getOperand(2)); + SV->getValue(), SV->getOffset()); // Increment the pointer, VAList, to the next vaarg SDOperand NextPtr = DAG.getNode(ISD::ADD, getPointerTy(), VAList, DAG.getConstant(MVT::getSizeInBits(VT)/8, @@ -806,10 +806,10 @@ // Load the actual argument out of the pointer VAList, unless this is an // f64 load. if (VT != MVT::f64) { - return DAG.getLoad(VT, InChain, VAList, DAG.getSrcValue(0)); + return DAG.getLoad(VT, InChain, VAList, NULL, 0); } else { // Otherwise, load it as i64, then do a bitconvert. - SDOperand V = DAG.getLoad(MVT::i64, InChain, VAList, DAG.getSrcValue(0)); + SDOperand V = DAG.getLoad(MVT::i64, InChain, VAList, NULL, 0); std::vector Tys; Tys.push_back(MVT::f64); Tys.push_back(MVT::Other); Index: llvm/lib/Target/Sparc/SparcInstrInfo.td diff -u llvm/lib/Target/Sparc/SparcInstrInfo.td:1.127 llvm/lib/Target/Sparc/SparcInstrInfo.td:1.128 --- llvm/lib/Target/Sparc/SparcInstrInfo.td:1.127 Fri Sep 1 17:28:02 2006 +++ llvm/lib/Target/Sparc/SparcInstrInfo.td Mon Oct 9 15:57:25 2006 @@ -278,35 +278,35 @@ def LDSBrr : F3_1<3, 0b001001, (ops IntRegs:$dst, MEMrr:$addr), "ldsb [$addr], $dst", - [(set IntRegs:$dst, (sextload ADDRrr:$addr, i8))]>; + [(set IntRegs:$dst, (sextloadi8 ADDRrr:$addr))]>; def LDSBri : F3_2<3, 0b001001, (ops IntRegs:$dst, MEMri:$addr), "ldsb [$addr], $dst", - [(set IntRegs:$dst, (sextload ADDRri:$addr, i8))]>; + [(set IntRegs:$dst, (sextloadi8 ADDRri:$addr))]>; def LDSHrr : F3_1<3, 0b001010, (ops IntRegs:$dst, MEMrr:$addr), "ldsh [$addr], $dst", - [(set IntRegs:$dst, (sextload ADDRrr:$addr, i16))]>; + [(set IntRegs:$dst, (sextloadi16 ADDRrr:$addr))]>; def LDSHri : F3_2<3, 0b001010, (ops IntRegs:$dst, MEMri:$addr), "ldsh [$addr], $dst", - [(set IntRegs:$dst, (sextload ADDRri:$addr, i16))]>; + [(set IntRegs:$dst, (sextloadi16 ADDRri:$addr))]>; def LDUBrr : F3_1<3, 0b000001, (ops IntRegs:$dst, MEMrr:$addr), "ldub [$addr], $dst", - [(set IntRegs:$dst, (zextload ADDRrr:$addr, i8))]>; + [(set IntRegs:$dst, (zextloadi8 ADDRrr:$addr))]>; def LDUBri : F3_2<3, 0b000001, (ops IntRegs:$dst, MEMri:$addr), "ldub [$addr], $dst", - [(set IntRegs:$dst, (zextload ADDRri:$addr, i8))]>; + [(set IntRegs:$dst, (zextloadi8 ADDRri:$addr))]>; def LDUHrr : F3_1<3, 0b000010, (ops IntRegs:$dst, MEMrr:$addr), "lduh [$addr], $dst", - [(set IntRegs:$dst, (zextload ADDRrr:$addr, i16))]>; + [(set IntRegs:$dst, (zextloadi16 ADDRrr:$addr))]>; def LDUHri : F3_2<3, 0b000010, (ops IntRegs:$dst, MEMri:$addr), "lduh [$addr], $dst", - [(set IntRegs:$dst, (zextload ADDRri:$addr, i16))]>; + [(set IntRegs:$dst, (zextloadi16 ADDRri:$addr))]>; def LDrr : F3_1<3, 0b000000, (ops IntRegs:$dst, MEMrr:$addr), "ld [$addr], $dst", @@ -760,16 +760,16 @@ def : Pat<(ret), (RETL)>; // Map integer extload's to zextloads. -def : Pat<(i32 (extload ADDRrr:$src, i1)), (LDUBrr ADDRrr:$src)>; -def : Pat<(i32 (extload ADDRri:$src, i1)), (LDUBri ADDRri:$src)>; -def : Pat<(i32 (extload ADDRrr:$src, i8)), (LDUBrr ADDRrr:$src)>; -def : Pat<(i32 (extload ADDRri:$src, i8)), (LDUBri ADDRri:$src)>; -def : Pat<(i32 (extload ADDRrr:$src, i16)), (LDUHrr ADDRrr:$src)>; -def : Pat<(i32 (extload ADDRri:$src, i16)), (LDUHri ADDRri:$src)>; +def : Pat<(i32 (extloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; +def : Pat<(i32 (extloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; +def : Pat<(i32 (extloadi8 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; +def : Pat<(i32 (extloadi8 ADDRri:$src)), (LDUBri ADDRri:$src)>; +def : Pat<(i32 (extloadi16 ADDRrr:$src)), (LDUHrr ADDRrr:$src)>; +def : Pat<(i32 (extloadi16 ADDRri:$src)), (LDUHri ADDRri:$src)>; // zextload bool -> zextload byte -def : Pat<(i32 (zextload ADDRrr:$src, i1)), (LDUBrr ADDRrr:$src)>; -def : Pat<(i32 (zextload ADDRri:$src, i1)), (LDUBri ADDRri:$src)>; +def : Pat<(i32 (zextloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; +def : Pat<(i32 (zextloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; // truncstore bool -> truncstore byte. def : Pat<(truncstore IntRegs:$src, ADDRrr:$addr, i1), From evan.cheng at apple.com Mon Oct 9 15:57:51 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp AlphaInstrInfo.td Message-ID: <200610092057.k99KvpdX021892@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelLowering.cpp updated: 1.65 -> 1.66 AlphaInstrInfo.td updated: 1.125 -> 1.126 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+31 -31) AlphaISelLowering.cpp | 26 +++++++++++++------------- AlphaInstrInfo.td | 36 ++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 31 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.65 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.66 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.65 Fri Oct 6 17:46:51 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Mon Oct 9 15:57:24 2006 @@ -254,7 +254,7 @@ // Create the SelectionDAG nodes corresponding to a load //from this parameter SDOperand FIN = DAG.getFrameIndex(FI, MVT::i64); - ArgVal = DAG.getLoad(ObjectVT, Root, FIN, DAG.getSrcValue(NULL)); + ArgVal = DAG.getLoad(ObjectVT, Root, FIN, NULL, 0); } ArgValues.push_back(ArgVal); } @@ -430,7 +430,7 @@ SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i64); SDOperand ST = DAG.getStore(DAG.getEntryNode(), Op.getOperand(0), FI, DAG.getSrcValue(0)); - LD = DAG.getLoad(MVT::f64, ST, FI, DAG.getSrcValue(0)); + LD = DAG.getLoad(MVT::f64, ST, FI, NULL, 0); } SDOperand FP = DAG.getNode(isDouble?AlphaISD::CVTQT_:AlphaISD::CVTQS_, isDouble?MVT::f64:MVT::f32, LD); @@ -453,7 +453,7 @@ SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i64); SDOperand ST = DAG.getStore(DAG.getEntryNode(), src, FI, DAG.getSrcValue(0)); - return DAG.getLoad(MVT::i64, ST, FI, DAG.getSrcValue(0)); + return DAG.getLoad(MVT::i64, ST, FI, NULL, 0); } } case ISD::ConstantPool: { @@ -523,13 +523,14 @@ case ISD::VAARG: { SDOperand Chain = Op.getOperand(0); SDOperand VAListP = Op.getOperand(1); - SDOperand VAListS = Op.getOperand(2); + SrcValueSDNode *VAListS = cast(Op.getOperand(2)); - SDOperand Base = DAG.getLoad(MVT::i64, Chain, VAListP, VAListS); + SDOperand Base = DAG.getLoad(MVT::i64, Chain, VAListP, VAListS->getValue(), + VAListS->getOffset()); SDOperand Tmp = DAG.getNode(ISD::ADD, MVT::i64, VAListP, DAG.getConstant(8, MVT::i64)); SDOperand Offset = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, Base.getValue(1), - Tmp, DAG.getSrcValue(0), MVT::i32); + Tmp, NULL, 0, MVT::i32); SDOperand DataPtr = DAG.getNode(ISD::ADD, MVT::i64, Base, Offset); if (MVT::isFloatingPoint(Op.getValueType())) { @@ -551,10 +552,9 @@ SDOperand Result; if (Op.getValueType() == MVT::i32) Result = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, Update, DataPtr, - DAG.getSrcValue(0), MVT::i32); + NULL, 0, MVT::i32); else - Result = DAG.getLoad(Op.getValueType(), Update, DataPtr, - DAG.getSrcValue(0)); + Result = DAG.getLoad(Op.getValueType(), Update, DataPtr, NULL, 0); return Result; } case ISD::VACOPY: { @@ -562,14 +562,14 @@ SDOperand DestP = Op.getOperand(1); SDOperand SrcP = Op.getOperand(2); SDOperand DestS = Op.getOperand(3); - SDOperand SrcS = Op.getOperand(4); + SrcValueSDNode *SrcS = cast(Op.getOperand(4)); - SDOperand Val = DAG.getLoad(getPointerTy(), Chain, SrcP, SrcS); + SDOperand Val = DAG.getLoad(getPointerTy(), Chain, SrcP, + SrcS->getValue(), SrcS->getOffset()); SDOperand Result = DAG.getStore(Val.getValue(1), Val, DestP, DestS); SDOperand NP = DAG.getNode(ISD::ADD, MVT::i64, SrcP, DAG.getConstant(8, MVT::i64)); - Val = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, Result, NP, - DAG.getSrcValue(0), MVT::i32); + Val = DAG.getExtLoad(ISD::SEXTLOAD, MVT::i64, Result, NP, NULL,0, MVT::i32); SDOperand NPD = DAG.getNode(ISD::ADD, MVT::i64, DestP, DAG.getConstant(8, MVT::i64)); return DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Val.getValue(1), Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.125 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.126 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.125 Wed Sep 20 10:05:49 2006 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Mon Oct 9 15:57:24 2006 @@ -484,17 +484,17 @@ def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow", [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>; def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)", - [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))], s_ild>; + [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>; def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow", - [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))], s_ild>; + [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>; def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)", - [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))], s_ild>; + [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>; def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow", - [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))], s_ild>; + [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>; def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)", - [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))], s_ild>; + [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>; def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow", - [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))], s_ild>; + [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>; def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)", [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)], s_ist>; def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow", @@ -548,11 +548,11 @@ //constpool rels def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))), (LDQr tconstpool:$DISP, GPRC:$RB)>; -def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)), +def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))), (LDLr tconstpool:$DISP, GPRC:$RB)>; -def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)), +def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))), (LDBUr tconstpool:$DISP, GPRC:$RB)>; -def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)), +def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))), (LDWUr tconstpool:$DISP, GPRC:$RB)>; def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)), (LDAr tconstpool:$DISP, GPRC:$RB)>; @@ -571,11 +571,11 @@ //misc ext patterns -def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)), +def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))), (LDBU immSExt16:$DISP, GPRC:$RB)>; -def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)), +def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))), (LDWU immSExt16:$DISP, GPRC:$RB)>; -def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)), +def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))), (LDL immSExt16:$DISP, GPRC:$RB)>; //0 disp patterns @@ -585,17 +585,17 @@ (LDT 0, GPRC:$addr)>; def : Pat<(f32 (load GPRC:$addr)), (LDS 0, GPRC:$addr)>; -def : Pat<(i64 (sextload GPRC:$addr, i32)), +def : Pat<(i64 (sextloadi32 GPRC:$addr)), (LDL 0, GPRC:$addr)>; -def : Pat<(i64 (zextload GPRC:$addr, i16)), +def : Pat<(i64 (zextloadi16 GPRC:$addr)), (LDWU 0, GPRC:$addr)>; -def : Pat<(i64 (zextload GPRC:$addr, i8)), +def : Pat<(i64 (zextloadi8 GPRC:$addr)), (LDBU 0, GPRC:$addr)>; -def : Pat<(i64 (extload GPRC:$addr, i8)), +def : Pat<(i64 (extloadi8 GPRC:$addr)), (LDBU 0, GPRC:$addr)>; -def : Pat<(i64 (extload GPRC:$addr, i16)), +def : Pat<(i64 (extloadi16 GPRC:$addr)), (LDWU 0, GPRC:$addr)>; -def : Pat<(i64 (extload GPRC:$addr, i32)), +def : Pat<(i64 (extloadi32 GPRC:$addr)), (LDL 0, GPRC:$addr)>; def : Pat<(store GPRC:$DATA, GPRC:$addr), From evan.cheng at apple.com Mon Oct 9 15:57:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200610092057.k99KvnmS021865@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.60 -> 1.61 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+2 -3) ARMISelDAGToDAG.cpp | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.60 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.61 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.60 Mon Oct 9 11:28:33 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Oct 9 15:57:24 2006 @@ -420,8 +420,7 @@ GlobalValue *GV = cast(Op)->getGlobal(); int alignment = 2; SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, alignment); - return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr, - DAG.getSrcValue(NULL)); + return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr, NULL, 0); } static SDOperand LowerVASTART(SDOperand Op, SelectionDAG &DAG, @@ -479,7 +478,7 @@ unsigned Size = MVT::getSizeInBits(VT)/8; int FI = MFI->CreateFixedObject(Size, Offset); SDOperand FIN = DAG.getFrameIndex(FI, VT); - Value = DAG.getLoad(VT, Root, FIN, DAG.getSrcValue(NULL)); + Value = DAG.getLoad(VT, Root, FIN, NULL, 0); } else { Value = DAG.getNode(ISD::UNDEF, VT); } From evan.cheng at apple.com Mon Oct 9 15:57:51 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp LegalizeDAG.cpp SelectionDAG.cpp SelectionDAGISel.cpp TargetLowering.cpp Message-ID: <200610092057.k99KvpSO021911@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.210 -> 1.211 LegalizeDAG.cpp updated: 1.405 -> 1.406 SelectionDAG.cpp updated: 1.343 -> 1.344 SelectionDAGISel.cpp updated: 1.284 -> 1.285 TargetLowering.cpp updated: 1.74 -> 1.75 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+401 -369) DAGCombiner.cpp | 299 ++++++++++++++++++++++---------------------- LegalizeDAG.cpp | 344 +++++++++++++++++++++++++-------------------------- SelectionDAG.cpp | 91 ++++++++----- SelectionDAGISel.cpp | 15 +- TargetLowering.cpp | 21 +-- 5 files changed, 401 insertions(+), 369 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.210 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.211 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.210 Sun Oct 8 17:57:01 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Oct 9 15:57:24 2006 @@ -221,7 +221,6 @@ SDOperand visitBRCOND(SDNode *N); SDOperand visitBR_CC(SDNode *N); SDOperand visitLOAD(SDNode *N); - SDOperand visitLOADX(SDNode *N); SDOperand visitSTORE(SDNode *N); SDOperand visitINSERT_VECTOR_ELT(SDNode *N); SDOperand visitVINSERT_VECTOR_ELT(SDNode *N); @@ -499,7 +498,6 @@ case ISD::BRCOND: return visitBRCOND(N); case ISD::BR_CC: return visitBR_CC(N); case ISD::LOAD: return visitLOAD(N); - case ISD::LOADX: return visitLOADX(N); case ISD::STORE: return visitSTORE(N); case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N); case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N); @@ -1078,14 +1076,15 @@ return SDOperand(N, 0); // fold (zext_inreg (extload x)) -> (zextload x) if (ISD::isEXTLoad(N0.Val)) { - MVT::ValueType EVT = cast(N0.getOperand(3))->getVT(); + LoadSDNode *LN0 = cast(N0); + MVT::ValueType EVT = LN0->getLoadVT(); // If we zero all the possible extended bits, then we can turn this into // a zextload if we are running before legalize or the operation is legal. if (TLI.MaskedValueIsZero(N1, ~0ULL << MVT::getSizeInBits(EVT)) && (!AfterLegalize || TLI.isLoadXLegal(ISD::ZEXTLOAD, EVT))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), - EVT); + SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); AddToWorkList(N); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! @@ -1093,14 +1092,15 @@ } // fold (zext_inreg (sextload x)) -> (zextload x) iff load has one use if (ISD::isSEXTLoad(N0.Val) && N0.hasOneUse()) { - MVT::ValueType EVT = cast(N0.getOperand(3))->getVT(); + LoadSDNode *LN0 = cast(N0); + MVT::ValueType EVT = LN0->getLoadVT(); // If we zero all the possible extended bits, then we can turn this into // a zextload if we are running before legalize or the operation is legal. if (TLI.MaskedValueIsZero(N1, ~0ULL << MVT::getSizeInBits(EVT)) && (!AfterLegalize || TLI.isLoadXLegal(ISD::ZEXTLOAD, EVT))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), - EVT); + SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); AddToWorkList(N); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! @@ -1109,41 +1109,41 @@ // fold (and (load x), 255) -> (zextload x, i8) // fold (and (extload x, i16), 255) -> (zextload x, i8) - if (N1C && - (N0.getOpcode() == ISD::LOAD || ISD::isEXTLoad(N0.Val) || - ISD::isZEXTLoad(N0.Val)) && - N0.hasOneUse()) { - MVT::ValueType EVT, LoadedVT; - if (N1C->getValue() == 255) - EVT = MVT::i8; - else if (N1C->getValue() == 65535) - EVT = MVT::i16; - else if (N1C->getValue() == ~0U) - EVT = MVT::i32; - else - EVT = MVT::Other; + if (N1C && N0.getOpcode() == ISD::LOAD) { + LoadSDNode *LN0 = cast(N0); + if (LN0->getExtensionType() != ISD::SEXTLOAD && + N0.hasOneUse()) { + MVT::ValueType EVT, LoadedVT; + if (N1C->getValue() == 255) + EVT = MVT::i8; + else if (N1C->getValue() == 65535) + EVT = MVT::i16; + else if (N1C->getValue() == ~0U) + EVT = MVT::i32; + else + EVT = MVT::Other; - LoadedVT = N0.getOpcode() == ISD::LOAD ? VT : - cast(N0.getOperand(3))->getVT(); - if (EVT != MVT::Other && LoadedVT > EVT && - (!AfterLegalize || TLI.isLoadXLegal(ISD::ZEXTLOAD, EVT))) { - MVT::ValueType PtrType = N0.getOperand(1).getValueType(); - // For big endian targets, we need to add an offset to the pointer to load - // the correct bytes. For little endian systems, we merely need to read - // fewer bytes from the same pointer. - unsigned PtrOff = - (MVT::getSizeInBits(LoadedVT) - MVT::getSizeInBits(EVT)) / 8; - SDOperand NewPtr = N0.getOperand(1); - if (!TLI.isLittleEndian()) - NewPtr = DAG.getNode(ISD::ADD, PtrType, NewPtr, - DAG.getConstant(PtrOff, PtrType)); - AddToWorkList(NewPtr.Val); - SDOperand Load = - DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), NewPtr, - N0.getOperand(2), EVT); - AddToWorkList(N); - CombineTo(N0.Val, Load, Load.getValue(1)); - return SDOperand(N, 0); // Return N so it doesn't get rechecked! + LoadedVT = LN0->getLoadVT(); + if (EVT != MVT::Other && LoadedVT > EVT && + (!AfterLegalize || TLI.isLoadXLegal(ISD::ZEXTLOAD, EVT))) { + MVT::ValueType PtrType = N0.getOperand(1).getValueType(); + // For big endian targets, we need to add an offset to the pointer to + // load the correct bytes. For little endian systems, we merely need to + // read fewer bytes from the same pointer. + unsigned PtrOff = + (MVT::getSizeInBits(LoadedVT) - MVT::getSizeInBits(EVT)) / 8; + SDOperand NewPtr = LN0->getBasePtr(); + if (!TLI.isLittleEndian()) + NewPtr = DAG.getNode(ISD::ADD, PtrType, NewPtr, + DAG.getConstant(PtrOff, PtrType)); + AddToWorkList(NewPtr.Val); + SDOperand Load = + DAG.getExtLoad(ISD::ZEXTLOAD, VT, LN0->getChain(), NewPtr, + LN0->getSrcValue(), LN0->getSrcValueOffset(), EVT); + AddToWorkList(N); + CombineTo(N0.Val, Load, Load.getValue(1)); + return SDOperand(N, 0); // Return N so it doesn't get rechecked! + } } } @@ -1857,10 +1857,12 @@ } // fold (sext (load x)) -> (sext (truncate (sextload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() && (!AfterLegalize||TLI.isLoadXLegal(ISD::SEXTLOAD, N0.getValueType()))){ - SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), N0.getValueType()); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), @@ -1871,9 +1873,11 @@ // fold (sext (sextload x)) -> (sext (truncate (sextload x))) // fold (sext ( extload x)) -> (sext (truncate (sextload x))) if ((ISD::isSEXTLoad(N0.Val) || ISD::isEXTLoad(N0.Val)) && N0.hasOneUse()) { - MVT::ValueType EVT = cast(N0.getOperand(3))->getVT(); - SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), EVT); + LoadSDNode *LN0 = cast(N0); + MVT::ValueType EVT = LN0->getLoadVT(); + SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); @@ -1922,10 +1926,12 @@ } // fold (zext (load x)) -> (zext (truncate (zextload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() && (!AfterLegalize||TLI.isLoadXLegal(ISD::ZEXTLOAD, N0.getValueType()))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), N0.getValueType()); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), @@ -1936,9 +1942,11 @@ // fold (zext (zextload x)) -> (zext (truncate (zextload x))) // fold (zext ( extload x)) -> (zext (truncate (zextload x))) if ((ISD::isZEXTLoad(N0.Val) || ISD::isEXTLoad(N0.Val)) && N0.hasOneUse()) { - MVT::ValueType EVT = cast(N0.getOperand(3))->getVT(); - SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), EVT); + LoadSDNode *LN0 = cast(N0); + MVT::ValueType EVT = LN0->getLoadVT(); + SDOperand ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); @@ -1987,10 +1995,12 @@ } // fold (aext (load x)) -> (aext (truncate (extload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() && (!AfterLegalize||TLI.isLoadXLegal(ISD::EXTLOAD, N0.getValueType()))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), N0.getValueType()); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), @@ -2001,12 +2011,14 @@ // fold (aext (zextload x)) -> (aext (truncate (zextload x))) // fold (aext (sextload x)) -> (aext (truncate (sextload x))) // fold (aext ( extload x)) -> (aext (truncate (extload x))) - if (N0.getOpcode() == ISD::LOADX && N0.hasOneUse()) { - MVT::ValueType EVT = cast(N0.getOperand(3))->getVT(); - unsigned LType = N0.getConstantOperandVal(4); - SDOperand ExtLoad = DAG.getExtLoad((ISD::LoadExtType)LType, VT, - N0.getOperand(0), N0.getOperand(1), - N0.getOperand(2), EVT); + if (N0.getOpcode() == ISD::LOAD && !ISD::isNON_EXTLoad(N0.Val) && + N0.hasOneUse()) { + LoadSDNode *LN0 = cast(N0); + MVT::ValueType EVT = LN0->getLoadVT(); + SDOperand ExtLoad = DAG.getExtLoad(LN0->getExtensionType(), VT, + LN0->getChain(), LN0->getBasePtr(), + LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::TRUNCATE, N0.getValueType(), ExtLoad), ExtLoad.getValue(1)); @@ -2057,22 +2069,24 @@ // fold (sext_inreg (extload x)) -> (sextload x) if (ISD::isEXTLoad(N0.Val) && - EVT == cast(N0.getOperand(3))->getVT() && + EVT == cast(N0)->getLoadVT() && (!AfterLegalize || TLI.isLoadXLegal(ISD::SEXTLOAD, EVT))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), - EVT); + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); CombineTo(N, ExtLoad); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! } // fold (sext_inreg (zextload x)) -> (sextload x) iff load has one use if (ISD::isZEXTLoad(N0.Val) && N0.hasOneUse() && - EVT == cast(N0.getOperand(3))->getVT() && + EVT == cast(N0)->getLoadVT() && (!AfterLegalize || TLI.isLoadXLegal(ISD::SEXTLOAD, EVT))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), - EVT); + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), EVT); CombineTo(N, ExtLoad); CombineTo(N0.Val, ExtLoad, ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! @@ -2108,20 +2122,22 @@ return N0.getOperand(0); } // fold (truncate (load x)) -> (smaller load x) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { + if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse()) { assert(MVT::getSizeInBits(N0.getValueType()) > MVT::getSizeInBits(VT) && "Cannot truncate to larger type!"); + LoadSDNode *LN0 = cast(N0); MVT::ValueType PtrType = N0.getOperand(1).getValueType(); // For big endian targets, we need to add an offset to the pointer to load // the correct bytes. For little endian systems, we merely need to read // fewer bytes from the same pointer. uint64_t PtrOff = (MVT::getSizeInBits(N0.getValueType()) - MVT::getSizeInBits(VT)) / 8; - SDOperand NewPtr = TLI.isLittleEndian() ? N0.getOperand(1) : - DAG.getNode(ISD::ADD, PtrType, N0.getOperand(1), + SDOperand NewPtr = TLI.isLittleEndian() ? LN0->getBasePtr() : + DAG.getNode(ISD::ADD, PtrType, LN0->getBasePtr(), DAG.getConstant(PtrOff, PtrType)); AddToWorkList(NewPtr.Val); - SDOperand Load = DAG.getLoad(VT, N0.getOperand(0), NewPtr,N0.getOperand(2)); + SDOperand Load = DAG.getLoad(VT, LN0->getChain(), NewPtr, + LN0->getSrcValue(), LN0->getSrcValueOffset()); AddToWorkList(N); CombineTo(N0.Val, Load, Load.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! @@ -2145,9 +2161,10 @@ // fold (conv (load x)) -> (load (conv*)x) // FIXME: These xforms need to know that the resultant load doesn't need a // higher alignment than the original! - if (0 && N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) { - SDOperand Load = DAG.getLoad(VT, N0.getOperand(0), N0.getOperand(1), - N0.getOperand(2)); + if (0 && ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse()) { + LoadSDNode *LN0 = cast(N0); + SDOperand Load = DAG.getLoad(VT, LN0->getChain(), LN0->getBasePtr(), + LN0->getSrcValue(), LN0->getSrcValueOffset()); AddToWorkList(N); CombineTo(N0.Val, DAG.getNode(ISD::BIT_CONVERT, N0.getValueType(), Load), Load.getValue(1)); @@ -2517,10 +2534,12 @@ return DAG.getNode(ISD::FP_EXTEND, VT, N0); // fold (fpext (load x)) -> (fpext (fpround (extload x))) - if (N0.getOpcode() == ISD::LOAD && N0.hasOneUse() && + if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() && (!AfterLegalize||TLI.isLoadXLegal(ISD::EXTLOAD, N0.getValueType()))) { - SDOperand ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, N0.getOperand(0), - N0.getOperand(1), N0.getOperand(2), + LoadSDNode *LN0 = cast(N0); + SDOperand ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, VT, LN0->getChain(), + LN0->getBasePtr(), LN0->getSrcValue(), + LN0->getSrcValueOffset(), N0.getValueType()); CombineTo(N, ExtLoad); CombineTo(N0.Val, DAG.getNode(ISD::FP_ROUND, N0.getValueType(), ExtLoad), @@ -2616,15 +2635,18 @@ } SDOperand DAGCombiner::visitLOAD(SDNode *N) { - SDOperand Chain = N->getOperand(0); - SDOperand Ptr = N->getOperand(1); - SDOperand SrcValue = N->getOperand(2); + LoadSDNode *LD = cast(N); + SDOperand Chain = LD->getChain(); + SDOperand Ptr = LD->getBasePtr(); // If there are no uses of the loaded value, change uses of the chain value // into uses of the chain input (i.e. delete the dead load). if (N->hasNUsesOfValue(0, 0)) return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain); + if (!ISD::isNON_EXTLoad(N)) + return SDOperand(); + // If this load is directly stored, replace the load value with the stored // value. // TODO: Handle store large -> read small portion. @@ -2641,7 +2663,7 @@ if (Chain != BetterChain) { // Replace the chain to void dependency. SDOperand ReplLoad = DAG.getLoad(N->getValueType(0), BetterChain, Ptr, - SrcValue); + LD->getSrcValue(), LD->getSrcValueOffset()); // Create token factor to keep old chain connected. SDOperand Token = DAG.getNode(ISD::TokenFactor, MVT::Other, @@ -2655,21 +2677,6 @@ return SDOperand(); } -/// visitLOADX - Handle EXTLOAD/ZEXTLOAD/SEXTLOAD. -SDOperand DAGCombiner::visitLOADX(SDNode *N) { - SDOperand Chain = N->getOperand(0); - SDOperand Ptr = N->getOperand(1); - SDOperand SrcValue = N->getOperand(2); - SDOperand EVT = N->getOperand(3); - - // If there are no uses of the loaded value, change uses of the chain value - // into uses of the chain input (i.e. delete the dead load). - if (N->hasNUsesOfValue(0, 0)) - return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain); - - return SDOperand(); -} - SDOperand DAGCombiner::visitSTORE(SDNode *N) { SDOperand Chain = N->getOperand(0); SDOperand Value = N->getOperand(1); @@ -3268,47 +3275,49 @@ // of two loads with a load through a select of the address to load from. // This triggers in things like "select bool X, 10.0, 123.0" after the FP // constants have been dropped into the constant pool. - if ((LHS.getOpcode() == ISD::LOAD || - LHS.getOpcode() == ISD::LOADX ) && + if (LHS.getOpcode() == ISD::LOAD && // Token chains must be identical. - LHS.getOperand(0) == RHS.getOperand(0) && - // If this is an EXTLOAD, the VT's must match. - (LHS.getOpcode() == ISD::LOAD || - LHS.getOperand(3) == RHS.getOperand(3))) { - // FIXME: this conflates two src values, discarding one. This is not - // the right thing to do, but nothing uses srcvalues now. When they do, - // turn SrcValue into a list of locations. - SDOperand Addr; - if (TheSelect->getOpcode() == ISD::SELECT) - Addr = DAG.getNode(ISD::SELECT, LHS.getOperand(1).getValueType(), - TheSelect->getOperand(0), LHS.getOperand(1), - RHS.getOperand(1)); - else - Addr = DAG.getNode(ISD::SELECT_CC, LHS.getOperand(1).getValueType(), - TheSelect->getOperand(0), - TheSelect->getOperand(1), - LHS.getOperand(1), RHS.getOperand(1), - TheSelect->getOperand(4)); + LHS.getOperand(0) == RHS.getOperand(0)) { + LoadSDNode *LLD = cast(LHS); + LoadSDNode *RLD = cast(RHS); + + // If this is an EXTLOAD, the VT's must match. + if (LLD->getLoadVT() == RLD->getLoadVT()) { + // FIXME: this conflates two src values, discarding one. This is not + // the right thing to do, but nothing uses srcvalues now. When they do, + // turn SrcValue into a list of locations. + SDOperand Addr; + if (TheSelect->getOpcode() == ISD::SELECT) + Addr = DAG.getNode(ISD::SELECT, LLD->getBasePtr().getValueType(), + TheSelect->getOperand(0), LLD->getBasePtr(), + RLD->getBasePtr()); + else + Addr = DAG.getNode(ISD::SELECT_CC, LLD->getBasePtr().getValueType(), + TheSelect->getOperand(0), + TheSelect->getOperand(1), + LLD->getBasePtr(), RLD->getBasePtr(), + TheSelect->getOperand(4)); - SDOperand Load; - if (LHS.getOpcode() == ISD::LOAD) - Load = DAG.getLoad(TheSelect->getValueType(0), LHS.getOperand(0), - Addr, LHS.getOperand(2)); - else { - unsigned LType = LHS.getConstantOperandVal(4); - Load = DAG.getExtLoad((ISD::LoadExtType)LType, - TheSelect->getValueType(0), - LHS.getOperand(0), Addr, LHS.getOperand(2), - cast(LHS.getOperand(3))->getVT()); - } - // Users of the select now use the result of the load. - CombineTo(TheSelect, Load); + SDOperand Load; + if (LLD->getExtensionType() == ISD::NON_EXTLOAD) + Load = DAG.getLoad(TheSelect->getValueType(0), LLD->getChain(), + Addr,LLD->getSrcValue(), LLD->getSrcValueOffset()); + else { + Load = DAG.getExtLoad(LLD->getExtensionType(), + TheSelect->getValueType(0), + LLD->getChain(), Addr, LLD->getSrcValue(), + LLD->getSrcValueOffset(), + LLD->getLoadVT()); + } + // Users of the select now use the result of the load. + CombineTo(TheSelect, Load); - // Users of the old loads now use the new load's chain. We know the - // old-load value is dead now. - CombineTo(LHS.Val, Load.getValue(0), Load.getValue(1)); - CombineTo(RHS.Val, Load.getValue(0), Load.getValue(1)); - return true; + // Users of the old loads now use the new load's chain. We know the + // old-load value is dead now. + CombineTo(LHS.Val, Load.getValue(0), Load.getValue(1)); + CombineTo(RHS.Val, Load.getValue(0), Load.getValue(1)); + return true; + } } } @@ -3965,10 +3974,12 @@ /// FindAliasInfo - Extracts the relevant alias information from the memory /// node. Returns true if the operand was a load. -static bool FindAliasInfo(SDNode *N, - SDOperand &Ptr, int64_t &Size, SDOperand &SrcValue) { +static bool FindAliasInfo(SDNode *N, SDOperand &Ptr, int64_t &Size, + SDOperand &SrcValue, SelectionDAG &DAG) { switch (N->getOpcode()) { case ISD::LOAD: + if (!ISD::isNON_EXTLoad(N)) + return false; Ptr = N->getOperand(1); Size = MVT::getSizeInBits(N->getValueType(0)) >> 3; SrcValue = N->getOperand(2); @@ -3997,7 +4008,7 @@ SDOperand Ptr; int64_t Size; SDOperand SrcValue; - bool IsLoad = FindAliasInfo(N, Ptr, Size, SrcValue); + bool IsLoad = FindAliasInfo(N, Ptr, Size, SrcValue, DAG); // Starting off. Chains.push_back(OriginalChain); @@ -4024,7 +4035,7 @@ SDOperand OpPtr; int64_t OpSize; SDOperand OpSrcValue; - bool IsOpLoad = FindAliasInfo(Chain.Val, OpPtr, OpSize, OpSrcValue); + bool IsOpLoad = FindAliasInfo(Chain.Val, OpPtr, OpSize, OpSrcValue, DAG); // If chain is alias then stop here. if (!(IsLoad && IsOpLoad) && Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.405 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.406 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.405 Fri Oct 6 19:58:36 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Oct 9 15:57:24 2006 @@ -808,10 +808,9 @@ SDOperand CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); if (Extend) { Result = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), - CPIdx, DAG.getSrcValue(NULL), MVT::f32); + CPIdx, NULL, 0, MVT::f32); } else { - Result = DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL)); + Result = DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, NULL, 0); } } break; @@ -941,7 +940,7 @@ // Store the scalar value. Ch = DAG.getStore(Ch, Tmp2, StackPtr2, DAG.getSrcValue(NULL)); // Load the updated vector. - Result = DAG.getLoad(VT, Ch, StackPtr, DAG.getSrcValue(NULL)); + Result = DAG.getLoad(VT, Ch, StackPtr, NULL, 0); break; } } @@ -1335,104 +1334,106 @@ } break; case ISD::LOAD: { - Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. + LoadSDNode *LD = cast(Node); + Tmp1 = LegalizeOp(LD->getChain()); // Legalize the chain. + Tmp2 = LegalizeOp(LD->getBasePtr()); // Legalize the base pointer. - MVT::ValueType VT = Node->getValueType(0); - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); - Tmp3 = Result.getValue(0); - Tmp4 = Result.getValue(1); + ISD::LoadExtType ExtType = LD->getExtensionType(); + if (ExtType == ISD::NON_EXTLOAD) { + MVT::ValueType VT = Node->getValueType(0); + Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, LD->getOffset()); + Tmp3 = Result.getValue(0); + Tmp4 = Result.getValue(1); - switch (TLI.getOperationAction(Node->getOpcode(), VT)) { - default: assert(0 && "This action is not supported yet!"); - case TargetLowering::Legal: break; - case TargetLowering::Custom: - Tmp1 = TLI.LowerOperation(Tmp3, DAG); - if (Tmp1.Val) { - Tmp3 = LegalizeOp(Tmp1); + switch (TLI.getOperationAction(Node->getOpcode(), VT)) { + default: assert(0 && "This action is not supported yet!"); + case TargetLowering::Legal: break; + case TargetLowering::Custom: + Tmp1 = TLI.LowerOperation(Tmp3, DAG); + if (Tmp1.Val) { + Tmp3 = LegalizeOp(Tmp1); + Tmp4 = LegalizeOp(Tmp1.getValue(1)); + } + break; + case TargetLowering::Promote: { + // Only promote a load of vector type to another. + assert(MVT::isVector(VT) && "Cannot promote this load!"); + // Change base type to a different vector type. + MVT::ValueType NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT); + + Tmp1 = DAG.getLoad(NVT, Tmp1, Tmp2, LD->getSrcValue(), + LD->getSrcValueOffset()); + Tmp3 = LegalizeOp(DAG.getNode(ISD::BIT_CONVERT, VT, Tmp1)); Tmp4 = LegalizeOp(Tmp1.getValue(1)); + break; } - break; - case TargetLowering::Promote: { - // Only promote a load of vector type to another. - assert(MVT::isVector(VT) && "Cannot promote this load!"); - // Change base type to a different vector type. - MVT::ValueType NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT); - - Tmp1 = DAG.getLoad(NVT, Tmp1, Tmp2, Node->getOperand(2)); - Tmp3 = LegalizeOp(DAG.getNode(ISD::BIT_CONVERT, VT, Tmp1)); - Tmp4 = LegalizeOp(Tmp1.getValue(1)); - break; - } - } - // Since loads produce two values, make sure to remember that we - // legalized both of them. - AddLegalizedOperand(SDOperand(Node, 0), Tmp3); - AddLegalizedOperand(SDOperand(Node, 1), Tmp4); - return Op.ResNo ? Tmp4 : Tmp3; - } - case ISD::LOADX: { - Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. - - MVT::ValueType SrcVT = cast(Node->getOperand(3))->getVT(); - unsigned LType = cast(Node->getOperand(4))->getValue(); - switch (TLI.getLoadXAction(LType, SrcVT)) { - default: assert(0 && "This action is not supported yet!"); - case TargetLowering::Promote: - assert(SrcVT == MVT::i1 && "Can only promote LOADX from i1 -> i8!"); - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2), - DAG.getValueType(MVT::i8), - Node->getOperand(4)); + } + // Since loads produce two values, make sure to remember that we + // legalized both of them. + AddLegalizedOperand(SDOperand(Node, 0), Tmp3); + AddLegalizedOperand(SDOperand(Node, 1), Tmp4); + return Op.ResNo ? Tmp4 : Tmp3; + } else { + MVT::ValueType SrcVT = LD->getLoadVT(); + switch (TLI.getLoadXAction(ExtType, SrcVT)) { + default: assert(0 && "This action is not supported yet!"); + case TargetLowering::Promote: + assert(SrcVT == MVT::i1 && + "Can only promote extending LOAD from i1 -> i8!"); + Result = DAG.getExtLoad(ExtType, Node->getValueType(0), Tmp1, Tmp2, + LD->getSrcValue(), LD->getSrcValueOffset(), + MVT::i8); Tmp1 = Result.getValue(0); Tmp2 = Result.getValue(1); break; - case TargetLowering::Custom: - isCustom = true; - // FALLTHROUGH - case TargetLowering::Legal: - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2), - Node->getOperand(3), Node->getOperand(4)); - Tmp1 = Result.getValue(0); - Tmp2 = Result.getValue(1); + case TargetLowering::Custom: + isCustom = true; + // FALLTHROUGH + case TargetLowering::Legal: + Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, LD->getOffset()); + Tmp1 = Result.getValue(0); + Tmp2 = Result.getValue(1); - if (isCustom) { - Tmp3 = TLI.LowerOperation(Result, DAG); - if (Tmp3.Val) { - Tmp1 = LegalizeOp(Tmp3); - Tmp2 = LegalizeOp(Tmp3.getValue(1)); + if (isCustom) { + Tmp3 = TLI.LowerOperation(Result, DAG); + if (Tmp3.Val) { + Tmp1 = LegalizeOp(Tmp3); + Tmp2 = LegalizeOp(Tmp3.getValue(1)); + } } + break; + case TargetLowering::Expand: + // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND + if (SrcVT == MVT::f32 && Node->getValueType(0) == MVT::f64) { + SDOperand Load = DAG.getLoad(SrcVT, Tmp1, Tmp2, LD->getSrcValue(), + LD->getSrcValueOffset()); + Result = DAG.getNode(ISD::FP_EXTEND, Node->getValueType(0), Load); + Tmp1 = LegalizeOp(Result); // Relegalize new nodes. + Tmp2 = LegalizeOp(Load.getValue(1)); + break; + } + assert(ExtType != ISD::EXTLOAD && "EXTLOAD should always be supported!"); + // Turn the unsupported load into an EXTLOAD followed by an explicit + // zero/sign extend inreg. + Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), + Tmp1, Tmp2, LD->getSrcValue(), + LD->getSrcValueOffset(), SrcVT); + SDOperand ValRes; + if (ExtType == ISD::SEXTLOAD) + ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(), + Result, DAG.getValueType(SrcVT)); + else + ValRes = DAG.getZeroExtendInReg(Result, SrcVT); + Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes. + Tmp2 = LegalizeOp(Result.getValue(1)); // Relegalize new nodes. + break; } - break; - case TargetLowering::Expand: - // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND - if (SrcVT == MVT::f32 && Node->getValueType(0) == MVT::f64) { - SDOperand Load = DAG.getLoad(SrcVT, Tmp1, Tmp2, Node->getOperand(2)); - Result = DAG.getNode(ISD::FP_EXTEND, Node->getValueType(0), Load); - Tmp1 = LegalizeOp(Result); // Relegalize new nodes. - Tmp2 = LegalizeOp(Load.getValue(1)); - break; - } - assert(LType != ISD::EXTLOAD && "EXTLOAD should always be supported!"); - // Turn the unsupported load into an EXTLOAD followed by an explicit - // zero/sign extend inreg. - Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), - Tmp1, Tmp2, Node->getOperand(2), SrcVT); - SDOperand ValRes; - if (LType == ISD::SEXTLOAD) - ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(), - Result, DAG.getValueType(SrcVT)); - else - ValRes = DAG.getZeroExtendInReg(Result, SrcVT); - Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes. - Tmp2 = LegalizeOp(Result.getValue(1)); // Relegalize new nodes. - break; + // Since loads produce two values, make sure to remember that we legalized + // both of them. + AddLegalizedOperand(SDOperand(Node, 0), Tmp1); + AddLegalizedOperand(SDOperand(Node, 1), Tmp2); + return Op.ResNo ? Tmp2 : Tmp1; } - // Since loads produce two values, make sure to remember that we legalized - // both of them. - AddLegalizedOperand(SDOperand(Node, 0), Tmp1); - AddLegalizedOperand(SDOperand(Node, 1), Tmp2); - return Op.ResNo ? Tmp2 : Tmp1; } case ISD::EXTRACT_ELEMENT: { MVT::ValueType OpTy = Node->getOperand(0).getValueType(); @@ -2387,8 +2388,9 @@ } break; case TargetLowering::Expand: { + SrcValueSDNode *SV = cast(Node->getOperand(2)); SDOperand VAList = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp2, - Node->getOperand(2)); + SV->getValue(), SV->getOffset()); // Increment the pointer, VAList, to the next vaarg Tmp3 = DAG.getNode(ISD::ADD, TLI.getPointerTy(), VAList, DAG.getConstant(MVT::getSizeInBits(VT)/8, @@ -2396,7 +2398,7 @@ // Store the incremented VAList to the legalized pointer Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, Node->getOperand(2)); // Load the actual argument out of the pointer VAList - Result = DAG.getLoad(VT, Tmp3, VAList, DAG.getSrcValue(0)); + Result = DAG.getLoad(VT, Tmp3, VAList, NULL, 0); Tmp1 = LegalizeOp(Result.getValue(1)); Result = LegalizeOp(Result); break; @@ -2430,7 +2432,10 @@ case TargetLowering::Expand: // This defaults to loading a pointer from the input and storing it to the // output, returning the chain. - Tmp4 = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp3, Node->getOperand(3)); + SrcValueSDNode *SVD = cast(Node->getOperand(3)); + SrcValueSDNode *SVS = cast(Node->getOperand(4)); + Tmp4 = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp3, SVD->getValue(), + SVD->getOffset()); Result = DAG.getStore(Tmp4.getValue(1), Tmp4, Tmp2, Node->getOperand(4)); break; } @@ -2874,8 +2879,7 @@ Node->getOperand(0), StackSlot, DAG.getSrcValue(NULL), DAG.getValueType(ExtraVT)); Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), - Result, StackSlot, DAG.getSrcValue(NULL), - ExtraVT); + Result, StackSlot, NULL, 0, ExtraVT); } else { assert(0 && "Unknown op"); } @@ -3212,8 +3216,9 @@ Tmp3 = DAG.getVAArg(VT, Tmp1, Tmp2, Node->getOperand(2)); Result = TLI.CustomPromoteOperation(Tmp3, DAG); } else { + SrcValueSDNode *SV = cast(Node->getOperand(2)); SDOperand VAList = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp2, - Node->getOperand(2)); + SV->getValue(), SV->getOffset()); // Increment the pointer, VAList, to the next vaarg Tmp3 = DAG.getNode(ISD::ADD, TLI.getPointerTy(), VAList, DAG.getConstant(MVT::getSizeInBits(VT)/8, @@ -3221,28 +3226,20 @@ // Store the incremented VAList to the legalized pointer Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, Node->getOperand(2)); // Load the actual argument out of the pointer VAList - Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, Tmp3, VAList, - DAG.getSrcValue(0), VT); + Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, Tmp3, VAList, NULL, 0, VT); } // Remember that we legalized the chain. AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); break; - case ISD::LOAD: - Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, Node->getOperand(0), - Node->getOperand(1), Node->getOperand(2), VT); - // Remember that we legalized the chain. - AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); - break; - case ISD::LOADX: - Result = - DAG.getExtLoad((ISD::LoadExtType)Node->getConstantOperandVal(4), - NVT, Node->getOperand(0), Node->getOperand(1), - Node->getOperand(2), - cast(Node->getOperand(3))->getVT()); + case ISD::LOAD: { + LoadSDNode *LD = cast(Node); + Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, LD->getChain(), LD->getBasePtr(), + LD->getSrcValue(), LD->getSrcValueOffset(), VT); // Remember that we legalized the chain. AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); break; + } case ISD::SELECT: Tmp2 = PromoteOp(Node->getOperand(1)); // Legalize the op0 Tmp3 = PromoteOp(Node->getOperand(2)); // Legalize the op1 @@ -3370,7 +3367,7 @@ DAG.getConstant(EltSize, Idx.getValueType())); StackPtr = DAG.getNode(ISD::ADD, Idx.getValueType(), Idx, StackPtr); - return DAG.getLoad(Op.getValueType(), Ch, StackPtr, DAG.getSrcValue(NULL)); + return DAG.getLoad(Op.getValueType(), Ch, StackPtr, NULL, 0); } @@ -3508,7 +3505,7 @@ SDOperand Store = DAG.getStore(DAG.getEntryNode(), SrcOp, FIPtr, DAG.getSrcValue(NULL)); // Result is a load from the stack slot. - return DAG.getLoad(DestVT, Store, FIPtr, DAG.getSrcValue(0)); + return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0); } SDOperand SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) { @@ -3517,7 +3514,7 @@ SDOperand StackPtr = CreateStackTemporary(Node->getValueType(0)); SDOperand Ch = DAG.getStore(DAG.getEntryNode(), Node->getOperand(0), StackPtr, DAG.getSrcValue(NULL)); - return DAG.getLoad(Node->getValueType(0), Ch, StackPtr,DAG.getSrcValue(NULL)); + return DAG.getLoad(Node->getValueType(0), Ch, StackPtr, NULL, 0); } @@ -3581,8 +3578,7 @@ } Constant *CP = ConstantPacked::get(CV); SDOperand CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); - return DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL)); + return DAG.getLoad(VT, DAG.getEntryNode(), CPIdx, NULL, 0); } if (SplatValue.Val) { // Splat of one value? @@ -3677,7 +3673,7 @@ StoreChain = DAG.getEntryNode(); // Result is a load from the stack slot. - return DAG.getLoad(VT, StoreChain, FIPtr, DAG.getSrcValue(0)); + return DAG.getLoad(VT, StoreChain, FIPtr, NULL, 0); } /// CreateStackTemporary - Create a stack temporary, suitable for holding the @@ -3933,12 +3929,11 @@ CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestTy == MVT::f32) - FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL)); + FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx, NULL, 0); else { assert(DestTy == MVT::f64 && "Unexpected conversion"); FudgeInReg = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), - CPIdx, DAG.getSrcValue(NULL), MVT::f32); + CPIdx, NULL, 0, MVT::f32); } return DAG.getNode(ISD::FADD, DestTy, SignedConv, FudgeInReg); } @@ -4017,8 +4012,7 @@ // store the hi of the constructed double - biased exponent SDOperand Store2=DAG.getStore(Store1, InitialHi, Hi, DAG.getSrcValue(NULL)); // load the constructed double - SDOperand Load = DAG.getLoad(MVT::f64, Store2, StackSlot, - DAG.getSrcValue(NULL)); + SDOperand Load = DAG.getLoad(MVT::f64, Store2, StackSlot, NULL, 0); // FP constant to bias correct the final result SDOperand Bias = DAG.getConstantFP(isSigned ? BitsToDouble(0x4330000080000000ULL) @@ -4066,13 +4060,12 @@ CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestVT == MVT::f32) - FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL)); + FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx, NULL, 0); else { assert(DestVT == MVT::f64 && "Unexpected conversion"); FudgeInReg = LegalizeOp(DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), CPIdx, - DAG.getSrcValue(NULL), MVT::f32)); + NULL, 0, MVT::f32)); } return DAG.getNode(ISD::FADD, DestVT, Tmp1, FudgeInReg); @@ -4420,26 +4413,57 @@ } case ISD::LOAD: { - SDOperand Ch = Node->getOperand(0); // Legalize the chain. - SDOperand Ptr = Node->getOperand(1); // Legalize the pointer. - Lo = DAG.getLoad(NVT, Ch, Ptr, Node->getOperand(2)); - - // Increment the pointer to the other half. - unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8; - Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr, - getIntPtrConstant(IncrementSize)); - // FIXME: This creates a bogus srcvalue! - Hi = DAG.getLoad(NVT, Ch, Ptr, Node->getOperand(2)); - - // Build a factor node to remember that this load is independent of the - // other one. - SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1), - Hi.getValue(1)); + LoadSDNode *LD = cast(Node); + SDOperand Ch = LD->getChain(); // Legalize the chain. + SDOperand Ptr = LD->getBasePtr(); // Legalize the pointer. + ISD::LoadExtType ExtType = LD->getExtensionType(); + + if (ExtType == ISD::NON_EXTLOAD) { + Lo = DAG.getLoad(NVT, Ch, Ptr, LD->getSrcValue(), LD->getSrcValueOffset()); + + // Increment the pointer to the other half. + unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8; + Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr, + getIntPtrConstant(IncrementSize)); + // FIXME: This creates a bogus srcvalue! + Hi = DAG.getLoad(NVT, Ch, Ptr, LD->getSrcValue(), LD->getSrcValueOffset()); + + // Build a factor node to remember that this load is independent of the + // other one. + SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1), + Hi.getValue(1)); + + // Remember that we legalized the chain. + AddLegalizedOperand(Op.getValue(1), LegalizeOp(TF)); + if (!TLI.isLittleEndian()) + std::swap(Lo, Hi); + } else { + MVT::ValueType EVT = LD->getLoadVT(); + + if (EVT == NVT) + Lo = DAG.getLoad(NVT, Ch, Ptr, LD->getSrcValue(), + LD->getSrcValueOffset()); + else + Lo = DAG.getExtLoad(ExtType, NVT, Ch, Ptr, LD->getSrcValue(), + LD->getSrcValueOffset(), EVT); + + // Remember that we legalized the chain. + AddLegalizedOperand(SDOperand(Node, 1), LegalizeOp(Lo.getValue(1))); - // Remember that we legalized the chain. - AddLegalizedOperand(Op.getValue(1), LegalizeOp(TF)); - if (!TLI.isLittleEndian()) - std::swap(Lo, Hi); + if (ExtType == ISD::SEXTLOAD) { + // The high part is obtained by SRA'ing all but one of the bits of the + // lo part. + unsigned LoSize = MVT::getSizeInBits(Lo.getValueType()); + Hi = DAG.getNode(ISD::SRA, NVT, Lo, + DAG.getConstant(LoSize-1, TLI.getShiftAmountTy())); + } else if (ExtType == ISD::ZEXTLOAD) { + // The high part is just a zero. + Hi = DAG.getConstant(0, NVT); + } else /* if (ExtType == ISD::EXTLOAD) */ { + // The high part is undefined. + Hi = DAG.getNode(ISD::UNDEF, NVT); + } + } break; } case ISD::AND: @@ -4470,35 +4494,6 @@ Node->getOperand(1), TH, FH, Node->getOperand(4)); break; } - case ISD::LOADX: { - SDOperand Chain = Node->getOperand(0); - SDOperand Ptr = Node->getOperand(1); - MVT::ValueType EVT = cast(Node->getOperand(3))->getVT(); - ISD::LoadExtType LType = (ISD::LoadExtType)Node->getConstantOperandVal(4); - - if (EVT == NVT) - Lo = DAG.getLoad(NVT, Chain, Ptr, Node->getOperand(2)); - else - Lo = DAG.getExtLoad(LType, NVT, Chain, Ptr, Node->getOperand(2), EVT); - - // Remember that we legalized the chain. - AddLegalizedOperand(SDOperand(Node, 1), LegalizeOp(Lo.getValue(1))); - - if (LType == ISD::SEXTLOAD) { - // The high part is obtained by SRA'ing all but one of the bits of the lo - // part. - unsigned LoSize = MVT::getSizeInBits(Lo.getValueType()); - Hi = DAG.getNode(ISD::SRA, NVT, Lo, DAG.getConstant(LoSize-1, - TLI.getShiftAmountTy())); - } else if (LType == ISD::ZEXTLOAD) { - // The high part is just a zero. - Hi = DAG.getConstant(0, NVT); - } else /* if (LType == ISD::EXTLOAD) */ { - // The high part is undefined. - Hi = DAG.getNode(ISD::UNDEF, NVT); - } - break; - } case ISD::ANY_EXTEND: // The low part is any extension of the input (which degenerates to a copy). Lo = DAG.getNode(ISD::ANY_EXTEND, NVT, Node->getOperand(0)); @@ -4995,7 +4990,8 @@ SDOperand Ch = LegalizeOp(Node->getOperand(0)); // Legalize the chain. SDOperand Ptr = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. - Result = DAG.getLoad(NewVT, Ch, Ptr, Node->getOperand(2)); + SrcValueSDNode *SV = cast(Node->getOperand(2)); + Result = DAG.getLoad(NewVT, Ch, Ptr, SV->getValue(), SV->getOffset()); // Remember that we legalized the chain. AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.343 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.344 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.343 Thu Oct 5 17:57:11 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Oct 9 15:57:24 2006 @@ -1460,14 +1460,66 @@ SDOperand SelectionDAG::getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr, - SDOperand SV) { + const Value *SV, int SVOffset, + bool isVolatile) { + // FIXME: Alignment == 1 for now. + unsigned Alignment = 1; SDVTList VTs = getVTList(VT, MVT::Other); - - SelectionDAGCSEMap::NodeID ID(ISD::LOAD, VTs, Chain, Ptr, SV); + SDOperand Undef = getNode(ISD::UNDEF, VT); + SelectionDAGCSEMap::NodeID ID(ISD::LOAD, VTs, Chain, Ptr, Undef); + ID.AddInteger(ISD::UNINDEXED); + ID.AddInteger(ISD::NON_EXTLOAD); + ID.AddInteger(VT); + ID.AddPointer(SV); + ID.AddInteger(SVOffset); + ID.AddInteger(Alignment); + ID.AddInteger(isVolatile); void *IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode *N = new SDNode(ISD::LOAD, Chain, Ptr, SV); + SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::NON_EXTLOAD, VT, + SV, SVOffset, Alignment, isVolatile); + N->setValueTypes(VTs); + CSEMap.InsertNode(N, IP); + AllNodes.push_back(N); + return SDOperand(N, 0); +} + +SDOperand SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, MVT::ValueType VT, + SDOperand Chain, SDOperand Ptr, const Value *SV, + int SVOffset, MVT::ValueType EVT, + bool isVolatile) { + // If they are asking for an extending load from/to the same thing, return a + // normal load. + if (VT == EVT) + ExtType = ISD::NON_EXTLOAD; + + if (MVT::isVector(VT)) + assert(EVT == MVT::getVectorBaseType(VT) && "Invalid vector extload!"); + else + assert(EVT < VT && "Should only be an extending load, not truncating!"); + assert((ExtType == ISD::EXTLOAD || MVT::isInteger(VT)) && + "Cannot sign/zero extend a FP/Vector load!"); + assert(MVT::isInteger(VT) == MVT::isInteger(EVT) && + "Cannot convert from FP to Int or Int -> FP!"); + + // FIXME: Alignment == 1 for now. + unsigned Alignment = 1; + SDVTList VTs = getVTList(VT, MVT::Other); + SDOperand Undef = getNode(ISD::UNDEF, VT); + SelectionDAGCSEMap::NodeID ID(ISD::LOAD, VTs, Chain, Ptr, Undef); + ID.AddInteger(ISD::UNINDEXED); + ID.AddInteger(ExtType); + ID.AddInteger(EVT); + ID.AddPointer(SV); + ID.AddInteger(SVOffset); + ID.AddInteger(Alignment); + ID.AddInteger(isVolatile); + void *IP = 0; + if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) + return SDOperand(E, 0); + SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ExtType, EVT, SV, SVOffset, + Alignment, isVolatile); N->setValueTypes(VTs); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); @@ -1482,14 +1534,6 @@ return getNode(ISD::VLOAD, getVTList(MVT::Vector, MVT::Other), Ops, 5); } -SDOperand SelectionDAG::getExtLoad(ISD::LoadExtType LType, MVT::ValueType VT, - SDOperand Chain, SDOperand Ptr, SDOperand SV, - MVT::ValueType EVT) { - SDOperand Ops[] = { Chain, Ptr, SV, getValueType(EVT), - getConstant(LType, MVT::i32) }; - return getNode(ISD::LOADX, getVTList(VT, MVT::Other), Ops, 5); -} - SDOperand SelectionDAG::getStore(SDOperand Chain, SDOperand Value, SDOperand Ptr, SDOperand SV) { SDVTList VTs = getVTList(MVT::Other); @@ -1602,28 +1646,6 @@ return getNode(Opcode, VTList.VTs[0], Ops, NumOps); switch (Opcode) { - case ISD::LOADX: { - MVT::ValueType EVT = cast(Ops[3])->getVT(); - unsigned LType = cast(Ops[4])->getValue(); - assert(NumOps == 5 && VTList.NumVTs == 2 && "Bad *EXTLOAD!"); - // If they are asking for an extending load from/to the same thing, return a - // normal load. - if (VTList.VTs[0] == EVT) - return getLoad(VTList.VTs[0], Ops[0], Ops[1], Ops[2]); - if (MVT::isVector(VTList.VTs[0])) { - assert(EVT == MVT::getVectorBaseType(VTList.VTs[0]) && - "Invalid vector extload!"); - } else { - assert(EVT < VTList.VTs[0] && - "Should only be an extending load, not truncating!"); - } - assert((LType == ISD::EXTLOAD || MVT::isInteger(VTList.VTs[0])) && - "Cannot sign/zero extend a FP/Vector load!"); - assert(MVT::isInteger(VTList.VTs[0]) == MVT::isInteger(EVT) && - "Cannot convert from FP to Int or Int -> FP!"); - break; - } - // FIXME: figure out how to safely handle things like // int foo(int x) { return 1 << (x & 255); } // int bar() { return foo(256); } @@ -2545,7 +2567,6 @@ case ISD::LOAD: return "load"; case ISD::STORE: return "store"; case ISD::VLOAD: return "vload"; - case ISD::LOADX: return "loadx"; case ISD::TRUNCSTORE: return "truncstore"; case ISD::VAARG: return "vaarg"; case ISD::VACOPY: return "vacopy"; Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.284 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.285 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.284 Fri Oct 6 17:32:29 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Oct 9 15:57:24 2006 @@ -460,7 +460,7 @@ void setCurrentBasicBlock(MachineBasicBlock *MBB) { CurMBB = MBB; } SDOperand getLoadFrom(const Type *Ty, SDOperand Ptr, - SDOperand SrcValue, SDOperand Root, + const Value *SV, SDOperand Root, bool isVolatile); SDOperand getIntPtrConstant(uint64_t Val) { @@ -859,7 +859,7 @@ SDOperand TAB = DAG.getJumpTable(JT.JTI,PTy); SDOperand ADD = DAG.getNode(ISD::ADD, PTy, IDX, TAB); SDOperand LD = DAG.getLoad(isPIC ? MVT::i32 : PTy, Copy.getValue(1), ADD, - DAG.getSrcValue(0)); + NULL, 0); if (isPIC) { // For Pic, the sequence is: // BRIND(load(Jumptable + index) + RelocBase) @@ -1360,19 +1360,20 @@ Root = DAG.getRoot(); } - setValue(&I, getLoadFrom(I.getType(), Ptr, DAG.getSrcValue(I.getOperand(0)), + setValue(&I, getLoadFrom(I.getType(), Ptr, I.getOperand(0), Root, I.isVolatile())); } SDOperand SelectionDAGLowering::getLoadFrom(const Type *Ty, SDOperand Ptr, - SDOperand SrcValue, SDOperand Root, + const Value *SV, SDOperand Root, bool isVolatile) { SDOperand L; if (const PackedType *PTy = dyn_cast(Ty)) { MVT::ValueType PVT = TLI.getValueType(PTy->getElementType()); - L = DAG.getVecLoad(PTy->getNumElements(), PVT, Root, Ptr, SrcValue); + L = DAG.getVecLoad(PTy->getNumElements(), PVT, Root, Ptr, + DAG.getSrcValue(SV)); } else { - L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SrcValue); + L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SV, isVolatile); } if (isVolatile) @@ -2909,7 +2910,7 @@ } else { Value = DAG.getLoad(VT, getRoot(), getMemBasePlusOffset(Op2, SrcOff, DAG, TLI), - DAG.getSrcValue(I.getOperand(2), SrcOff)); + I.getOperand(2), SrcOff); Chain = Value.getValue(1); Store = DAG.getStore(Chain, Value, Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp diff -u llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.74 llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.75 --- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.74 Fri Oct 6 17:52:08 2006 +++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Oct 9 15:57:24 2006 @@ -552,9 +552,10 @@ KnownOne = 0; break; } - case ISD::LOADX: { + case ISD::LOAD: { if (ISD::isZEXTLoad(Op.Val)) { - MVT::ValueType VT = cast(Op.getOperand(3))->getVT(); + LoadSDNode *LD = cast(Op); + MVT::ValueType VT = LD->getLoadVT(); KnownZero |= ~MVT::getIntVTBitMask(VT) & DemandedMask; } break; @@ -892,9 +893,10 @@ KnownOne = 0; return; } - case ISD::LOADX: { + case ISD::LOAD: { if (ISD::isZEXTLoad(Op.Val)) { - MVT::ValueType VT = cast(Op.getOperand(3))->getVT(); + LoadSDNode *LD = cast(Op); + MVT::ValueType VT = LD->getLoadVT(); KnownZero |= ~MVT::getIntVTBitMask(VT) & Mask; } return; @@ -1197,15 +1199,16 @@ } // Handle LOADX separately here. EXTLOAD case will fallthrough. - if (Op.getOpcode() == ISD::LOADX) { - unsigned LType = Op.getConstantOperandVal(4); - switch (LType) { + if (Op.getOpcode() == ISD::LOAD) { + LoadSDNode *LD = cast(Op); + unsigned ExtType = LD->getExtensionType(); + switch (ExtType) { default: break; case ISD::SEXTLOAD: // '17' bits known - Tmp = MVT::getSizeInBits(cast(Op.getOperand(3))->getVT()); + Tmp = MVT::getSizeInBits(LD->getLoadVT()); return VTBits-Tmp+1; case ISD::ZEXTLOAD: // '16' bits known - Tmp = MVT::getSizeInBits(cast(Op.getOperand(3))->getVT()); + Tmp = MVT::getSizeInBits(LD->getLoadVT()); return VTBits-Tmp; } } From evan.cheng at apple.com Mon Oct 9 15:57:50 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:50 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86InstrFPStack.td X86InstrInfo.td X86InstrSSE.td X86InstrX86-64.td Message-ID: <200610092057.k99KvoNw021885@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.111 -> 1.112 X86ISelLowering.cpp updated: 1.271 -> 1.272 X86InstrFPStack.td updated: 1.6 -> 1.7 X86InstrInfo.td updated: 1.287 -> 1.288 X86InstrSSE.td updated: 1.162 -> 1.163 X86InstrX86-64.td updated: 1.3 -> 1.4 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+72 -83) X86ISelDAGToDAG.cpp | 8 ++--- X86ISelLowering.cpp | 77 ++++++++++++++++++++++------------------------------ X86InstrFPStack.td | 2 - X86InstrInfo.td | 38 ++++++++++++------------- X86InstrSSE.td | 2 - X86InstrX86-64.td | 28 +++++++++--------- 6 files changed, 72 insertions(+), 83 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.111 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.112 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.111 Sat Oct 7 16:55:32 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Oct 9 15:57:25 2006 @@ -346,9 +346,9 @@ case ISD::ADDE: { SDOperand N10 = N1.getOperand(0); SDOperand N11 = N1.getOperand(1); - if (N10.Val->getOpcode() == ISD::LOAD) + if (ISD::isNON_EXTLoad(N10.Val)) RModW = true; - else if (N11.Val->getOpcode() == ISD::LOAD) { + else if (ISD::isNON_EXTLoad(N11.Val)) { RModW = true; std::swap(N10, N11); } @@ -370,7 +370,7 @@ case X86ISD::SHLD: case X86ISD::SHRD: { SDOperand N10 = N1.getOperand(0); - if (N10.Val->getOpcode() == ISD::LOAD) + if (ISD::isNON_EXTLoad(N10.Val)) RModW = N10.Val->isOperand(Chain.Val) && N10.hasOneUse() && (N10.getOperand(1) == N2) && (N10.Val->getValueType(0) == N1.getValueType()); @@ -806,7 +806,7 @@ bool X86DAGToDAGISel::TryFoldLoad(SDOperand P, SDOperand N, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp) { - if (N.getOpcode() == ISD::LOAD && + if (ISD::isNON_EXTLoad(N.Val) && N.hasOneUse() && CanBeFoldedBy(N.Val, P.Val)) return SelectAddr(N.getOperand(1), Base, Scale, Index, Disp); Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.271 llvm/lib/Target/X86/X86ISelLowering.cpp:1.272 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.271 Thu Oct 5 18:01:46 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 9 15:57:25 2006 @@ -490,8 +490,7 @@ // Create the frame index object for this incoming parameter... int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); ArgValues.push_back(ArgValue); ArgOffset += ArgIncrement; // Move on to the next argument... } @@ -763,8 +762,7 @@ Ops.push_back(DAG.getValueType(RetVT)); Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size()); - RetVal = DAG.getLoad(RetVT, Chain, StackSlot, - DAG.getSrcValue(NULL)); + RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0); Chain = RetVal.getValue(1); } @@ -963,8 +961,7 @@ // parameter. int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); ArgOffset += ArgIncrement; // Move on to the next argument. } @@ -1470,11 +1467,10 @@ SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); if (ObjectVT == MVT::i64 && ObjIntRegs) { SDOperand ArgValue2 = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + NULL, 0); ArgValue = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2); } else - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); ArgOffset += ArgIncrement; // Move on to the next argument. } @@ -1800,8 +1796,7 @@ Ops.push_back(DAG.getValueType(RetVT)); Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size()); - RetVal = DAG.getLoad(RetVT, Chain, StackSlot, - DAG.getSrcValue(NULL)); + RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0); Chain = RetVal.getValue(1); } @@ -1880,8 +1875,7 @@ // Create the frame index object for this incoming parameter... int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); ArgValues.push_back(ArgValue); ArgOffset += ArgIncrement; // Move on to the next argument... } @@ -2086,8 +2080,7 @@ Ops.push_back(DAG.getValueType(RetVT)); Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size()); - RetVal = DAG.getLoad(RetVT, Chain, StackSlot, - DAG.getSrcValue(NULL)); + RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0); Chain = RetVal.getValue(1); } @@ -2251,11 +2244,10 @@ SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); if (ObjectVT == MVT::i64 && ObjIntRegs) { SDOperand ArgValue2 = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + NULL, 0); ArgValue = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2); } else - ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, - DAG.getSrcValue(NULL)); + ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0); ArgOffset += ArgIncrement; // Move on to the next argument. } @@ -2329,7 +2321,7 @@ if (!isFrameAddress) // Just load the return address Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), RetAddrFI, - DAG.getSrcValue(NULL)); + NULL, 0); else Result = DAG.getNode(ISD::SUB, getPointerTy(), RetAddrFI, DAG.getConstant(4, getPointerTy())); @@ -3051,7 +3043,7 @@ static inline bool isScalarLoadToVector(SDNode *N) { if (N->getOpcode() == ISD::SCALAR_TO_VECTOR) { N = N->getOperand(0).Val; - return (N->getOpcode() == ISD::LOAD); + return ISD::isNON_EXTLoad(N); } return false; } @@ -3062,7 +3054,7 @@ /// half of V2 (and in order). And since V1 will become the source of the /// MOVLP, it must be either a vector load or a scalar load to vector. static bool ShouldXformToMOVLP(SDNode *V1, SDNode *Mask) { - if (V1->getOpcode() != ISD::LOAD && !isScalarLoadToVector(V1)) + if (!ISD::isNON_EXTLoad(V1) && !isScalarLoadToVector(V1)) return false; unsigned NumElems = Mask->getNumOperands(); @@ -3809,10 +3801,11 @@ // Use two pinsrw instructions to insert a 32 bit value. Idx <<= 1; if (MVT::isFloatingPoint(N1.getValueType())) { - if (N1.getOpcode() == ISD::LOAD) { + if (ISD::isNON_EXTLoad(N1.Val)) { // Just load directly from f32mem to GR32. - N1 = DAG.getLoad(MVT::i32, N1.getOperand(0), N1.getOperand(1), - N1.getOperand(2)); + LoadSDNode *LD = cast(N1); + N1 = DAG.getLoad(MVT::i32, LD->getChain(), LD->getBasePtr(), + LD->getSrcValue(), LD->getSrcValueOffset()); } else { N1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, MVT::v4f32, N1); N1 = DAG.getNode(ISD::BIT_CONVERT, MVT::v4i32, N1); @@ -3883,14 +3876,11 @@ // not the GV offset field. if (getTargetMachine().getRelocationModel() != Reloc::Static && DarwinGVRequiresExtraLoad(GV)) - Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), - Result, DAG.getSrcValue(NULL)); + Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); } else if (Subtarget->isTargetCygwin() || Subtarget->isTargetWindows()) { - // FIXME: What's about PIC? - if (WindowsGVRequiresExtraLoad(GV)) { - Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), - Result, DAG.getSrcValue(NULL)); - } + // FIXME: What about PIC? + if (WindowsGVRequiresExtraLoad(GV)) + Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); } @@ -4028,8 +4018,7 @@ Ops.push_back(DAG.getValueType(Op.getValueType())); Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size()); - Result = DAG.getLoad(Op.getValueType(), Chain, StackSlot, - DAG.getSrcValue(NULL)); + Result = DAG.getLoad(Op.getValueType(), Chain, StackSlot, NULL, 0); } return Result; @@ -4079,8 +4068,7 @@ SDOperand FIST = DAG.getNode(Opc, MVT::Other, &Ops[0], Ops.size()); // Load the result. - return DAG.getLoad(Op.getValueType(), FIST, StackSlot, - DAG.getSrcValue(NULL)); + return DAG.getLoad(Op.getValueType(), FIST, StackSlot, NULL, 0); } SDOperand X86TargetLowering::LowerFABS(SDOperand Op, SelectionDAG &DAG) { @@ -4364,7 +4352,7 @@ SDOperand Chain = Op.getOperand(0); SDOperand Value = Op.getOperand(1); - if (Value.getOpcode() == ISD::LOAD && + if (ISD::isNON_EXTLoad(Value.Val) && (Chain == Value.getValue(1) || Chain == Value.getOperand(0))) { Chain = Value.getOperand(0); MemLoc = Value.getOperand(1); @@ -4708,7 +4696,7 @@ Value = DAG.getLoad(MVT::i32, Chain, DAG.getNode(ISD::ADD, SrcVT, SrcAddr, DAG.getConstant(Offset, SrcVT)), - DAG.getSrcValue(NULL)); + NULL, 0); Chain = Value.getValue(1); Chain = DAG.getStore(Chain, Value, DAG.getNode(ISD::ADD, DstVT, DstAddr, @@ -4721,7 +4709,7 @@ Value = DAG.getLoad(MVT::i16, Chain, DAG.getNode(ISD::ADD, SrcVT, SrcAddr, DAG.getConstant(Offset, SrcVT)), - DAG.getSrcValue(NULL)); + NULL, 0); Chain = Value.getValue(1); Chain = DAG.getStore(Chain, Value, DAG.getNode(ISD::ADD, DstVT, DstAddr, @@ -4735,7 +4723,7 @@ Value = DAG.getLoad(MVT::i8, Chain, DAG.getNode(ISD::ADD, SrcVT, SrcAddr, DAG.getConstant(Offset, SrcVT)), - DAG.getSrcValue(NULL)); + NULL, 0); Chain = Value.getValue(1); Chain = DAG.getStore(Chain, Value, DAG.getNode(ISD::ADD, DstVT, DstAddr, @@ -5328,7 +5316,7 @@ } else { SDOperand Arg = getShuffleScalarElt(N, cast(Idx)->getValue(), DAG); - if (!Arg.Val || Arg.getOpcode() != ISD::LOAD) + if (!Arg.Val || !ISD::isNON_EXTLoad(Arg.Val)) return SDOperand(); if (!Base) Base = Arg.Val; @@ -5339,10 +5327,11 @@ } bool isAlign16 = isBaseAlignment16(Base->getOperand(1).Val, MFI, Subtarget); - if (isAlign16) - return DAG.getLoad(VT, Base->getOperand(0), Base->getOperand(1), - Base->getOperand(2)); - else { + if (isAlign16) { + LoadSDNode *LD = cast(Base); + return DAG.getLoad(VT, LD->getChain(), LD->getBasePtr(), LD->getSrcValue(), + LD->getSrcValueOffset()); + } else { // Just use movups, it's shorter. std::vector Tys; Tys.push_back(MVT::v4f32); Index: llvm/lib/Target/X86/X86InstrFPStack.td diff -u llvm/lib/Target/X86/X86InstrFPStack.td:1.6 llvm/lib/Target/X86/X86InstrFPStack.td:1.7 --- llvm/lib/Target/X86/X86InstrFPStack.td:1.6 Fri Mar 24 01:29:27 2006 +++ llvm/lib/Target/X86/X86InstrFPStack.td Mon Oct 9 15:57:25 2006 @@ -66,7 +66,7 @@ return N->isExactlyValue(-1.0); }]>; -def extloadf64f32 : PatFrag<(ops node:$ptr), (f64 (extload node:$ptr, f32))>; +def extloadf64f32 : PatFrag<(ops node:$ptr), (f64 (extloadf32 node:$ptr))>; // Some 'special' instructions let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler. Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.287 llvm/lib/Target/X86/X86InstrInfo.td:1.288 --- llvm/lib/Target/X86/X86InstrInfo.td:1.287 Fri Sep 22 16:43:59 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Oct 9 15:57:25 2006 @@ -297,25 +297,25 @@ def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>; def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>; -def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i1))>; -def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i1))>; -def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i8))>; -def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i8))>; -def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i16))>; - -def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextload node:$ptr, i1))>; -def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i1))>; -def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i1))>; -def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i8))>; -def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i8))>; -def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i16))>; - -def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extload node:$ptr, i1))>; -def extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extload node:$ptr, i1))>; -def extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extload node:$ptr, i1))>; -def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extload node:$ptr, i8))>; -def extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extload node:$ptr, i8))>; -def extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extload node:$ptr, i16))>; +def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextloadi1 node:$ptr))>; +def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextloadi1 node:$ptr))>; +def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>; +def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>; +def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>; + +def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>; +def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>; +def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>; +def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>; +def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>; +def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>; + +def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>; +def extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>; +def extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>; +def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>; +def extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>; +def extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>; //===----------------------------------------------------------------------===// // Instruction templates... Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.162 llvm/lib/Target/X86/X86InstrSSE.td:1.163 --- llvm/lib/Target/X86/X86InstrSSE.td:1.162 Sat Oct 7 16:55:32 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Mon Oct 9 15:57:25 2006 @@ -467,7 +467,7 @@ Requires<[HasSSE2]>; def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src), "cvtss2sd {$src, $dst|$dst, $src}", - [(set FR64:$dst, (extload addr:$src, f32))]>, XS, + [(set FR64:$dst, (extloadf32 addr:$src))]>, XS, Requires<[HasSSE2]>; // Match intrinsics which expect XMM operand(s). Index: llvm/lib/Target/X86/X86InstrX86-64.td diff -u llvm/lib/Target/X86/X86InstrX86-64.td:1.3 llvm/lib/Target/X86/X86InstrX86-64.td:1.4 --- llvm/lib/Target/X86/X86InstrX86-64.td:1.3 Sun Sep 10 21:19:56 2006 +++ llvm/lib/Target/X86/X86InstrX86-64.td Mon Oct 9 15:57:25 2006 @@ -84,20 +84,20 @@ return (int64_t)N->getValue() == (int8_t)N->getValue(); }]>; -def sextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (sextload node:$ptr, i1))>; -def sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextload node:$ptr, i8))>; -def sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextload node:$ptr, i16))>; -def sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextload node:$ptr, i32))>; - -def zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextload node:$ptr, i1))>; -def zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextload node:$ptr, i8))>; -def zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextload node:$ptr, i16))>; -def zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextload node:$ptr, i32))>; - -def extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extload node:$ptr, i1))>; -def extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extload node:$ptr, i8))>; -def extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extload node:$ptr, i16))>; -def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extload node:$ptr, i32))>; +def sextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (sextloadi1 node:$ptr))>; +def sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>; +def sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>; +def sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>; + +def zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>; +def zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>; +def zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>; +def zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>; + +def extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>; +def extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>; +def extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>; +def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extloadi32 node:$ptr))>; //===----------------------------------------------------------------------===// // Instruction list... From evan.cheng at apple.com Mon Oct 9 15:57:51 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp PPCInstr64Bit.td PPCInstrInfo.td Message-ID: <200610092057.k99Kvplu021907@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.210 -> 1.211 PPCInstr64Bit.td updated: 1.20 -> 1.21 PPCInstrInfo.td updated: 1.243 -> 1.244 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+49 -50) PPCISelLowering.cpp | 27 +++++++++++++-------------- PPCInstr64Bit.td | 40 ++++++++++++++++++++-------------------- PPCInstrInfo.td | 32 ++++++++++++++++---------------- 3 files changed, 49 insertions(+), 50 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.210 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.211 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.210 Thu Oct 5 18:00:19 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Mon Oct 9 15:57:25 2006 @@ -311,7 +311,7 @@ static bool isFloatingPointZero(SDOperand Op) { if (ConstantFPSDNode *CFP = dyn_cast(Op)) return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0); - else if (ISD::isEXTLoad(Op.Val) || Op.getOpcode() == ISD::LOAD) { + else if (ISD::isEXTLoad(Op.Val) || ISD::isNON_EXTLoad(Op.Val)) { // Maybe this has already been legalized into the constant pool? if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(1))) if (ConstantFP *CFP = dyn_cast(CP->getConstVal())) @@ -694,7 +694,7 @@ // If the global is weak or external, we have to go through the lazy // resolution stub. - return DAG.getLoad(PtrVT, DAG.getEntryNode(), Lo, DAG.getSrcValue(0)); + return DAG.getLoad(PtrVT, DAG.getEntryNode(), Lo, NULL, 0); } static SDOperand LowerSETCC(SDOperand Op, SelectionDAG &DAG) { @@ -873,8 +873,7 @@ if (!Op.Val->hasNUsesOfValue(0, ArgNo)) { int FI = MFI->CreateFixedObject(ObjSize, CurArgOffset); SDOperand FIN = DAG.getFrameIndex(FI, PtrVT); - ArgVal = DAG.getLoad(ObjectVT, Root, FIN, - DAG.getSrcValue(NULL)); + ArgVal = DAG.getLoad(ObjectVT, Root, FIN, NULL, 0); } else { // Don't emit a dead load. ArgVal = DAG.getNode(ISD::UNDEF, ObjectVT); @@ -1051,16 +1050,14 @@ // Float varargs are always shadowed in available integer registers if (GPR_idx != NumGPRs) { - SDOperand Load = DAG.getLoad(PtrVT, Store, PtrOff, - DAG.getSrcValue(NULL)); + SDOperand Load = DAG.getLoad(PtrVT, Store, PtrOff, NULL, 0); MemOpChains.push_back(Load.getValue(1)); RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); } if (GPR_idx != NumGPRs && Arg.getValueType() == MVT::f64) { SDOperand ConstFour = DAG.getConstant(4, PtrOff.getValueType()); PtrOff = DAG.getNode(ISD::ADD, PtrVT, PtrOff, ConstFour); - SDOperand Load = DAG.getLoad(PtrVT, Store, PtrOff, - DAG.getSrcValue(NULL)); + SDOperand Load = DAG.getLoad(PtrVT, Store, PtrOff, NULL, 0); MemOpChains.push_back(Load.getValue(1)); RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); } @@ -1401,7 +1398,7 @@ DAG.getEntryNode(), Ext64, FIdx, DAG.getSrcValue(NULL)); // Load the value as a double. - SDOperand Ld = DAG.getLoad(MVT::f64, Store, FIdx, DAG.getSrcValue(NULL)); + SDOperand Ld = DAG.getLoad(MVT::f64, Store, FIdx, NULL, 0); // FCFID it and return it. SDOperand FP = DAG.getNode(PPCISD::FCFID, MVT::f64, Ld); @@ -2124,7 +2121,7 @@ SDOperand Store = DAG.getStore(DAG.getEntryNode(), Op.getOperand(0), FIdx,DAG.getSrcValue(NULL)); // Load it out. - return DAG.getLoad(Op.getValueType(), Store, FIdx, DAG.getSrcValue(NULL)); + return DAG.getLoad(Op.getValueType(), Store, FIdx, NULL, 0); } static SDOperand LowerMUL(SDOperand Op, SelectionDAG &DAG) { @@ -2383,18 +2380,20 @@ break; case ISD::BSWAP: // Turn BSWAP (LOAD) -> lhbrx/lwbrx. - if (N->getOperand(0).getOpcode() == ISD::LOAD && + if (ISD::isNON_EXTLoad(N->getOperand(0).Val) && N->getOperand(0).hasOneUse() && (N->getValueType(0) == MVT::i32 || N->getValueType(0) == MVT::i16)) { SDOperand Load = N->getOperand(0); + LoadSDNode *LD = cast(Load); // Create the byte-swapping load. std::vector VTs; VTs.push_back(MVT::i32); VTs.push_back(MVT::Other); + SDOperand SV = DAG.getSrcValue(LD->getSrcValue(), LD->getSrcValueOffset()); SDOperand Ops[] = { - Load.getOperand(0), // Chain - Load.getOperand(1), // Ptr - Load.getOperand(2), // SrcValue + LD->getChain(), // Chain + LD->getBasePtr(), // Ptr + SV, // SrcValue DAG.getValueType(N->getValueType(0)) // VT }; SDOperand BSLoad = DAG.getNode(PPCISD::LBRX, VTs, Ops, 4); Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td diff -u llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.20 llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.21 --- llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.20 Thu Sep 28 15:48:45 2006 +++ llvm/lib/Target/PowerPC/PPCInstr64Bit.td Mon Oct 9 15:57:25 2006 @@ -233,41 +233,41 @@ // Sign extending loads. def LHA8: DForm_1<42, (ops G8RC:$rD, memri:$src), "lha $rD, $src", LdStLHA, - [(set G8RC:$rD, (sextload iaddr:$src, i16))]>, + [(set G8RC:$rD, (sextloadi16 iaddr:$src))]>, PPC970_DGroup_Cracked; def LWA : DSForm_1<58, 2, (ops G8RC:$rD, memrix:$src), "lwa $rD, $src", LdStLWA, - [(set G8RC:$rD, (sextload ixaddr:$src, i32))]>, isPPC64, + [(set G8RC:$rD, (sextloadi32 ixaddr:$src))]>, isPPC64, PPC970_DGroup_Cracked; def LHAX8: XForm_1<31, 343, (ops G8RC:$rD, memrr:$src), "lhax $rD, $src", LdStLHA, - [(set G8RC:$rD, (sextload xaddr:$src, i16))]>, + [(set G8RC:$rD, (sextloadi16 xaddr:$src))]>, PPC970_DGroup_Cracked; def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), "lwax $rD, $src", LdStLHA, - [(set G8RC:$rD, (sextload xaddr:$src, i32))]>, isPPC64, + [(set G8RC:$rD, (sextloadi32 xaddr:$src))]>, isPPC64, PPC970_DGroup_Cracked; // Zero extending loads. def LBZ8 : DForm_1<34, (ops G8RC:$rD, memri:$src), "lbz $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload iaddr:$src, i8))]>; + [(set G8RC:$rD, (zextloadi8 iaddr:$src))]>; def LHZ8 : DForm_1<40, (ops G8RC:$rD, memri:$src), "lhz $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload iaddr:$src, i16))]>; + [(set G8RC:$rD, (zextloadi16 iaddr:$src))]>; def LWZ8 : DForm_1<32, (ops G8RC:$rD, memri:$src), "lwz $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload iaddr:$src, i32))]>, isPPC64; + [(set G8RC:$rD, (zextloadi32 iaddr:$src))]>, isPPC64; def LBZX8 : XForm_1<31, 87, (ops G8RC:$rD, memrr:$src), "lbzx $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload xaddr:$src, i8))]>; + [(set G8RC:$rD, (zextloadi8 xaddr:$src))]>; def LHZX8 : XForm_1<31, 279, (ops G8RC:$rD, memrr:$src), "lhzx $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload xaddr:$src, i16))]>; + [(set G8RC:$rD, (zextloadi16 xaddr:$src))]>; def LWZX8 : XForm_1<31, 23, (ops G8RC:$rD, memrr:$src), "lwzx $rD, $src", LdStGeneral, - [(set G8RC:$rD, (zextload xaddr:$src, i32))]>; + [(set G8RC:$rD, (zextloadi32 xaddr:$src))]>; // Full 8-byte loads. @@ -397,25 +397,25 @@ (OR8To4 G8RC:$in, G8RC:$in)>; // Extending loads with i64 targets. -def : Pat<(zextload iaddr:$src, i1), +def : Pat<(zextloadi1 iaddr:$src), (LBZ8 iaddr:$src)>; -def : Pat<(zextload xaddr:$src, i1), +def : Pat<(zextloadi1 xaddr:$src), (LBZX8 xaddr:$src)>; -def : Pat<(extload iaddr:$src, i1), +def : Pat<(extloadi1 iaddr:$src), (LBZ8 iaddr:$src)>; -def : Pat<(extload xaddr:$src, i1), +def : Pat<(extloadi1 xaddr:$src), (LBZX8 xaddr:$src)>; -def : Pat<(extload iaddr:$src, i8), +def : Pat<(extloadi8 iaddr:$src), (LBZ8 iaddr:$src)>; -def : Pat<(extload xaddr:$src, i8), +def : Pat<(extloadi8 xaddr:$src), (LBZX8 xaddr:$src)>; -def : Pat<(extload iaddr:$src, i16), +def : Pat<(extloadi16 iaddr:$src), (LHZ8 iaddr:$src)>; -def : Pat<(extload xaddr:$src, i16), +def : Pat<(extloadi16 xaddr:$src), (LHZX8 xaddr:$src)>; -def : Pat<(extload iaddr:$src, i32), +def : Pat<(extloadi32 iaddr:$src), (LWZ8 iaddr:$src)>; -def : Pat<(extload xaddr:$src, i32), +def : Pat<(extloadi32 xaddr:$src), (LWZX8 xaddr:$src)>; // SHL/SRL Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.243 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.244 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.243 Tue Sep 26 21:55:21 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Mon Oct 9 15:57:25 2006 @@ -379,14 +379,14 @@ let isLoad = 1, PPC970_Unit = 2 in { def LBZ : DForm_1<34, (ops GPRC:$rD, memri:$src), "lbz $rD, $src", LdStGeneral, - [(set GPRC:$rD, (zextload iaddr:$src, i8))]>; + [(set GPRC:$rD, (zextloadi8 iaddr:$src))]>; def LHA : DForm_1<42, (ops GPRC:$rD, memri:$src), "lha $rD, $src", LdStLHA, - [(set GPRC:$rD, (sextload iaddr:$src, i16))]>, + [(set GPRC:$rD, (sextloadi16 iaddr:$src))]>, PPC970_DGroup_Cracked; def LHZ : DForm_1<40, (ops GPRC:$rD, memri:$src), "lhz $rD, $src", LdStGeneral, - [(set GPRC:$rD, (zextload iaddr:$src, i16))]>; + [(set GPRC:$rD, (zextloadi16 iaddr:$src))]>; def LWZ : DForm_1<32, (ops GPRC:$rD, memri:$src), "lwz $rD, $src", LdStGeneral, [(set GPRC:$rD, (load iaddr:$src))]>; @@ -490,14 +490,14 @@ let isLoad = 1, PPC970_Unit = 2 in { def LBZX : XForm_1<31, 87, (ops GPRC:$rD, memrr:$src), "lbzx $rD, $src", LdStGeneral, - [(set GPRC:$rD, (zextload xaddr:$src, i8))]>; + [(set GPRC:$rD, (zextloadi8 xaddr:$src))]>; def LHAX : XForm_1<31, 343, (ops GPRC:$rD, memrr:$src), "lhax $rD, $src", LdStLHA, - [(set GPRC:$rD, (sextload xaddr:$src, i16))]>, + [(set GPRC:$rD, (sextloadi16 xaddr:$src))]>, PPC970_DGroup_Cracked; def LHZX : XForm_1<31, 279, (ops GPRC:$rD, memrr:$src), "lhzx $rD, $src", LdStGeneral, - [(set GPRC:$rD, (zextload xaddr:$src, i16))]>; + [(set GPRC:$rD, (zextloadi16 xaddr:$src))]>; def LWZX : XForm_1<31, 23, (ops GPRC:$rD, memrr:$src), "lwzx $rD, $src", LdStGeneral, [(set GPRC:$rD, (load xaddr:$src))]>; @@ -990,25 +990,25 @@ def : Pat<(shl GPRC:$rS, GPRC:$rB), (SLW GPRC:$rS, GPRC:$rB)>; -def : Pat<(zextload iaddr:$src, i1), +def : Pat<(zextloadi1 iaddr:$src), (LBZ iaddr:$src)>; -def : Pat<(zextload xaddr:$src, i1), +def : Pat<(zextloadi1 xaddr:$src), (LBZX xaddr:$src)>; -def : Pat<(extload iaddr:$src, i1), +def : Pat<(extloadi1 iaddr:$src), (LBZ iaddr:$src)>; -def : Pat<(extload xaddr:$src, i1), +def : Pat<(extloadi1 xaddr:$src), (LBZX xaddr:$src)>; -def : Pat<(extload iaddr:$src, i8), +def : Pat<(extloadi8 iaddr:$src), (LBZ iaddr:$src)>; -def : Pat<(extload xaddr:$src, i8), +def : Pat<(extloadi8 xaddr:$src), (LBZX xaddr:$src)>; -def : Pat<(extload iaddr:$src, i16), +def : Pat<(extloadi16 iaddr:$src), (LHZ iaddr:$src)>; -def : Pat<(extload xaddr:$src, i16), +def : Pat<(extloadi16 xaddr:$src), (LHZX xaddr:$src)>; -def : Pat<(extload iaddr:$src, f32), +def : Pat<(extloadf32 iaddr:$src), (FMRSD (LFS iaddr:$src))>; -def : Pat<(extload xaddr:$src, f32), +def : Pat<(extloadf32 xaddr:$src), (FMRSD (LFSX xaddr:$src))>; include "PPCInstrAltivec.td" From evan.cheng at apple.com Mon Oct 9 15:57:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 15:57:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200610092057.k99KvnZt021851@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.69 -> 1.70 --- Log message: Reflects ISD::LOAD / ISD::LOADX / LoadSDNode changes. --- Diffs of the changes: (+74 -16) TargetSelectionDAG.td | 90 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 74 insertions(+), 16 deletions(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.69 llvm/lib/Target/TargetSelectionDAG.td:1.70 --- llvm/lib/Target/TargetSelectionDAG.td:1.69 Tue Oct 3 19:53:53 2006 +++ llvm/lib/Target/TargetSelectionDAG.td Mon Oct 9 15:57:24 2006 @@ -164,12 +164,6 @@ SDTCisPtrTy<1> ]>; -def SDTLoadX : SDTypeProfile<1, 4, [ // loadX - SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT>, SDTCisVT<4, i32> -]>; -def SDTIntExtLoad : SDTypeProfile<1, 3, [ // extload, sextload, zextload - SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT> -]>; def SDTTruncStore : SDTypeProfile<0, 4, [ // truncstore SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT> ]>; @@ -305,12 +299,10 @@ def br : SDNode<"ISD::BR" , SDTBr, [SDNPHasChain]>; def ret : SDNode<"ISD::RET" , SDTRet, [SDNPHasChain]>; -def load : SDNode<"ISD::LOAD" , SDTLoad, [SDNPHasChain]>; +// Do not use ld directly. Use load, extload, sextload, zextload (see below). +def ld : SDNode<"ISD::LOAD" , SDTLoad, [SDNPHasChain]>; def store : SDNode<"ISD::STORE" , SDTStore, [SDNPHasChain]>; -// Do not use loadx directly. Use extload, sextload and zextload (see below) -// which pass in a dummy srcvalue node which tblgen will skip over. -def loadx : SDNode<"ISD::LOADX" , SDTLoadX, [SDNPHasChain]>; def truncst : SDNode<"ISD::TRUNCSTORE" , SDTTruncStore, [SDNPHasChain]>; def vector_shuffle : SDNode<"ISD::VECTOR_SHUFFLE", SDTVecShuffle, []>; @@ -412,13 +404,79 @@ def vnot_conv : PatFrag<(ops node:$in), (xor node:$in, immAllOnesV_bc)>; def ineg : PatFrag<(ops node:$in), (sub 0, node:$in)>; +def load : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + return ISD::isNON_EXTLoad(N); +}]>; + // extending load & truncstore fragments. -def extload : PatFrag<(ops node:$ptr, node:$vt), - (loadx node:$ptr, srcvalue:$dummy, node:$vt, 0)>; -def sextload : PatFrag<(ops node:$ptr, node:$vt), - (loadx node:$ptr, srcvalue:$dummy, node:$vt, 1)>; -def zextload : PatFrag<(ops node:$ptr, node:$vt), - (loadx node:$ptr, srcvalue:$dummy, node:$vt, 2)>; +def extloadi1 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i1; + return false; +}]>; +def extloadi8 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i8; + return false; +}]>; +def extloadi16 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i16; + return false; +}]>; +def extloadi32 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i32; + return false; +}]>; +def extloadf32 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::f32; + return false; +}]>; + +def sextloadi1 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isSEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i1; + return false; +}]>; +def sextloadi8 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isSEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i8; + return false; +}]>; +def sextloadi16 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isSEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i16; + return false; +}]>; +def sextloadi32 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isSEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i32; + return false; +}]>; + +def zextloadi1 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isZEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i1; + return false; +}]>; +def zextloadi8 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isZEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i8; + return false; +}]>; +def zextloadi16 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isZEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i16; + return false; +}]>; +def zextloadi32 : PatFrag<(ops node:$ptr), (ld node:$ptr), [{ + if (ISD::isZEXTLoad(N)) + return cast(N)->getLoadVT() == MVT::i32; + return false; +}]>; + def truncstore : PatFrag<(ops node:$val, node:$ptr, node:$vt), (truncst node:$val, node:$ptr, srcvalue:$dummy, node:$vt)>; From evan.cheng at apple.com Mon Oct 9 16:02:31 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 16:02:31 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200610092102.k99L2VfY022028@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.263 -> 1.264 --- Log message: Predicate function on the node should be matched before its childrean' matching code. This is especially important now matching ISD::LOAD also requires a Predicate_Load call. --- Diffs of the changes: (+4 -4) DAGISelEmitter.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.263 llvm/utils/TableGen/DAGISelEmitter.cpp:1.264 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.263 Thu Sep 21 15:46:13 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Oct 9 16:02:17 2006 @@ -2312,6 +2312,10 @@ } } + // If there is a node predicate for this, emit the call. + if (!N->getPredicateFn().empty()) + emitCheck(N->getPredicateFn() + "(" + RootName + ".Val)"); + const ComplexPattern *CP; for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { emitInit("SDOperand " + RootName + utostr(OpNo) + " = " + @@ -2420,10 +2424,6 @@ Code += ", CPTmp" + utostr(i); emitCheck(Code + ")"); } - - // If there is a node predicate for this, emit the call. - if (!N->getPredicateFn().empty()) - emitCheck(N->getPredicateFn() + "(" + RootName + ".Val)"); } /// EmitResultCode - Emit the action for a pattern. Now that it has matched From dpatel at apple.com Mon Oct 9 16:16:20 2006 From: dpatel at apple.com (Devang Patel) Date: Mon, 9 Oct 2006 16:16:20 -0500 Subject: [llvm-commits] CVS: llvm/tools/lto/lto.cpp Message-ID: <200610092116.k99LGK00022300@zion.cs.uiuc.edu> Changes in directory llvm/tools/lto: lto.cpp updated: 1.19 -> 1.20 --- Log message: Use FindProgramByName instead of FindExecutable. --- Diffs of the changes: (+1 -1) lto.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/lto/lto.cpp diff -u llvm/tools/lto/lto.cpp:1.19 llvm/tools/lto/lto.cpp:1.20 --- llvm/tools/lto/lto.cpp:1.19 Mon Oct 9 15:20:13 2006 +++ llvm/tools/lto/lto.cpp Mon Oct 9 16:16:05 2006 @@ -386,7 +386,7 @@ // We can't just assemble and link the file with the system assembler // and linker because we don't know where to put the _start symbol. // GCC mysteriously knows how to do it. - const sys::Path gcc = FindExecutable("gcc", "/"); + const sys::Path gcc = sys::Program::FindProgramByName("gcc"); if (gcc.isEmpty()) { tmpAsmFilePath.eraseFromDisk(); TempDir.eraseFromDisk(true); From evan.cheng at apple.com Mon Oct 9 16:39:39 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 16:39:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200610092139.k99Lddvl022691@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.272 -> 1.273 --- Log message: Don't convert to MOVLP if using shufps etc. may allow load folding. --- Diffs of the changes: (+6 -2) X86ISelLowering.cpp | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.272 llvm/lib/Target/X86/X86ISelLowering.cpp:1.273 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.272 Mon Oct 9 15:57:25 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 9 16:39:25 2006 @@ -3053,9 +3053,13 @@ /// V1 (and in order), and the upper half elements should come from the upper /// half of V2 (and in order). And since V1 will become the source of the /// MOVLP, it must be either a vector load or a scalar load to vector. -static bool ShouldXformToMOVLP(SDNode *V1, SDNode *Mask) { +static bool ShouldXformToMOVLP(SDNode *V1, SDNode *V2, SDNode *Mask) { if (!ISD::isNON_EXTLoad(V1) && !isScalarLoadToVector(V1)) return false; + // Is V2 is a vector load, don't do this transformation. We will try to use + // load folding shufps op. + if (ISD::isNON_EXTLoad(V2)) + return false; unsigned NumElems = Mask->getNumOperands(); if (NumElems != 2 && NumElems != 4) @@ -3497,7 +3501,7 @@ return Op; if (ShouldXformToMOVHLPS(PermMask.Val) || - ShouldXformToMOVLP(V1.Val, PermMask.Val)) + ShouldXformToMOVLP(V1.Val, V2.Val, PermMask.Val)) return CommuteVectorShuffle(Op, DAG); bool V1IsSplat = isSplatVector(V1.Val); From evan.cheng at apple.com Mon Oct 9 16:42:29 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 16:42:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrSSE.td Message-ID: <200610092142.k99LgTx4022760@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrSSE.td updated: 1.163 -> 1.164 --- Log message: Don't go too crazy with these AddComplexity. Try matching shufps with load folding first. --- Diffs of the changes: (+19 -8) X86InstrSSE.td | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.163 llvm/lib/Target/X86/X86InstrSSE.td:1.164 --- llvm/lib/Target/X86/X86InstrSSE.td:1.163 Mon Oct 9 15:57:25 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Mon Oct 9 16:42:15 2006 @@ -769,7 +769,7 @@ addr:$dst)]>; let isTwoAddress = 1 in { -let AddedComplexity = 20 in { +let AddedComplexity = 15 in { def MOVLHPSrr : PSI<0x16, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), "movlhps {$src2, $dst|$dst, $src2}", [(set VR128:$dst, @@ -1753,7 +1753,7 @@ def MOVLSD2PDrr : SDI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, FR64:$src2), "movsd {$src2, $dst|$dst, $src2}", []>; -let AddedComplexity = 20 in { +let AddedComplexity = 15 in { def MOVLPSrr : SSI<0x10, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), "movss {$src2, $dst|$dst, $src2}", [(set VR128:$dst, @@ -1785,28 +1785,32 @@ [(set VR128:$dst, (v2f64 (vector_shuffle immAllZerosV, (v2f64 (scalar_to_vector (loadf64 addr:$src))), MOVL_shuffle_mask)))]>; +} +let AddedComplexity = 15 in // movd / movq to XMM register zero-extends def MOVZDI2PDIrr : PDI<0x6E, MRMSrcReg, (ops VR128:$dst, GR32:$src), "movd {$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (vector_shuffle immAllZerosV, (v4i32 (scalar_to_vector GR32:$src)), MOVL_shuffle_mask)))]>; +let AddedComplexity = 20 in def MOVZDI2PDIrm : PDI<0x6E, MRMSrcMem, (ops VR128:$dst, i32mem:$src), "movd {$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (vector_shuffle immAllZerosV, (v4i32 (scalar_to_vector (loadi32 addr:$src))), MOVL_shuffle_mask)))]>; // Moving from XMM to XMM but still clear upper 64 bits. +let AddedComplexity = 15 in def MOVZQI2PQIrr : I<0x7E, MRMSrcReg, (ops VR128:$dst, VR128:$src), "movq {$src, $dst|$dst, $src}", [(set VR128:$dst, (int_x86_sse2_movl_dq VR128:$src))]>, XS, Requires<[HasSSE2]>; +let AddedComplexity = 20 in def MOVZQI2PQIrm : I<0x7E, MRMSrcMem, (ops VR128:$dst, i64mem:$src), "movq {$src, $dst|$dst, $src}", [(set VR128:$dst, (int_x86_sse2_movl_dq (bitconvert (loadv2i64 addr:$src))))]>, XS, Requires<[HasSSE2]>; -} //===----------------------------------------------------------------------===// // Non-Instruction Patterns @@ -1884,7 +1888,7 @@ // Move scalar to XMM zero-extended // movd to XMM register zero-extends -let AddedComplexity = 20 in { +let AddedComplexity = 15 in { def : Pat<(v8i16 (vector_shuffle immAllZerosV, (v8i16 (X86s2vec GR32:$src)), MOVL_shuffle_mask)), (MOVZDI2PDIrr GR32:$src)>, Requires<[HasSSE2]>; @@ -1950,25 +1954,27 @@ (PUNPCKLDQrr VR128:$src, VR128:$src)>, Requires<[HasSSE1]>; } -let AddedComplexity = 20 in { +let AddedComplexity = 15 in // vector_shuffle v1, <1, 1, 3, 3> def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef), MOVSHDUP_shuffle_mask)), (MOVSHDUPrr VR128:$src)>, Requires<[HasSSE3]>; +let AddedComplexity = 20 in def : Pat<(v4i32 (vector_shuffle (bc_v4i32 (loadv2i64 addr:$src)), (undef), MOVSHDUP_shuffle_mask)), (MOVSHDUPrm addr:$src)>, Requires<[HasSSE3]>; // vector_shuffle v1, <0, 0, 2, 2> +let AddedComplexity = 15 in def : Pat<(v4i32 (vector_shuffle VR128:$src, (undef), MOVSLDUP_shuffle_mask)), (MOVSLDUPrr VR128:$src)>, Requires<[HasSSE3]>; +let AddedComplexity = 20 in def : Pat<(v4i32 (vector_shuffle (bc_v4i32 (loadv2i64 addr:$src)), (undef), MOVSLDUP_shuffle_mask)), (MOVSLDUPrm addr:$src)>, Requires<[HasSSE3]>; -} -let AddedComplexity = 20 in { +let AddedComplexity = 15 in { // vector_shuffle v1, v2 <0, 1, 4, 5> using MOVLHPS def : Pat<(v4i32 (vector_shuffle VR128:$src1, VR128:$src2, MOVHP_shuffle_mask)), @@ -1986,7 +1992,9 @@ def : Pat<(v4i32 (vector_shuffle VR128:$src1, (undef), UNPCKH_shuffle_mask)), (MOVHLPSrr VR128:$src1, VR128:$src1)>; +} + let AddedComplexity = 20 in { // vector_shuffle v1, (load v2) <4, 5, 2, 3> using MOVLPS // vector_shuffle v1, (load v2) <0, 1, 4, 5> using MOVHPS def : Pat<(v4f32 (vector_shuffle VR128:$src1, (loadv4f32 addr:$src2), @@ -2014,7 +2022,9 @@ def : Pat<(v2i64 (vector_shuffle VR128:$src1, (loadv2i64 addr:$src2), MOVLP_shuffle_mask)), (MOVLPDrm VR128:$src1, addr:$src2)>, Requires<[HasSSE2]>; +} +let AddedComplexity = 15 in { // Setting the lowest element in the vector. def : Pat<(v4i32 (vector_shuffle VR128:$src1, VR128:$src2, MOVL_shuffle_mask)), @@ -2030,13 +2040,14 @@ def : Pat<(v4i32 (vector_shuffle VR128:$src1, VR128:$src2, MOVLP_shuffle_mask)), (MOVLPDrr VR128:$src1, VR128:$src2)>, Requires<[HasSSE2]>; +} // Set lowest element and zero upper elements. +let AddedComplexity = 20 in def : Pat<(bc_v2i64 (vector_shuffle immAllZerosV, (v2f64 (scalar_to_vector (loadf64 addr:$src))), MOVL_shuffle_mask)), (MOVZQI2PQIrm addr:$src)>, Requires<[HasSSE2]>; -} // FIXME: Temporary workaround since 2-wide shuffle is broken. def : Pat<(int_x86_sse2_movs_d VR128:$src1, VR128:$src2), From evan.cheng at apple.com Mon Oct 9 17:42:45 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 17:42:45 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll Message-ID: <200610092242.k99MgjAX023827@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: vec_shuffle-5.ll updated: 1.1 -> 1.2 --- Log message: shufps with load folding is better than movaps; movsd. --- Diffs of the changes: (+2 -1) vec_shuffle-5.ll | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll diff -u llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll:1.1 llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll:1.2 --- llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll:1.1 Wed May 3 15:29:34 2006 +++ llvm/test/Regression/CodeGen/X86/vec_shuffle-5.ll Mon Oct 9 17:42:31 2006 @@ -1,4 +1,5 @@ -; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep movsd | wc -l | grep 1 +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep movhlps | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep shufps | wc -l | grep 1 void %test() { %tmp1 = load <4 x float>* null From evan.cheng at apple.com Mon Oct 9 20:45:12 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 20:45:12 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h Message-ID: <200610100145.k9A1jCZh026497@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAGNodes.h updated: 1.150 -> 1.151 --- Log message: Comments; getChain(), getBasePtr(), etc. should return a SDOperand by value. --- Diffs of the changes: (+51 -23) SelectionDAGNodes.h | 74 +++++++++++++++++++++++++++++++++++----------------- 1 files changed, 51 insertions(+), 23 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.150 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.151 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.150 Mon Oct 9 15:55:20 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Mon Oct 9 20:44:58 2006 @@ -524,26 +524,28 @@ /// /// UNINDEXED "Normal" load / store. The effective address is already /// computed and is available in the base pointer. The offset - /// operand is always undefined. An unindexed load produces one - /// value (result of the load); an unindexed store does not - /// produces a value. + /// operand is always undefined. In addition to producing a + /// chain, an unindexed load produces one value (result of the + /// load); an unindexed store does not produces a value. /// /// PRE_INDEXED Similar to the unindexed mode where the effective address is /// the result of computation of the base pointer. However, it /// considers the computation as being folded into the load / /// store operation (i.e. the load / store does the address /// computation as well as performing the memory transaction). - /// The base operand is always undefined. A pre-indexed load - /// produces two values (result of the load and the result of - /// the address computation); a pre-indexed store produces one - /// value (result of the address computation). + /// The base operand is always undefined. In addition to + /// producing a chain, pre-indexed load produces two values + /// (result of the load and the result of the address + /// computation); a pre-indexed store produces one value (result + /// of the address computation). /// /// POST_INDEXED The effective address is the value of the base pointer. The /// value of the offset operand is then added to the base after - /// memory transaction. A post-indexed load produces two values - /// (the result of the load and the result of the base + offset - /// computation); a post-indexed store produces one value (the - /// the result of the base + offset computation). + /// memory transaction. In addition to producing a chain, + /// post-indexed load produces two values (the result of the load + /// and the result of the base + offset computation); a + /// post-indexed store produces one value (the the result of the + /// base + offset computation). /// enum MemOpAddrMode { UNINDEXED = 0, @@ -1375,12 +1377,25 @@ /// LoadSDNode - This class is used to represent ISD::LOAD nodes. /// class LoadSDNode : public SDNode { - ISD::MemOpAddrMode AddrMode; // unindexed, pre-indexed, post-indexed. - ISD::LoadExtType ExtType; // non-ext, anyext, sext, zext. - MVT::ValueType LoadVT; // VT of loaded value before extension. + // AddrMode - unindexed, pre-indexed, post-indexed. + ISD::MemOpAddrMode AddrMode; + + // ExtType - non-ext, anyext, sext, zext. + ISD::LoadExtType ExtType; + + // LoadVT - VT of loaded value before extension. + MVT::ValueType LoadVT; + + // SrcValue - Memory location for alias analysis. const Value *SrcValue; + + // SVOffset - Memory location offset. int SVOffset; + + // Alignment - Alignment of memory location in bytes. unsigned Alignment; + + // IsVolatile - True if the load is volatile. bool IsVolatile; protected: friend class SelectionDAG; @@ -1404,9 +1419,9 @@ } public: - const SDOperand &getChain() const { return getOperand(0); } - const SDOperand &getBasePtr() const { return getOperand(1); } - const SDOperand &getOffset() const { return getOperand(2); } + const SDOperand getChain() const { return getOperand(0); } + const SDOperand getBasePtr() const { return getOperand(1); } + const SDOperand getOffset() const { return getOperand(2); } ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; } ISD::LoadExtType getExtensionType() const { return ExtType; } MVT::ValueType getLoadVT() const { return LoadVT; } @@ -1424,12 +1439,25 @@ /// StoreSDNode - This class is used to represent ISD::STORE nodes. /// class StoreSDNode : public SDNode { - ISD::MemOpAddrMode AddrMode; // unindexed, pre-indexed, post-indexed. - bool IsTruncStore; // is value truncated before store? - MVT::ValueType StoredVT; // VT of value that's actually stored. + // AddrMode - unindexed, pre-indexed, post-indexed. + ISD::MemOpAddrMode AddrMode; + + // IsTruncStore - True is the op does a truncation before store. + bool IsTruncStore; + + // StoreVT - VT of the value after truncation. + MVT::ValueType StoredVT; + + // SrcValue - Memory location for alias analysis. const Value *SrcValue; + + // SVOffset - Memory location offset. int SVOffset; + + // Alignment - Alignment of memory location in bytes. unsigned Alignment; + + // IsVolatile - True if the store is volatile. bool IsVolatile; protected: friend class SelectionDAG; @@ -1444,9 +1472,9 @@ } public: - const SDOperand &getChain() const { return getOperand(0); } - const SDOperand &getBasePtr() const { return getOperand(1); } - const SDOperand &getOffset() const { return getOperand(2); } + const SDOperand getChain() const { return getOperand(0); } + const SDOperand getBasePtr() const { return getOperand(1); } + const SDOperand getOffset() const { return getOperand(2); } ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; } bool isTruncatingStore() const { return IsTruncStore; } MVT::ValueType getStoredVT() const { return StoredVT; } From evan.cheng at apple.com Mon Oct 9 20:47:10 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 20:47:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200610100147.k9A1lAfE026549@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.112 -> 1.113 --- Log message: More isel time load folding checking for nodes that produce flag values. See comment in CanBeFoldedBy() for detailed explanation. --- Diffs of the changes: (+57 -6) X86ISelDAGToDAG.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 57 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.112 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.113 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.112 Mon Oct 9 15:57:25 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Oct 9 20:46:56 2006 @@ -213,7 +213,20 @@ }; } -static void findNonImmUse(SDNode* Use, SDNode* Def, bool &found, +static SDNode *findFlagUse(SDNode *N) { + unsigned FlagResNo = N->getNumValues()-1; + for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) { + SDNode *User = *I; + for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) { + SDOperand Op = User->getOperand(i); + if (Op.ResNo == FlagResNo) + return User; + } + } + return NULL; +} + +static void findNonImmUse(SDNode* Use, SDNode* Def, SDNode *Ignore, bool &found, std::set &Visited) { if (found || Use->getNodeId() > Def->getNodeId() || @@ -222,8 +235,10 @@ for (unsigned i = 0, e = Use->getNumOperands(); i != e; ++i) { SDNode *N = Use->getOperand(i).Val; + if (N == Ignore) + continue; if (N != Def) { - findNonImmUse(N, Def, found, Visited); + findNonImmUse(N, Def, Ignore, found, Visited); } else { found = true; break; @@ -231,16 +246,27 @@ } } -static inline bool isNonImmUse(SDNode* Use, SDNode* Def) { +static inline bool isNonImmUse(SDNode* Use, SDNode* Def, SDNode *Ignore=NULL) { std::set Visited; bool found = false; for (unsigned i = 0, e = Use->getNumOperands(); i != e; ++i) { SDNode *N = Use->getOperand(i).Val; - if (N != Def) { - findNonImmUse(N, Def, found, Visited); + if (N != Def && N != Ignore) { + findNonImmUse(N, Def, Ignore, found, Visited); if (found) break; } } + + if (!found && Ignore) { + // We must be checking for reachability between Def and a flag use. Go down + // recursively if Use also produces a flag. + MVT::ValueType VT = Use->getValueType(Use->getNumValues()-1); + if (VT == MVT::Flag && !Use->use_empty()) { + SDNode *FU = findFlagUse(Use); + if (FU) + return !isNonImmUse(FU, Def, Use); + } + } return found; } @@ -258,7 +284,32 @@ // / [X] // | ^ // [U]--------| - return !FastISel && !isNonImmUse(U, N); + if (!FastISel && !isNonImmUse(U, N)) { + // If U produces a flag, then it gets (even more) interesting. Since it + // would have been "glued" together with its flag use, we need to check if + // it might reach N: + // + // [ N ] + // ^ ^ + // | | + // [U] \-- + // ^ [TF] + // | | + // \ / + // [FU] + // + // If FU (flag use) indirectly reach N (the load), and U fold N (call it + // NU), then TF is a predecessor of FU and a successor of NU. But since + // NU and FU are flagged together, this effectively creates a cycle. + MVT::ValueType VT = U->getValueType(U->getNumValues()-1); + if (VT == MVT::Flag && !U->use_empty()) { + SDNode *FU = findFlagUse(U); + if (FU) + return !isNonImmUse(FU, N, U); + } + return true; + } + return false; } /// MoveBelowTokenFactor - Replace TokenFactor operand with load's chain operand From evan.cheng at apple.com Mon Oct 9 23:34:00 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 9 Oct 2006 23:34:00 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/2006-10-09-CycleInDAG.ll Message-ID: <200610100434.k9A4Y0b2029240@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: 2006-10-09-CycleInDAG.ll added (r1.1) --- Log message: Add test case from PR940: http://llvm.org/PR940 . --- Diffs of the changes: (+10 -0) 2006-10-09-CycleInDAG.ll | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/test/Regression/CodeGen/X86/2006-10-09-CycleInDAG.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/2006-10-09-CycleInDAG.ll:1.1 *** /dev/null Mon Oct 9 23:33:56 2006 --- llvm/test/Regression/CodeGen/X86/2006-10-09-CycleInDAG.ll Mon Oct 9 23:33:46 2006 *************** *** 0 **** --- 1,10 ---- + ; RUN: llvm-as < %s | llc -march=x86 + + void %_ZN13QFSFileEngine4readEPcx() { + %tmp201 = load int* null + %tmp201 = cast int %tmp201 to long + %tmp202 = load long* null + %tmp203 = add long %tmp201, %tmp202 + store long %tmp203, long* null + ret void + } From evan.cheng at apple.com Tue Oct 10 02:51:35 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 10 Oct 2006 02:51:35 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200610100751.k9A7pZmd008806@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.406 -> 1.407 --- Log message: Fix a bug introduced by my LOAD/LOADX changes. --- Diffs of the changes: (+4 -2) LegalizeDAG.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.406 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.407 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.406 Mon Oct 9 15:57:24 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Oct 10 02:51:21 2006 @@ -2433,7 +2433,6 @@ // This defaults to loading a pointer from the input and storing it to the // output, returning the chain. SrcValueSDNode *SVD = cast(Node->getOperand(3)); - SrcValueSDNode *SVS = cast(Node->getOperand(4)); Tmp4 = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp3, SVD->getValue(), SVD->getOffset()); Result = DAG.getStore(Tmp4.getValue(1), Tmp4, Tmp2, Node->getOperand(4)); @@ -3234,7 +3233,10 @@ case ISD::LOAD: { LoadSDNode *LD = cast(Node); - Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, LD->getChain(), LD->getBasePtr(), + ISD::LoadExtType ExtType = ISD::isNON_EXTLoad(Node) + ? ISD::EXTLOAD : LD->getExtensionType(); + Result = DAG.getExtLoad(ExtType, NVT, + LD->getChain(), LD->getBasePtr(), LD->getSrcValue(), LD->getSrcValueOffset(), VT); // Remember that we legalized the chain. AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); From rafael.espindola at gmail.com Tue Oct 10 07:56:15 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 07:56:15 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp ARMInstrInfo.td Message-ID: <200610101256.k9ACuFmS016652@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.61 -> 1.62 ARMInstrInfo.td updated: 1.38 -> 1.39 --- Log message: initial support for fp compares. Unordered compares not implemented yet --- Diffs of the changes: (+49 -11) ARMISelDAGToDAG.cpp | 50 ++++++++++++++++++++++++++++++++++++++++---------- ARMInstrInfo.td | 10 +++++++++- 2 files changed, 49 insertions(+), 11 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.61 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.62 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.61 Mon Oct 9 15:57:24 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Oct 10 07:56:00 2006 @@ -60,8 +60,13 @@ setOperationAction(ISD::SELECT, MVT::i32, Expand); setOperationAction(ISD::SETCC, MVT::i32, Expand); + setOperationAction(ISD::SETCC, MVT::f32, Expand); + setOperationAction(ISD::SETCC, MVT::f64, Expand); + setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); setOperationAction(ISD::BR_CC, MVT::i32, Custom); + setOperationAction(ISD::BR_CC, MVT::f32, Custom); + setOperationAction(ISD::BR_CC, MVT::f64, Custom); setOperationAction(ISD::VASTART, MVT::Other, Custom); setOperationAction(ISD::VAEND, MVT::Other, Expand); @@ -100,12 +105,17 @@ FMRRD, - FMDRR + FMDRR, + + FMSTAT }; } } /// DAGCCToARMCC - Convert a DAG integer condition code to an ARM CC +//Note: ARM doesn't have condition codes corresponding to the ordered +//condition codes of LLVM. We use exception raising instructions so +//that we can be sure that V == 0 and test only the rest of the expression. static ARMCC::CondCodes DAGCCToARMCC(ISD::CondCode CC) { switch (CC) { default: @@ -113,12 +123,17 @@ assert(0 && "Unknown condition code!"); case ISD::SETUGT: return ARMCC::HI; case ISD::SETULE: return ARMCC::LS; - case ISD::SETLE: return ARMCC::LE; - case ISD::SETLT: return ARMCC::LT; - case ISD::SETGT: return ARMCC::GT; + case ISD::SETLE: + case ISD::SETOLE: return ARMCC::LE; + case ISD::SETLT: + case ISD::SETOLT: return ARMCC::LT; + case ISD::SETGT: + case ISD::SETOGT: return ARMCC::GT; case ISD::SETNE: return ARMCC::NE; - case ISD::SETEQ: return ARMCC::EQ; - case ISD::SETGE: return ARMCC::GE; + case ISD::SETEQ: + case ISD::SETOEQ: return ARMCC::EQ; + case ISD::SETGE: + case ISD::SETOGE: return ARMCC::GE; case ISD::SETUGE: return ARMCC::CS; case ISD::SETULT: return ARMCC::CC; } @@ -138,6 +153,7 @@ case ARMISD::FUITOD: return "ARMISD::FUITOD"; case ARMISD::FMRRD: return "ARMISD::FMRRD"; case ARMISD::FMDRR: return "ARMISD::FMDRR"; + case ARMISD::FMSTAT: return "ARMISD::FMSTAT"; } } @@ -520,15 +536,30 @@ return DAG.getNode(ISD::MERGE_VALUES, RetVT, &ArgValues[0], ArgValues.size()); } +static SDOperand GetCMP(ISD::CondCode CC, SDOperand LHS, SDOperand RHS, + SelectionDAG &DAG) { + MVT::ValueType vt = LHS.getValueType(); + assert(vt == MVT::i32 || vt == MVT::f32); + //Note: unordered floating point compares should use a non throwing + //compare. + bool isUnorderedFloat = vt == MVT::f32 && + (CC >= ISD::SETUO && CC <= ISD::SETUNE); + assert(!isUnorderedFloat && "Unordered float compares are not supported"); + + SDOperand Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); + if (vt != MVT::i32) + Cmp = DAG.getNode(ARMISD::FMSTAT, MVT::Flag, Cmp); + return Cmp; +} + static SDOperand LowerSELECT_CC(SDOperand Op, SelectionDAG &DAG) { SDOperand LHS = Op.getOperand(0); SDOperand RHS = Op.getOperand(1); ISD::CondCode CC = cast(Op.getOperand(4))->get(); SDOperand TrueVal = Op.getOperand(2); SDOperand FalseVal = Op.getOperand(3); + SDOperand Cmp = GetCMP(CC, LHS, RHS, DAG); SDOperand ARMCC = DAG.getConstant(DAGCCToARMCC(CC), MVT::i32); - - SDOperand Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); return DAG.getNode(ARMISD::SELECT, MVT::i32, TrueVal, FalseVal, ARMCC, Cmp); } @@ -538,9 +569,8 @@ SDOperand LHS = Op.getOperand(2); SDOperand RHS = Op.getOperand(3); SDOperand Dest = Op.getOperand(4); + SDOperand Cmp = GetCMP(CC, LHS, RHS, DAG); SDOperand ARMCC = DAG.getConstant(DAGCCToARMCC(CC), MVT::i32); - - SDOperand Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); return DAG.getNode(ARMISD::BR, MVT::Other, Chain, Dest, ARMCC, Cmp); } Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.38 llvm/lib/Target/ARM/ARMInstrInfo.td:1.39 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.38 Mon Oct 9 12:50:29 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Tue Oct 10 07:56:00 2006 @@ -65,9 +65,11 @@ [SDNPHasChain, SDNPOptInFlag]>; def SDTarmselect : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<0>, SDTCisVT<2, i32>]>; - def armselect : SDNode<"ARMISD::SELECT", SDTarmselect, [SDNPInFlag, SDNPOutFlag]>; +def SDTarmfmstat : SDTypeProfile<0, 0, []>; +def armfmstat : SDNode<"ARMISD::FMSTAT", SDTarmfmstat, [SDNPInFlag, SDNPOutFlag]>; + def SDTarmbr : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>; def armbr : SDNode<"ARMISD::BR", SDTarmbr, [SDNPHasChain, SDNPInFlag]>; @@ -171,6 +173,10 @@ "cmp $a, $b", [(armcmp IntRegs:$a, addr_mode1:$b)]>; +// Floating Point Compare +def fcmpes : InstARM<(ops FPRegs:$a, FPRegs:$b), + "fcmpes $a, $b", + [(armcmp FPRegs:$a, FPRegs:$b)]>; // Floating Point Conversion // We use bitconvert for moving the data between the register classes. @@ -206,6 +212,8 @@ def FCVTSD : InstARM<(ops FPRegs:$dst, DFPRegs:$src), "fcvtsd $dst, $src", [(set FPRegs:$dst, (fround DFPRegs:$src))]>; +def FMSTAT : InstARM<(ops ), "fmstat", [(armfmstat)]>; + // Floating Point Arithmetic def FADDS : InstARM<(ops FPRegs:$dst, FPRegs:$a, FPRegs:$b), "fadds $dst, $a, $b", From rafael.espindola at gmail.com Tue Oct 10 09:26:20 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 09:26:20 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpcmp.ll Message-ID: <200610101426.k9AEQKTk018020@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fpcmp.ll added (r1.1) --- Log message: add some tests for floating point compare --- Diffs of the changes: (+41 -0) fpcmp.ll | 41 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+) Index: llvm/test/Regression/CodeGen/ARM/fpcmp.ll diff -c /dev/null llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.1 *** /dev/null Tue Oct 10 09:26:16 2006 --- llvm/test/Regression/CodeGen/ARM/fpcmp.ll Tue Oct 10 09:26:06 2006 *************** *** 0 **** --- 1,41 ---- + ; RUN: llvm-as < %s | llc -march=arm && + ; RUN: llvm-as < %s | llc -march=arm | grep movlt && + ; RUN: llvm-as < %s | llc -march=arm | grep moveq && + ; RUN: llvm-as < %s | llc -march=arm | grep movgt && + ; RUN: llvm-as < %s | llc -march=arm | grep movge && + ; RUN: llvm-as < %s | llc -march=arm | grep movle + + int %f1(float %a) { + entry: + %tmp = setlt float %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp + } + + int %f2(float %a) { + entry: + %tmp = seteq float %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp + } + + int %f3(float %a) { + entry: + %tmp = setgt float %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp + } + + int %f4(float %a) { + entry: + %tmp = setge float %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp + } + + int %f5(float %a) { + entry: + %tmp = setle float %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp + } From rafael.espindola at gmail.com Tue Oct 10 11:34:01 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 11:34:01 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp ARMInstrInfo.td Message-ID: <200610101634.k9AGY1Le020681@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.62 -> 1.63 ARMInstrInfo.td updated: 1.39 -> 1.40 --- Log message: compare doubles --- Diffs of the changes: (+6 -2) ARMISelDAGToDAG.cpp | 4 ++-- ARMInstrInfo.td | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.62 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.63 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.62 Tue Oct 10 07:56:00 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Oct 10 11:33:47 2006 @@ -539,10 +539,10 @@ static SDOperand GetCMP(ISD::CondCode CC, SDOperand LHS, SDOperand RHS, SelectionDAG &DAG) { MVT::ValueType vt = LHS.getValueType(); - assert(vt == MVT::i32 || vt == MVT::f32); + assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64); //Note: unordered floating point compares should use a non throwing //compare. - bool isUnorderedFloat = vt == MVT::f32 && + bool isUnorderedFloat = (vt == MVT::f32 || vt == MVT::f64) && (CC >= ISD::SETUO && CC <= ISD::SETUNE); assert(!isUnorderedFloat && "Unordered float compares are not supported"); Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.39 llvm/lib/Target/ARM/ARMInstrInfo.td:1.40 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.39 Tue Oct 10 07:56:00 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Tue Oct 10 11:33:47 2006 @@ -178,6 +178,10 @@ "fcmpes $a, $b", [(armcmp FPRegs:$a, FPRegs:$b)]>; +def fcmped : InstARM<(ops DFPRegs:$a, DFPRegs:$b), + "fcmped $a, $b", + [(armcmp DFPRegs:$a, DFPRegs:$b)]>; + // Floating Point Conversion // We use bitconvert for moving the data between the register classes. // The format conversion is done with ARM specific nodes From rafael.espindola at gmail.com Tue Oct 10 11:34:02 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 11:34:02 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpcmp.ll Message-ID: <200610101634.k9AGY2xk020686@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fpcmp.ll updated: 1.1 -> 1.2 --- Log message: compare doubles --- Diffs of the changes: (+10 -1) fpcmp.ll | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletion(-) Index: llvm/test/Regression/CodeGen/ARM/fpcmp.ll diff -u llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.1 llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.2 --- llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.1 Tue Oct 10 09:26:06 2006 +++ llvm/test/Regression/CodeGen/ARM/fpcmp.ll Tue Oct 10 11:33:47 2006 @@ -3,7 +3,9 @@ ; RUN: llvm-as < %s | llc -march=arm | grep moveq && ; RUN: llvm-as < %s | llc -march=arm | grep movgt && ; RUN: llvm-as < %s | llc -march=arm | grep movge && -; RUN: llvm-as < %s | llc -march=arm | grep movle +; RUN: llvm-as < %s | llc -march=arm | grep movle && +; RUN: llvm-as < %s | llc -march=arm | grep fcmpes && +; RUN: llvm-as < %s | llc -march=arm | grep fcmped int %f1(float %a) { entry: @@ -39,3 +41,10 @@ %tmp = cast bool %tmp to int ; [#uses=1] ret int %tmp } + +int %g1(double %a) { +entry: + %tmp = setlt double %a, 1.000000e+00 ; [#uses=1] + %tmp = cast bool %tmp to int ; [#uses=1] + ret int %tmp +} From sabre at nondot.org Tue Oct 10 13:54:33 2006 From: sabre at nondot.org (Chris Lattner) Date: Tue, 10 Oct 2006 13:54:33 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200610101854.k9AIsXCo023693@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.407 -> 1.408 --- Log message: Fix another bug in extload promotion. --- Diffs of the changes: (+2 -1) LegalizeDAG.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.407 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.408 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.407 Tue Oct 10 02:51:21 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Oct 10 13:54:19 2006 @@ -3237,7 +3237,8 @@ ? ISD::EXTLOAD : LD->getExtensionType(); Result = DAG.getExtLoad(ExtType, NVT, LD->getChain(), LD->getBasePtr(), - LD->getSrcValue(), LD->getSrcValueOffset(), VT); + LD->getSrcValue(), LD->getSrcValueOffset(), + LD->getLoadVT()); // Remember that we legalized the chain. AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); break; From rafael.espindola at gmail.com Tue Oct 10 13:55:30 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 13:55:30 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpconv.ll Message-ID: <200610101855.k9AItUY3023734@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fpconv.ll updated: 1.1 -> 1.2 --- Log message: add double <-> int conversion --- Diffs of the changes: (+14 -2) fpconv.ll | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) Index: llvm/test/Regression/CodeGen/ARM/fpconv.ll diff -u llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.1 llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.2 --- llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.1 Mon Oct 9 12:50:29 2006 +++ llvm/test/Regression/CodeGen/ARM/fpconv.ll Tue Oct 10 13:55:14 2006 @@ -2,14 +2,26 @@ ; RUN: llvm-as < %s | llc -march=arm | grep fcvtds && ; RUN: llvm-as < %s | llc -march=arm | grep fcvtsd -float %f(double %x) { +float %f1(double %x) { entry: %tmp1 = cast double %x to float ret float %tmp1 } -double %g(float %x) { +double %f2(float %x) { entry: %tmp1 = cast float %x to double ret double %tmp1 } + +int %f3(float %x) { +entry: + %tmp = cast float %x to int + ret int %tmp +} + +int %f4(double %x) { +entry: + %tmp = cast double %x to int + ret int %tmp +} From rafael.espindola at gmail.com Tue Oct 10 13:55:31 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 13:55:31 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp ARMInstrInfo.td Message-ID: <200610101855.k9AItVYQ023742@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.63 -> 1.64 ARMInstrInfo.td updated: 1.40 -> 1.41 --- Log message: add double <-> int conversion --- Diffs of the changes: (+26 -0) ARMISelDAGToDAG.cpp | 18 ++++++++++++++++++ ARMInstrInfo.td | 8 ++++++++ 2 files changed, 26 insertions(+) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.63 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.64 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.63 Tue Oct 10 11:33:47 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Oct 10 13:55:14 2006 @@ -49,6 +49,7 @@ setLoadXAction(ISD::EXTLOAD, MVT::f32, Expand); + setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom); setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); @@ -96,8 +97,10 @@ BR, FSITOS, + FTOSIS, FSITOD, + FTOSID, FUITOS, @@ -148,7 +151,9 @@ case ARMISD::CMP: return "ARMISD::CMP"; case ARMISD::BR: return "ARMISD::BR"; case ARMISD::FSITOS: return "ARMISD::FSITOS"; + case ARMISD::FTOSIS: return "ARMISD::FTOSIS"; case ARMISD::FSITOD: return "ARMISD::FSITOD"; + case ARMISD::FTOSID: return "ARMISD::FTOSID"; case ARMISD::FUITOS: return "ARMISD::FUITOS"; case ARMISD::FUITOD: return "ARMISD::FUITOD"; case ARMISD::FMRRD: return "ARMISD::FMRRD"; @@ -586,6 +591,17 @@ return DAG.getNode(op, vt, Tmp); } +static SDOperand LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) { + assert(Op.getValueType() == MVT::i32); + SDOperand FloatVal = Op.getOperand(0); + MVT::ValueType vt = FloatVal.getValueType(); + assert(vt == MVT::f32 || vt == MVT::f64); + + ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOSIS : ARMISD::FTOSID; + SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal); + return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp); +} + static SDOperand LowerUINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { SDOperand IntVal = Op.getOperand(0); assert(IntVal.getValueType() == MVT::i32); @@ -607,6 +623,8 @@ return LowerConstantPool(Op, DAG); case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG); + case ISD::FP_TO_SINT: + return LowerFP_TO_SINT(Op, DAG); case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG); case ISD::UINT_TO_FP: Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.40 llvm/lib/Target/ARM/ARMInstrInfo.td:1.41 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.40 Tue Oct 10 11:33:47 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Tue Oct 10 13:55:14 2006 @@ -77,7 +77,9 @@ def armcmp : SDNode<"ARMISD::CMP", SDTVoidBinOp, [SDNPOutFlag]>; def armfsitos : SDNode<"ARMISD::FSITOS", SDTUnaryOp>; +def armftosis : SDNode<"ARMISD::FTOSIS", SDTUnaryOp>; def armfsitod : SDNode<"ARMISD::FSITOD", SDTUnaryOp>; +def armftosid : SDNode<"ARMISD::FTOSID", SDTUnaryOp>; def armfuitos : SDNode<"ARMISD::FUITOS", SDTUnaryOp>; def armfuitod : SDNode<"ARMISD::FUITOD", SDTUnaryOp>; @@ -201,9 +203,15 @@ def FSITOS : InstARM<(ops FPRegs:$dst, FPRegs:$src), "fsitos $dst, $src", [(set FPRegs:$dst, (armfsitos FPRegs:$src))]>; +def FTOSIS : InstARM<(ops FPRegs:$dst, FPRegs:$src), + "ftosis $dst, $src", [(set FPRegs:$dst, (armftosis FPRegs:$src))]>; + def FSITOD : InstARM<(ops DFPRegs:$dst, FPRegs:$src), "fsitod $dst, $src", [(set DFPRegs:$dst, (armfsitod FPRegs:$src))]>; +def FTOSID : InstARM<(ops FPRegs:$dst, DFPRegs:$src), + "ftosid $dst, $src", [(set FPRegs:$dst, (armftosid DFPRegs:$src))]>; + def FUITOS : InstARM<(ops FPRegs:$dst, FPRegs:$src), "fuitos $dst, $src", [(set FPRegs:$dst, (armfuitos FPRegs:$src))]>; From rafael.espindola at gmail.com Tue Oct 10 14:35:15 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 14:35:15 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fparith.ll Message-ID: <200610101935.k9AJZFtP024398@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fparith.ll updated: 1.1 -> 1.2 --- Log message: add fp sub --- Diffs of the changes: (+16 -4) fparith.ll | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) Index: llvm/test/Regression/CodeGen/ARM/fparith.ll diff -u llvm/test/Regression/CodeGen/ARM/fparith.ll:1.1 llvm/test/Regression/CodeGen/ARM/fparith.ll:1.2 --- llvm/test/Regression/CodeGen/ARM/fparith.ll:1.1 Mon Oct 9 14:15:17 2006 +++ llvm/test/Regression/CodeGen/ARM/fparith.ll Tue Oct 10 14:35:01 2006 @@ -4,26 +4,38 @@ ; RUN: llvm-as < %s | llc -march=arm | grep fmuls && ; RUN: llvm-as < %s | llc -march=arm | grep fmuld -float %f(float %a, float %b) { +float %f1(float %a, float %b) { entry: %tmp = add float %a, %b ret float %tmp } -double %g(double %a, double %b) { +double %f2(double %a, double %b) { entry: %tmp = add double %a, %b ret double %tmp } -float %h(float %a, float %b) { +float %f3(float %a, float %b) { entry: %tmp = mul float %a, %b ret float %tmp } -double %i(double %a, double %b) { +double %f4(double %a, double %b) { entry: %tmp = mul double %a, %b ret double %tmp } + +float %f5(float %a, float %b) { +entry: + %tmp = sub float %a, %b + ret float %tmp +} + +double %f6(double %a, double %b) { +entry: + %tmp = sub double %a, %b + ret double %tmp +} From rafael.espindola at gmail.com Tue Oct 10 14:35:16 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Tue, 10 Oct 2006 14:35:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.td Message-ID: <200610101935.k9AJZGvr024403@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMInstrInfo.td updated: 1.41 -> 1.42 --- Log message: add fp sub --- Diffs of the changes: (+8 -0) ARMInstrInfo.td | 8 ++++++++ 1 files changed, 8 insertions(+) Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.41 llvm/lib/Target/ARM/ARMInstrInfo.td:1.42 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.41 Tue Oct 10 13:55:14 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Tue Oct 10 14:35:00 2006 @@ -235,6 +235,14 @@ "faddd $dst, $a, $b", [(set DFPRegs:$dst, (fadd DFPRegs:$a, DFPRegs:$b))]>; +def FSUBS : InstARM<(ops FPRegs:$dst, FPRegs:$a, FPRegs:$b), + "fsubs $dst, $a, $b", + [(set FPRegs:$dst, (fsub FPRegs:$a, FPRegs:$b))]>; + +def FSUBD : InstARM<(ops DFPRegs:$dst, DFPRegs:$a, DFPRegs:$b), + "fsubd $dst, $a, $b", + [(set DFPRegs:$dst, (fsub DFPRegs:$a, DFPRegs:$b))]>; + def FMULS : InstARM<(ops FPRegs:$dst, FPRegs:$a, FPRegs:$b), "fmuls $dst, $a, $b", [(set FPRegs:$dst, (fmul FPRegs:$a, FPRegs:$b))]>; From evan.cheng at apple.com Tue Oct 10 15:05:24 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 10 Oct 2006 15:05:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200610102005.k9AK5OZ6025023@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.344 -> 1.345 --- Log message: SDNode::dump should also print out extension type and VT. --- Diffs of the changes: (+21 -0) SelectionDAG.cpp | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.344 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.345 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.344 Mon Oct 9 15:57:24 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Oct 10 15:05:10 2006 @@ -2691,6 +2691,27 @@ std::cerr << "getOffset() << ">"; } else if (const VTSDNode *N = dyn_cast(this)) { std::cerr << ":" << getValueTypeString(N->getVT()); + } else if (const LoadSDNode *LD = dyn_cast(this)) { + bool doExt = true; + switch (LD->getExtensionType()) { + default: doExt = false; break; + case ISD::EXTLOAD: + std::cerr << " getLoadVT()) << ">"; + + if (LD->getAddressingMode() == ISD::PRE_INDEXED) + std::cerr << "
";
+    else if (LD->getAddressingMode() == ISD::POST_INDEXED)
+      std::cerr << " ";
   }
 }
 





From evan.cheng at apple.com  Tue Oct 10 15:11:40 2006
From: evan.cheng at apple.com (Evan Cheng)
Date: Tue, 10 Oct 2006 15:11:40 -0500
Subject: [llvm-commits] CVS:
	llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
Message-ID: <200610102011.k9AKBefG025155@zion.cs.uiuc.edu>



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGPrinter.cpp updated: 1.36 -> 1.37
---
Log message:

Also update getNodeLabel for LoadSDNode.

---
Diffs of the changes:  (+21 -0)

 SelectionDAGPrinter.cpp |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.36 llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.37
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.36	Mon Oct  2 08:01:17 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp	Tue Oct 10 15:11:26 2006
@@ -130,6 +130,27 @@
     Op = Op + " VT=" + getValueTypeString(N->getVT());
   } else if (const StringSDNode *N = dyn_cast(Node)) {
     Op = Op + "\"" + N->getValue() + "\"";
+  } else if (const LoadSDNode *LD = dyn_cast(Node)) {
+    bool doExt = true;
+    switch (LD->getExtensionType()) {
+    default: doExt = false; break;
+    case ISD::EXTLOAD:
+      Op = Op + "getLoadVT()) + ">";
+
+    if (LD->getAddressingMode() == ISD::PRE_INDEXED)
+      Op = Op + "
";
+    else if (LD->getAddressingMode() == ISD::POST_INDEXED)
+      Op = Op + "";
   }
   
   return Op;





From rafael.espindola at gmail.com  Tue Oct 10 15:39:11 2006
From: rafael.espindola at gmail.com (Rafael Espindola)
Date: Tue, 10 Oct 2006 15:39:11 -0500
Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpconv.ll
Message-ID: <200610102039.k9AKdBS7025575@zion.cs.uiuc.edu>



Changes in directory llvm/test/Regression/CodeGen/ARM:

fpconv.ll updated: 1.2 -> 1.3
---
Log message:

uint <-> double conversion


---
Diffs of the changes:  (+12 -0)

 fpconv.ll |   12 ++++++++++++
 1 files changed, 12 insertions(+)


Index: llvm/test/Regression/CodeGen/ARM/fpconv.ll
diff -u llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.2 llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.3
--- llvm/test/Regression/CodeGen/ARM/fpconv.ll:1.2	Tue Oct 10 13:55:14 2006
+++ llvm/test/Regression/CodeGen/ARM/fpconv.ll	Tue Oct 10 15:38:57 2006
@@ -25,3 +25,15 @@
         %tmp = cast double %x to int
         ret int %tmp
 }
+
+uint %f5(float %x) {
+entry:
+        %tmp = cast float %x to uint
+        ret uint %tmp
+}
+
+uint %f6(double %x) {
+entry:
+        %tmp = cast double %x to uint
+        ret uint %tmp
+}





From rafael.espindola at gmail.com  Tue Oct 10 15:39:12 2006
From: rafael.espindola at gmail.com (Rafael Espindola)
Date: Tue, 10 Oct 2006 15:39:12 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
	ARMInstrInfo.td
Message-ID: <200610102039.k9AKdCAv025582@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/ARM:

ARMISelDAGToDAG.cpp updated: 1.64 -> 1.65
ARMInstrInfo.td updated: 1.42 -> 1.43
---
Log message:

uint <-> double conversion


---
Diffs of the changes:  (+26 -0)

 ARMISelDAGToDAG.cpp |   18 ++++++++++++++++++
 ARMInstrInfo.td     |    8 ++++++++
 2 files changed, 26 insertions(+)


Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.64 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.65
--- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.64	Tue Oct 10 13:55:14 2006
+++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp	Tue Oct 10 15:38:57 2006
@@ -52,6 +52,7 @@
   setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
   setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom);
 
+  setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom);
   setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom);
 
   setOperationAction(ISD::RET,           MVT::Other, Custom);
@@ -103,8 +104,10 @@
       FTOSID,
 
       FUITOS,
+      FTOUIS,
 
       FUITOD,
+      FTOUID,
 
       FMRRD,
 
@@ -155,7 +158,9 @@
   case ARMISD::FSITOD:        return "ARMISD::FSITOD";
   case ARMISD::FTOSID:        return "ARMISD::FTOSID";
   case ARMISD::FUITOS:        return "ARMISD::FUITOS";
+  case ARMISD::FTOUIS:        return "ARMISD::FTOUIS";
   case ARMISD::FUITOD:        return "ARMISD::FUITOD";
+  case ARMISD::FTOUID:        return "ARMISD::FTOUID";
   case ARMISD::FMRRD:         return "ARMISD::FMRRD";
   case ARMISD::FMDRR:         return "ARMISD::FMDRR";
   case ARMISD::FMSTAT:        return "ARMISD::FMSTAT";
@@ -614,6 +619,17 @@
   return DAG.getNode(op, vt, Tmp);
 }
 
+static SDOperand LowerFP_TO_UINT(SDOperand Op, SelectionDAG &DAG) {
+  assert(Op.getValueType() == MVT::i32);
+  SDOperand FloatVal = Op.getOperand(0);
+  MVT::ValueType  vt = FloatVal.getValueType();
+  assert(vt == MVT::f32 || vt == MVT::f64);
+
+  ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOUIS : ARMISD::FTOUID;
+  SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal);
+  return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp);
+}
+
 SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
   switch (Op.getOpcode()) {
   default:
@@ -627,6 +643,8 @@
     return LowerFP_TO_SINT(Op, DAG);
   case ISD::SINT_TO_FP:
     return LowerSINT_TO_FP(Op, DAG);
+  case ISD::FP_TO_UINT:
+    return LowerFP_TO_UINT(Op, DAG);
   case ISD::UINT_TO_FP:
     return LowerUINT_TO_FP(Op, DAG);
   case ISD::FORMAL_ARGUMENTS:


Index: llvm/lib/Target/ARM/ARMInstrInfo.td
diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.42 llvm/lib/Target/ARM/ARMInstrInfo.td:1.43
--- llvm/lib/Target/ARM/ARMInstrInfo.td:1.42	Tue Oct 10 14:35:00 2006
+++ llvm/lib/Target/ARM/ARMInstrInfo.td	Tue Oct 10 15:38:57 2006
@@ -81,7 +81,9 @@
 def armfsitod      : SDNode<"ARMISD::FSITOD", SDTUnaryOp>;
 def armftosid      : SDNode<"ARMISD::FTOSID", SDTUnaryOp>;
 def armfuitos      : SDNode<"ARMISD::FUITOS", SDTUnaryOp>;
+def armftouis      : SDNode<"ARMISD::FTOUIS", SDTUnaryOp>;
 def armfuitod      : SDNode<"ARMISD::FUITOD", SDTUnaryOp>;
+def armftouid      : SDNode<"ARMISD::FTOUID", SDTUnaryOp>;
 
 def SDTarmfmrrd    : SDTypeProfile<0, 3, [SDTCisInt<0>, SDTCisInt<1>, SDTCisFP<2>]>;
 def armfmrrd       : SDNode<"ARMISD::FMRRD", SDTarmfmrrd,
@@ -215,9 +217,15 @@
 def FUITOS  : InstARM<(ops FPRegs:$dst, FPRegs:$src),
                        "fuitos $dst, $src", [(set FPRegs:$dst, (armfuitos FPRegs:$src))]>;
 
+def FTOUIS  : InstARM<(ops FPRegs:$dst, FPRegs:$src),
+                       "ftouis $dst, $src", [(set FPRegs:$dst, (armftouis FPRegs:$src))]>;
+
 def FUITOD  : InstARM<(ops DFPRegs:$dst, FPRegs:$src),
                        "fuitod $dst, $src", [(set DFPRegs:$dst, (armfuitod FPRegs:$src))]>;
 
+def FTOUID  : InstARM<(ops FPRegs:$dst, DFPRegs:$src),
+                       "ftouid $dst, $src", [(set FPRegs:$dst, (armftouid DFPRegs:$src))]>;
+
 def FCVTDS  : InstARM<(ops DFPRegs:$dst, FPRegs:$src),
                        "fcvtds $dst, $src", [(set DFPRegs:$dst, (fextend FPRegs:$src))]>;
 





From sabre at nondot.org  Tue Oct 10 16:42:39 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 16:42:39 -0500
Subject: [llvm-commits] CVS: llvm/tools/bugpoint/ListReducer.h
Message-ID: <200610102142.k9ALgdkC026619@zion.cs.uiuc.edu>



Changes in directory llvm/tools/bugpoint:

ListReducer.h updated: 1.17 -> 1.18
---
Log message:

Make the bugpoint reduction heuristics more effective.  Patch submitted by
Domagoj Babic, thanks!


---
Diffs of the changes:  (+58 -2)

 ListReducer.h |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 58 insertions(+), 2 deletions(-)


Index: llvm/tools/bugpoint/ListReducer.h
diff -u llvm/tools/bugpoint/ListReducer.h:1.17 llvm/tools/bugpoint/ListReducer.h:1.18
--- llvm/tools/bugpoint/ListReducer.h:1.17	Mon Oct  9 15:12:37 2006
+++ llvm/tools/bugpoint/ListReducer.h	Tue Oct 10 16:42:25 2006
@@ -17,6 +17,8 @@
 
 #include 
 #include 
+#include 
+#include 
 
 namespace llvm {
   
@@ -46,6 +48,7 @@
   //
   bool reduceList(std::vector &TheList) {
     std::vector empty;
+    std::srand(0x6e5ea738); // Seed the random number generator
     switch (doTest(TheList, empty)) {
     case KeepPrefix:
       if (TheList.size() == 1) // we are done, it's the base case and it fails
@@ -62,13 +65,46 @@
       return false; // there is no failure with the full set of passes/funcs!
     }
 
+    // Maximal number of allowed splitting iterations,
+    // before the elements are randomly shuffled.
+    const unsigned MaxIterationsWithoutProgress = 3;
+    bool ShufflingEnabled = true;
+
+Backjump:
     unsigned MidTop = TheList.size();
-    while (MidTop > 1) {
+    unsigned MaxIterations = MaxIterationsWithoutProgress;
+    unsigned NumOfIterationsWithoutProgress = 0;
+    while (MidTop > 1) { // Binary split reduction loop
       // Halt if the user presses ctrl-c.
       if (BugpointIsInterrupted) {
         std::cerr << "\n\n*** Reduction Interrupted, cleaning up...\n\n";
         return true;
       }
+          	
+      // If the loop doesn't make satisfying progress, try shuffling.
+      // The purpose of shuffling is to avoid the heavy tails of the
+      // distribution (improving the speed of convergence).
+      if (ShufflingEnabled && 
+      	NumOfIterationsWithoutProgress > MaxIterations) {
+      		
+      	std::vector ShuffledList(TheList);
+      	std::random_shuffle(ShuffledList.begin(), ShuffledList.end());
+      	std::cerr << "\n\n*** Testing shuffled set...\n\n";
+      	// Check that random shuffle doesn't loose the bug
+      	if (doTest(ShuffledList, empty) == KeepPrefix) {
+          // If the bug is still here, use the shuffled list.
+          TheList.swap(ShuffledList);
+          MidTop = TheList.size();
+          // Must increase the shuffling treshold to avoid the small 
+          // probability of inifinite looping without making progress.
+          MaxIterations += 2;
+          std::cerr << "\n\n*** Shuffling does not hide the bug...\n\n";
+      	} else {
+          ShufflingEnabled = false; // Disable shuffling further on
+          std::cerr << "\n\n*** Shuffling hides the bug...\n\n";
+      	}
+      	NumOfIterationsWithoutProgress = 0;
+      }
       
       unsigned Mid = MidTop / 2;
       std::vector Prefix(TheList.begin(), TheList.begin()+Mid);
@@ -80,20 +116,31 @@
         // shorten the list to the "kept" elements.
         TheList.swap(Suffix);
         MidTop = TheList.size();
+        // Reset progress treshold and progress counter
+        MaxIterations = MaxIterationsWithoutProgress;
+        NumOfIterationsWithoutProgress = 0;
         break;
       case KeepPrefix:
         // The predicate still holds, shorten the list to the prefix elements.
         TheList.swap(Prefix);
         MidTop = TheList.size();
+        // Reset progress treshold and progress counter
+        MaxIterations = MaxIterationsWithoutProgress;
+        NumOfIterationsWithoutProgress = 0;
         break;
       case NoFailure:
         // Otherwise the property doesn't hold.  Some of the elements we removed
         // must be necessary to maintain the property.
         MidTop = Mid;
+        NumOfIterationsWithoutProgress++;
         break;
       }
     }
 
+    // Probability of backjumping from the trimming loop back to the binary
+    // split reduction loop.
+    const int BackjumpProbability = 10;
+
     // Okay, we trimmed as much off the top and the bottom of the list as we
     // could.  If there is more than two elements in the list, try deleting 
     // interior elements and testing that.
@@ -101,8 +148,17 @@
     if (TheList.size() > 2) {
       bool Changed = true;
       std::vector EmptyList;
-      while (Changed) {
+      while (Changed) {  // Trimming loop.
         Changed = false;
+        
+        // If the binary split reduction loop made an unfortunate sequence of
+        // splits, the trimming loop might be left off with a huge number of
+        // remaining elements (large search space). Backjumping out of that
+        // search space and attempting a different split can significantly 
+        // improve the convergence speed.
+        if (std::rand() % 100 < BackjumpProbability)
+          goto Backjump;
+        
         for (unsigned i = 1; i < TheList.size()-1; ++i) { // Check interior elts
           if (BugpointIsInterrupted) {
             std::cerr << "\n\n*** Reduction Interrupted, cleaning up...\n\n";





From sabre at nondot.org  Tue Oct 10 20:45:01 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 20:45:01 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/README.txt
Message-ID: <200610110145.k9B1j1pk030744@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/Alpha:

README.txt updated: 1.5 -> 1.6
---
Log message:

This has apparently been fixed


---
Diffs of the changes:  (+0 -30)

 README.txt |   30 ------------------------------
 1 files changed, 30 deletions(-)


Index: llvm/lib/Target/Alpha/README.txt
diff -u llvm/lib/Target/Alpha/README.txt:1.5 llvm/lib/Target/Alpha/README.txt:1.6
--- llvm/lib/Target/Alpha/README.txt:1.5	Sun Sep 24 08:13:10 2006
+++ llvm/lib/Target/Alpha/README.txt	Tue Oct 10 20:44:46 2006
@@ -151,33 +151,3 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Fix Ordered/Unordered FP stuff
 
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-improve bytezap opertunities
-ulong %foo(ulong %y) {
-entry:
-        %tmp = and ulong %y,  65535
-        %tmp2 = shr ulong %tmp,  ubyte 3
-        ret ulong %tmp2
-}
-
-
-compiles to a 3 instruction sequence without instcombine
-        zapnot $16,3,$0
-        srl $0,3,$0
-        ret $31,($26),1
- 
-After instcombine you get
-ulong %foo(ulong %y) {
-entry:
-        %tmp = shr ulong %y, ubyte 3            ;  [#uses=1]
-        %tmp2 = and ulong %tmp, 8191            ;  [#uses=1]
-        ret ulong %tmp2
-}
-
-which compiles to
-        lda $0,8191($31)
-        srl $16,3,$1
-        and $1,$0,$0
-        ret $31,($26),1
-





From sabre at nondot.org  Tue Oct 10 20:47:22 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 20:47:22 -0500
Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/zapnot3.ll
Message-ID: <200610110147.k9B1lMje030844@zion.cs.uiuc.edu>



Changes in directory llvm/test/Regression/CodeGen/Alpha:

zapnot3.ll added (r1.1)
---
Log message:

new testcase for zap generation, from the alpha readme


---
Diffs of the changes:  (+14 -0)

 zapnot3.ll |   14 ++++++++++++++
 1 files changed, 14 insertions(+)


Index: llvm/test/Regression/CodeGen/Alpha/zapnot3.ll
diff -c /dev/null llvm/test/Regression/CodeGen/Alpha/zapnot3.ll:1.1
*** /dev/null	Tue Oct 10 20:47:18 2006
--- llvm/test/Regression/CodeGen/Alpha/zapnot3.ll	Tue Oct 10 20:47:08 2006
***************
*** 0 ****
--- 1,14 ----
+ ; RUN: llvm-as < %s | llc -march=alpha | grep zapnot | wc -l | grep 2
+ 
+ ulong %foo(ulong %y) {
+         %tmp = and ulong %y,  65535
+         %tmp2 = shr ulong %tmp,  ubyte 3
+         ret ulong %tmp2
+ }
+ 
+ ulong %foo2(ulong %y) {
+         %tmp = shr ulong %y, ubyte 3            ;  [#uses=1]
+         %tmp2 = and ulong %tmp, 8191            ;  [#uses=1]
+         ret ulong %tmp2
+ }
+ 





From evan.cheng at apple.com  Tue Oct 10 20:48:14 2006
From: evan.cheng at apple.com (Evan Cheng)
Date: Tue, 10 Oct 2006 20:48:14 -0500
Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Message-ID: <200610110148.k9B1mEvd030887@zion.cs.uiuc.edu>



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAG.cpp updated: 1.345 -> 1.346
---
Log message:

FindModifiedNodeSlot needs to add LoadSDNode ivars to create proper SelectionDAGCSEMap ID.

---
Diffs of the changes:  (+9 -0)

 SelectionDAG.cpp |    9 +++++++++
 1 files changed, 9 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.345 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.346
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.345	Tue Oct 10 15:05:10 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Tue Oct 10 20:47:58 2006
@@ -454,6 +454,15 @@
   SelectionDAGCSEMap::NodeID ID;
   ID.SetOpcode(N->getOpcode());
   ID.SetValueTypes(N->getVTList());
+  if (const LoadSDNode *LD = dyn_cast(N)) {
+    ID.AddInteger(LD->getAddressingMode());
+    ID.AddInteger(LD->getExtensionType());
+    ID.AddInteger(LD->getLoadVT());
+    ID.AddPointer(LD->getSrcValue());
+    ID.AddInteger(LD->getSrcValueOffset());
+    ID.AddInteger(LD->getAlignment());
+    ID.AddInteger(LD->isVolatile());
+  }
   ID.SetOperands(Ops, NumOps);
   return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
 }





From alenhar2 at cs.uiuc.edu  Tue Oct 10 20:48:18 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 20:48:18 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/README.txt
Message-ID: <200610110148.k9B1mI6H030892@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/Alpha:

README.txt updated: 1.6 -> 1.7
---
Log message:

This entry is done.  switched to the gcc way of doing things.

---
Diffs of the changes:  (+0 -150)

 README.txt |  150 -------------------------------------------------------------
 1 files changed, 150 deletions(-)


Index: llvm/lib/Target/Alpha/README.txt
diff -u llvm/lib/Target/Alpha/README.txt:1.6 llvm/lib/Target/Alpha/README.txt:1.7
--- llvm/lib/Target/Alpha/README.txt:1.6	Tue Oct 10 20:44:46 2006
+++ llvm/lib/Target/Alpha/README.txt	Tue Oct 10 20:48:03 2006
@@ -1,153 +1,3 @@
-Fix jump table support.  currently it uses 64bit absolute address. 
-gcc uses gprel32.  This way I won't keep fighting Evan as he keeps
-breaking 64bit entries in jump tables...
-
-#include 
-#include 
-
-int main(int x, char** y)
-{
-char* foo;
-switch(x) {
-case 1:
-foo = "1";
-break;
-case 2:
-foo = "2";
-break;
-case 3:
-foo = "3";
-break;
-case 4:
-foo = "4";
-break;
-case 5:
-foo = "5";
-break;
-case 6:
-foo = "6";
-break;
-case 7:
-foo = "7";
-break;
-case 8:
-foo = "8";
-break;
-};
-print(foo);
-return 0;
-
-}
-
-
-        .set noreorder
-        .set volatile
-        .set noat
-        .set nomacro
-        .section        .rodata.str1.1,"aMS", at progbits,1
-$LC6:
-        .ascii "7\0"
-$LC7:
-        .ascii "8\0"
-$LC0:
-        .ascii "1\0"
-$LC1:
-        .ascii "2\0"
-$LC2:
-        .ascii "3\0"
-$LC3:
-        .ascii "4\0"
-$LC4:
-        .ascii "5\0"
-$LC5:
-        .ascii "6\0"
-        .text
-        .align 2
-        .align 4
-        .globl main
-        .ent main
-main:
-        .frame $30,16,$26,0
-        .mask 0x4000000,-16
-        ldah $29,0($27)         !gpdisp!1
-        lda $29,0($29)          !gpdisp!1
-$main..ng:
-        zapnot $16,15,$16
-        lda $30,-16($30)
-        cmpule $16,8,$1
-        stq $26,0($30)
-        .prologue 1
-        beq $1,$L2
-        ldah $6,$L11($29)               !gprelhigh
-        lda $5,$L11($6)         !gprellow
-        s4addq $16,$5,$0
-        ldl $2,0($0)
-        addq $29,$2,$3
-        jmp $31,($3),$L2
-        .section        .rodata
-        .align 2
-        .align 2
-$L11:
-        .gprel32 $L2
-        .gprel32 $L3
-        .gprel32 $L4
-        .gprel32 $L5
-        .gprel32 $L6
-        .gprel32 $L7
-        .gprel32 $L8
-        .gprel32 $L9
-        .gprel32 $L10
-        .text
-$L9:
-        ldah $20,$LC6($29)              !gprelhigh
-        lda $4,$LC6($20)                !gprellow
-        .align 4
-$L2:
-        mov $4,$16
-        ldq $27,print($29)              !literal!2
-        jsr $26,($27),print             !lituse_jsr!2
-        ldah $29,0($26)         !gpdisp!3
-        mov $31,$0
-        bis $31,$31,$31
-        lda $29,0($29)          !gpdisp!3
-        ldq $26,0($30)
-        lda $30,16($30)
-        ret $31,($26),1
-$L10:
-        ldah $21,$LC7($29)              !gprelhigh
-        lda $4,$LC7($21)                !gprellow
-        br $31,$L2
-$L3:
-        ldah $7,$LC0($29)               !gprelhigh
-        lda $4,$LC0($7)         !gprellow
-        br $31,$L2
-$L4:
-        ldah $8,$LC1($29)               !gprelhigh
-        lda $4,$LC1($8)         !gprellow
-        br $31,$L2
-$L5:
-        ldah $16,$LC2($29)              !gprelhigh
-        lda $4,$LC2($16)                !gprellow
-        br $31,$L2
-$L6:
-        ldah $17,$LC3($29)              !gprelhigh
-        lda $4,$LC3($17)                !gprellow
-        br $31,$L2
-$L7:
-        ldah $18,$LC4($29)              !gprelhigh
-        lda $4,$LC4($18)                !gprellow
-        br $31,$L2
-$L8:
-        ldah $19,$LC5($29)              !gprelhigh
-        lda $4,$LC5($19)                !gprellow
-        br $31,$L2
-        .end main
-        .section        .note.GNU-stack,"", at progbits
-        .ident  "GCC: (GNU) 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)"
-
-
-
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Fix Ordered/Unordered FP stuff
 





From sabre at nondot.org  Tue Oct 10 22:35:48 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 22:35:48 -0500
Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Message-ID: <200610110335.k9B3Zmo3032647@zion.cs.uiuc.edu>



Changes in directory llvm/utils/TableGen:

DAGISelEmitter.cpp updated: 1.264 -> 1.265
---
Log message:

Split some code out into a new method.  The generated code is exactly
identical, this is just a refactoring.


---
Diffs of the changes:  (+99 -92)

 DAGISelEmitter.cpp |  191 +++++++++++++++++++++++++++--------------------------
 1 files changed, 99 insertions(+), 92 deletions(-)


Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.264 llvm/utils/TableGen/DAGISelEmitter.cpp:1.265
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.264	Mon Oct  9 16:02:17 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp	Tue Oct 10 22:35:34 2006
@@ -15,6 +15,7 @@
 #include "Record.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/Debug.h"
+#include "llvm/Support/MathExtras.h"
 #include 
 #include 
 using namespace llvm;
@@ -2192,7 +2193,7 @@
   /// if the match fails. At this point, we already know that the opcode for N
   /// matches, and the SDNode for the result has the RootName specified name.
   void EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
-                     const std::string &RootName, const std::string &ParentName,
+                     const std::string &RootName,
                      const std::string &ChainSuffix, bool &FoundChain) {
     bool isRoot = (P == NULL);
     // Emit instruction predicates. Each predicate is just a string for now.
@@ -2279,9 +2280,11 @@
           if (PInfo.getNumOperands() > 1 ||
               PInfo.hasProperty(SDNodeInfo::SDNPHasChain) ||
               PInfo.hasProperty(SDNodeInfo::SDNPInFlag) ||
-              PInfo.hasProperty(SDNodeInfo::SDNPOptInFlag))
+              PInfo.hasProperty(SDNodeInfo::SDNPOptInFlag)) {
+            std::string ParentName(RootName.begin(), RootName.end()-1);
             emitCheck("CanBeFoldedBy(" + RootName + ".Val, " + ParentName +
                       ".Val)");
+          }
         }
       }
 
@@ -2316,101 +2319,17 @@
     if (!N->getPredicateFn().empty())
       emitCheck(N->getPredicateFn() + "(" + RootName + ".Val)");
 
-    const ComplexPattern *CP;
+    
     for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {
       emitInit("SDOperand " + RootName + utostr(OpNo) + " = " +
                RootName + ".getOperand(" +utostr(OpNo) + ");");
 
-      TreePatternNode *Child = N->getChild(i);    
-      if (!Child->isLeaf()) {
-        // If it's not a leaf, recursively match.
-        const SDNodeInfo &CInfo = ISE.getSDNodeInfo(Child->getOperator());
-        emitCheck(RootName + utostr(OpNo) + ".getOpcode() == " +
-                  CInfo.getEnumName());
-        EmitMatchCode(Child, N, RootName + utostr(OpNo), RootName,
-                      ChainSuffix + utostr(OpNo), FoundChain);
-        if (NodeHasProperty(Child, SDNodeInfo::SDNPHasChain, ISE))
-          FoldedChains.push_back(std::make_pair(RootName + utostr(OpNo),
-                                                CInfo.getNumResults()));
-      } else {
-        // If this child has a name associated with it, capture it in VarMap. If
-        // we already saw this in the pattern, emit code to verify dagness.
-        if (!Child->getName().empty()) {
-          std::string &VarMapEntry = VariableMap[Child->getName()];
-          if (VarMapEntry.empty()) {
-            VarMapEntry = RootName + utostr(OpNo);
-          } else {
-            // If we get here, this is a second reference to a specific name.
-            // Since we already have checked that the first reference is valid,
-            // we don't have to recursively match it, just check that it's the
-            // same as the previously named thing.
-            emitCheck(VarMapEntry + " == " + RootName + utostr(OpNo));
-            Duplicates.insert(RootName + utostr(OpNo));
-            continue;
-          }
-        }
-      
-        // Handle leaves of various types.
-        if (DefInit *DI = dynamic_cast(Child->getLeafValue())) {
-          Record *LeafRec = DI->getDef();
-          if (LeafRec->isSubClassOf("RegisterClass")) {
-            // Handle register references.  Nothing to do here.
-          } else if (LeafRec->isSubClassOf("Register")) {
-            // Handle register references.
-          } else if (LeafRec->isSubClassOf("ComplexPattern")) {
-            // Handle complex pattern.
-            CP = NodeGetComplexPattern(Child, ISE);
-            std::string Fn = CP->getSelectFunc();
-            unsigned NumOps = CP->getNumOperands();
-            for (unsigned i = 0; i < NumOps; ++i) {
-              emitDecl("CPTmp" + utostr(i));
-              emitCode("SDOperand CPTmp" + utostr(i) + ";");
-            }
-
-            std::string Code = Fn + "(" + RootName + utostr(OpNo);
-            for (unsigned i = 0; i < NumOps; i++)
-              Code += ", CPTmp" + utostr(i);
-            emitCheck(Code + ")");
-          } else if (LeafRec->getName() == "srcvalue") {
-            // Place holder for SRCVALUE nodes. Nothing to do here.
-          } else if (LeafRec->isSubClassOf("ValueType")) {
-            // Make sure this is the specified value type.
-            emitCheck("cast(" + RootName + utostr(OpNo) +
-                      ")->getVT() == MVT::" + LeafRec->getName());
-          } else if (LeafRec->isSubClassOf("CondCode")) {
-            // Make sure this is the specified cond code.
-            emitCheck("cast(" + RootName + utostr(OpNo) +
-                      ")->get() == ISD::" + LeafRec->getName());
-          } else {
-#ifndef NDEBUG
-            Child->dump();
-            std::cerr << " ";
-#endif
-            assert(0 && "Unknown leaf type!");
-          }
-
-          // If there is a node predicate for this, emit the call.
-          if (!Child->getPredicateFn().empty())
-            emitCheck(Child->getPredicateFn() + "(" + RootName + utostr(OpNo) +
-                      ".Val)");
-        } else if (IntInit *II =
-                       dynamic_cast(Child->getLeafValue())) {
-          emitCheck("isa(" + RootName + utostr(OpNo) + ")");
-          unsigned CTmp = TmpNo++;
-          emitCode("int64_t CN"+utostr(CTmp)+" = cast("+
-                   RootName + utostr(OpNo) + ")->getSignExtended();");
-
-          emitCheck("CN" + utostr(CTmp) + " == " +itostr(II->getValue()));
-        } else {
-#ifndef NDEBUG
-          Child->dump();
-#endif
-          assert(0 && "Unknown leaf type!");
-        }
-      }
+      EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo),
+                         ChainSuffix + utostr(OpNo), FoundChain);
     }
 
     // Handle cases when root is a complex pattern.
+    const ComplexPattern *CP;
     if (isRoot && N->isLeaf() && (CP = NodeGetComplexPattern(N, ISE))) {
       std::string Fn = CP->getSelectFunc();
       unsigned NumOps = CP->getNumOperands();
@@ -2425,6 +2344,95 @@
       emitCheck(Code + ")");
     }
   }
+  
+  void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent,
+                          const std::string &RootName,
+                          const std::string &ChainSuffix, bool &FoundChain) {
+    if (!Child->isLeaf()) {
+      // If it's not a leaf, recursively match.
+      const SDNodeInfo &CInfo = ISE.getSDNodeInfo(Child->getOperator());
+      emitCheck(RootName + ".getOpcode() == " +
+                CInfo.getEnumName());
+      EmitMatchCode(Child, Parent, RootName, ChainSuffix, FoundChain);
+      if (NodeHasProperty(Child, SDNodeInfo::SDNPHasChain, ISE))
+        FoldedChains.push_back(std::make_pair(RootName, CInfo.getNumResults()));
+    } else {
+      // If this child has a name associated with it, capture it in VarMap. If
+      // we already saw this in the pattern, emit code to verify dagness.
+      if (!Child->getName().empty()) {
+        std::string &VarMapEntry = VariableMap[Child->getName()];
+        if (VarMapEntry.empty()) {
+          VarMapEntry = RootName;
+        } else {
+          // If we get here, this is a second reference to a specific name.
+          // Since we already have checked that the first reference is valid,
+          // we don't have to recursively match it, just check that it's the
+          // same as the previously named thing.
+          emitCheck(VarMapEntry + " == " + RootName);
+          Duplicates.insert(RootName);
+          return;
+        }
+      }
+      
+      // Handle leaves of various types.
+      if (DefInit *DI = dynamic_cast(Child->getLeafValue())) {
+        Record *LeafRec = DI->getDef();
+        if (LeafRec->isSubClassOf("RegisterClass")) {
+          // Handle register references.  Nothing to do here.
+        } else if (LeafRec->isSubClassOf("Register")) {
+          // Handle register references.
+        } else if (LeafRec->isSubClassOf("ComplexPattern")) {
+          // Handle complex pattern.
+          const ComplexPattern *CP = NodeGetComplexPattern(Child, ISE);
+          std::string Fn = CP->getSelectFunc();
+          unsigned NumOps = CP->getNumOperands();
+          for (unsigned i = 0; i < NumOps; ++i) {
+            emitDecl("CPTmp" + utostr(i));
+            emitCode("SDOperand CPTmp" + utostr(i) + ";");
+          }
+          
+          std::string Code = Fn + "(" + RootName;
+          for (unsigned i = 0; i < NumOps; i++)
+            Code += ", CPTmp" + utostr(i);
+          emitCheck(Code + ")");
+        } else if (LeafRec->getName() == "srcvalue") {
+          // Place holder for SRCVALUE nodes. Nothing to do here.
+        } else if (LeafRec->isSubClassOf("ValueType")) {
+          // Make sure this is the specified value type.
+          emitCheck("cast(" + RootName +
+                    ")->getVT() == MVT::" + LeafRec->getName());
+        } else if (LeafRec->isSubClassOf("CondCode")) {
+          // Make sure this is the specified cond code.
+          emitCheck("cast(" + RootName +
+                    ")->get() == ISD::" + LeafRec->getName());
+        } else {
+#ifndef NDEBUG
+          Child->dump();
+          std::cerr << " ";
+#endif
+          assert(0 && "Unknown leaf type!");
+        }
+        
+        // If there is a node predicate for this, emit the call.
+        if (!Child->getPredicateFn().empty())
+          emitCheck(Child->getPredicateFn() + "(" + RootName +
+                    ".Val)");
+      } else if (IntInit *II =
+                 dynamic_cast(Child->getLeafValue())) {
+        emitCheck("isa(" + RootName + ")");
+        unsigned CTmp = TmpNo++;
+        emitCode("int64_t CN"+utostr(CTmp)+" = cast("+
+                 RootName + ")->getSignExtended();");
+        
+        emitCheck("CN" + utostr(CTmp) + " == " +itostr(II->getValue()));
+      } else {
+#ifndef NDEBUG
+        Child->dump();
+#endif
+        assert(0 && "Unknown leaf type!");
+      }
+    }
+  }
 
   /// EmitResultCode - Emit the action for a pattern.  Now that it has matched
   /// we actually have to build a DAG!
@@ -3003,8 +3011,7 @@
 
   // Emit the matcher, capturing named arguments in VariableMap.
   bool FoundChain = false;
-  Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", "",
-                        FoundChain);
+  Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", FoundChain);
 
   // TP - Get *SOME* tree pattern, we don't care which.
   TreePattern &TP = *PatternFragments.begin()->second;





From sabre at nondot.org  Tue Oct 10 22:58:17 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 22:58:17 -0500
Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGISel.h
Message-ID: <200610110358.k9B3wHSS000579@zion.cs.uiuc.edu>



Changes in directory llvm/include/llvm/CodeGen:

SelectionDAGISel.h updated: 1.25 -> 1.26
---
Log message:

add two helper methods.


---
Diffs of the changes:  (+4 -0)

 SelectionDAGISel.h |    4 ++++
 1 files changed, 4 insertions(+)


Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h
diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.25 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.26
--- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.25	Thu Sep 28 01:17:10 2006
+++ llvm/include/llvm/CodeGen/SelectionDAGISel.h	Tue Oct 10 22:58:02 2006
@@ -123,6 +123,10 @@
   void SelectInlineAsmMemoryOperands(std::vector &Ops,
                                      SelectionDAG &DAG);
 
+  // Calls to these predicates are generated by tblgen.
+  bool CheckAndMask(SDOperand LHS, ConstantSDNode *RHS, int64_t DesiredMaskS);  
+  bool CheckOrMask(SDOperand LHS, ConstantSDNode *RHS, int64_t DesiredMaskS);  
+  
 private:
   void SplitCritEdgesForPHIConstants(BasicBlock *BB);
   SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL,





From sabre at nondot.org  Tue Oct 10 22:58:18 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 22:58:18 -0500
Subject: [llvm-commits] CVS:
	llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Message-ID: <200610110358.k9B3wIVp000584@zion.cs.uiuc.edu>



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.285 -> 1.286
---
Log message:

add two helper methods.


---
Diffs of the changes:  (+90 -1)

 SelectionDAGISel.cpp |   91 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 90 insertions(+), 1 deletion(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.285 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.286
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.285	Mon Oct  9 15:57:24 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Tue Oct 10 22:58:02 2006
@@ -3204,7 +3204,28 @@
 /// critical, split them so that the assignments of a constant to a register
 /// will not be executed on a path that isn't relevant.
 void SelectionDAGISel::SplitCritEdgesForPHIConstants(BasicBlock *BB) {
-  PHINode *PN;
+  // The most common case is that this is a PHI node with two incoming
+  // successors handle this case efficiently, because it is simple.
+  PHINode *PN = cast(BB->begin());
+  if (PN->getNumIncomingValues() == 2) {
+    // If neither edge is critical, we never need to split.
+    if (PN->getIncomingBlock(0)->getTerminator()->getNumSuccessors() == 1 &&
+        PN->getIncomingBlock(1)->getTerminator()->getNumSuccessors() == 1)
+      return;
+    
+    BasicBlock::iterator BBI = BB->begin();
+    while ((PN = dyn_cast(BBI++))) {
+      for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+        if (isa(PN->getIncomingValue(i)))
+          SplitCriticalEdge(PN->getIncomingBlock(i), BB);
+    }
+    return;
+  }
+  
+  // Otherwise, things are a bit trickier.
+  
+  // BE SMART HERE.
+  
   BasicBlock::iterator BBI = BB->begin();
   while ((PN = dyn_cast(BBI++))) {
     for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
@@ -3679,6 +3700,74 @@
   return new HazardRecognizer();
 }
 
+//===----------------------------------------------------------------------===//
+// Helper functions used by the generated instruction selector.
+//===----------------------------------------------------------------------===//
+// Calls to these methods are generated by tblgen.
+
+/// CheckAndMask - The isel is trying to match something like (and X, 255).  If
+/// the dag combiner simplified the 255, we still want to match.  RHS is the
+/// actual value in the DAG on the RHS of an AND, and DesiredMaskS is the value
+/// specified in the .td file (e.g. 255).
+bool SelectionDAGISel::CheckAndMask(SDOperand LHS, ConstantSDNode *RHS, 
+                                    int64_t DesiredMaskS) {
+  uint64_t ActualMask = RHS->getValue();
+  uint64_t DesiredMask =DesiredMaskS & MVT::getIntVTBitMask(LHS.getValueType());
+  
+  // If the actual mask exactly matches, success!
+  if (ActualMask == DesiredMask)
+    return true;
+  
+  // If the actual AND mask is allowing unallowed bits, this doesn't match.
+  if (ActualMask & ~DesiredMask)
+    return false;
+  
+  // Otherwise, the DAG Combiner may have proven that the value coming in is
+  // either already zero or is not demanded.  Check for known zero input bits.
+  uint64_t NeededMask = DesiredMask & ~ActualMask;
+  if (getTargetLowering().MaskedValueIsZero(LHS, NeededMask))
+    return true;
+  
+  // TODO: check to see if missing bits are just not demanded.
+
+  // Otherwise, this pattern doesn't match.
+  return false;
+}
+
+/// CheckOrMask - The isel is trying to match something like (or X, 255).  If
+/// the dag combiner simplified the 255, we still want to match.  RHS is the
+/// actual value in the DAG on the RHS of an OR, and DesiredMaskS is the value
+/// specified in the .td file (e.g. 255).
+bool SelectionDAGISel::CheckOrMask(SDOperand LHS, ConstantSDNode *RHS, 
+                                    int64_t DesiredMaskS) {
+  uint64_t ActualMask = RHS->getValue();
+  uint64_t DesiredMask =DesiredMaskS & MVT::getIntVTBitMask(LHS.getValueType());
+  
+  // If the actual mask exactly matches, success!
+  if (ActualMask == DesiredMask)
+    return true;
+  
+  // If the actual AND mask is allowing unallowed bits, this doesn't match.
+  if (ActualMask & ~DesiredMask)
+    return false;
+  
+  // Otherwise, the DAG Combiner may have proven that the value coming in is
+  // either already zero or is not demanded.  Check for known zero input bits.
+  uint64_t NeededMask = DesiredMask & ~ActualMask;
+  
+  uint64_t KnownZero, KnownOne;
+  getTargetLowering().ComputeMaskedBits(LHS, NeededMask, KnownZero, KnownOne);
+  
+  // If all the missing bits in the or are already known to be set, match!
+  if ((NeededMask & KnownOne) == NeededMask)
+    return true;
+  
+  // TODO: check to see if missing bits are just not demanded.
+  
+  // Otherwise, this pattern doesn't match.
+  return false;
+}
+
 
 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
 /// by tblgen.  Others should not call it.





From sabre at nondot.org  Tue Oct 10 23:00:02 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 23:00:02 -0500
Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/cmpbge.ll
Message-ID: <200610110400.k9B402e0000663@zion.cs.uiuc.edu>



Changes in directory llvm/test/Regression/CodeGen/Alpha:

cmpbge.ll added (r1.1)
---
Log message:

Both of these functions should turn into cmpbge instructions, even though
the second has an and of 254 not 255.


---
Diffs of the changes:  (+16 -0)

 cmpbge.ll |   16 ++++++++++++++++
 1 files changed, 16 insertions(+)


Index: llvm/test/Regression/CodeGen/Alpha/cmpbge.ll
diff -c /dev/null llvm/test/Regression/CodeGen/Alpha/cmpbge.ll:1.1
*** /dev/null	Tue Oct 10 22:59:58 2006
--- llvm/test/Regression/CodeGen/Alpha/cmpbge.ll	Tue Oct 10 22:59:48 2006
***************
*** 0 ****
--- 1,16 ----
+ ; RUN: llvm-as < %s | llc -march=alpha | grep cmpbge | wc -l | grep 2
+ 
+ bool %test1(ulong %A, ulong %B) {
+ 	%C = and ulong %A, 255
+ 	%D = and ulong %B, 255
+ 	%E = setge ulong %C, %D
+ 	ret bool %E
+ }
+ 
+ bool %test2(ulong %a, ulong %B) {
+ 	%A = shl ulong %a, ubyte 1
+ 	%C = and ulong %A, 254
+ 	%D = and ulong %B, 255
+ 	%E = setge ulong %C, %D
+ 	ret bool %E
+ }





From sabre at nondot.org  Tue Oct 10 23:06:09 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 23:06:09 -0500
Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Message-ID: <200610110406.k9B469K6000817@zion.cs.uiuc.edu>



Changes in directory llvm/utils/TableGen:

DAGISelEmitter.cpp updated: 1.265 -> 1.266
---
Log message:

Special case tblgen generated code for patterns like (and X, 255) or (or X, 42).
The dag/inst combiners often 'simplify' the masked value based on whether
or not the bits are live or known zero/one.  This is good and dandy, but 
often causes special case patterns to fail, such as alpha's CMPBGE pattern,
which looks like "(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))".
Here the pattern for (and X, 255) should match actual dags like (and X, 254) if
the dag combiner proved that the missing bits are already zero (one for 'or').

For CodeGen/Alpha/cmpbge.ll:test2 for example, this results in:

        sll $16,1,$0
        cmpbge $0,$17,$0
        ret $31,($26),1

instead of:

        sll $16,1,$0
        and $0,254,$0
        and $17,255,$1
        cmpule $1,$0,$0
        ret $31,($26),1

... and requires no target-specific code.



---
Diffs of the changes:  (+36 -1)

 DAGISelEmitter.cpp |   37 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 36 insertions(+), 1 deletion(-)


Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.265 llvm/utils/TableGen/DAGISelEmitter.cpp:1.266
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.265	Tue Oct 10 22:35:34 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp	Tue Oct 10 23:05:55 2006
@@ -2320,6 +2320,41 @@
       emitCheck(N->getPredicateFn() + "(" + RootName + ".Val)");
 
     
+    // If this is an 'and R, 1234' where the operation is AND/OR and the RHS is
+    // a constant without a predicate fn that has more that one bit set, handle
+    // this as a special case.  This is usually for targets that have special
+    // handling of certain large constants (e.g. alpha with it's 8/16/32-bit
+    // handling stuff).  Using these instructions is often far more efficient
+    // than materializing the constant.  Unfortunately, both the instcombiner
+    // and the dag combiner can often infer that bits are dead, and thus drop
+    // them from the mask in the dag.  For example, it might turn 'AND X, 255'
+    // into 'AND X, 254' if it knows the low bit is set.  Emit code that checks
+    // to handle this.
+    if (!N->isLeaf() && 
+        (N->getOperator()->getName() == "and" || 
+         N->getOperator()->getName() == "or") &&
+        N->getChild(1)->isLeaf() &&
+        N->getChild(1)->getPredicateFn().empty()) {
+      if (IntInit *II = dynamic_cast(N->getChild(1)->getLeafValue())) {
+        if (!isPowerOf2_32(II->getValue())) {  // Don't bother with single bits.
+          emitInit("SDOperand " + RootName + "0" + " = " +
+                   RootName + ".getOperand(" + utostr(0) + ");");
+          emitInit("SDOperand " + RootName + "1" + " = " +
+                   RootName + ".getOperand(" + utostr(1) + ");");
+
+          emitCheck("isa(" + RootName + "1)");
+          const char *MaskPredicate = N->getOperator()->getName() == "or"
+            ? "CheckOrMask(" : "CheckAndMask(";
+          emitCheck(MaskPredicate + RootName + "0, cast(" +
+                    RootName + "1), " + itostr(II->getValue()) + ")");
+          
+          EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0),
+                             ChainSuffix + utostr(0), FoundChain);
+          return;
+        }
+      }
+    }
+    
     for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {
       emitInit("SDOperand " + RootName + utostr(OpNo) + " = " +
                RootName + ".getOperand(" +utostr(OpNo) + ");");
@@ -2344,7 +2379,7 @@
       emitCheck(Code + ")");
     }
   }
-  
+
   void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent,
                           const std::string &RootName,
                           const std::string &ChainSuffix, bool &FoundChain) {





From sabre at nondot.org  Tue Oct 10 23:12:53 2006
From: sabre at nondot.org (Chris Lattner)
Date: Tue, 10 Oct 2006 23:12:53 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaInstrInfo.td
Message-ID: <200610110412.k9B4CrU0000976@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/Alpha:

AlphaInstrInfo.td updated: 1.126 -> 1.127
---
Log message:

Remove dead/redundant instructions.  These are handled by ZAPNOTi


---
Diffs of the changes:  (+1 -6)

 AlphaInstrInfo.td |    7 +------
 1 files changed, 1 insertion(+), 6 deletions(-)


Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td
diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.126 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.127
--- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.126	Mon Oct  9 15:57:24 2006
+++ llvm/lib/Target/Alpha/AlphaInstrInfo.td	Tue Oct 10 23:12:39 2006
@@ -385,12 +385,7 @@
                       [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))], s_ilog>;
 def XORi     : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
                       [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))], s_ilog>;
-//FIXME: what to do about zap? the cases it catches are very complex
-def ZAP      : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", [], s_ishf>; //Zero bytes
-//ZAPi is useless give ZAPNOTi
-def ZAPi     : OFormL<0x12, 0x30, "zap $RA,$L,$RC", [], s_ishf>; //Zero bytes
-//FIXME: what to do about zapnot? see ZAP :)
-def ZAPNOT   : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", [], s_ishf>; //Zero bytes not
+                      
 def ZAPNOTi  : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", 
                       [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))], s_ishf>; 
 





From alenhar2 at cs.uiuc.edu  Tue Oct 10 23:30:04 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 23:30:04 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
	AlphaISelLowering.cpp AlphaISelLowering.h
	AlphaTargetMachine.cpp AlphaTargetMachine.h
Message-ID: <200610110430.k9B4U47L001311@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/Alpha:

AlphaISelDAGToDAG.cpp updated: 1.55 -> 1.56
AlphaISelLowering.cpp updated: 1.66 -> 1.67
AlphaISelLowering.h updated: 1.19 -> 1.20
AlphaTargetMachine.cpp updated: 1.33 -> 1.34
AlphaTargetMachine.h updated: 1.17 -> 1.18
---
Log message:

Jimptables working again on alpha.

As a bonus, use the GOT node instead of the AlphaISD::GOT for internal stuff.



---
Diffs of the changes:  (+18 -16)

 AlphaISelDAGToDAG.cpp  |    5 +++--
 AlphaISelLowering.cpp  |   18 ++++++++----------
 AlphaISelLowering.h    |    3 ---
 AlphaTargetMachine.cpp |    3 ++-
 AlphaTargetMachine.h   |    5 +++++
 5 files changed, 18 insertions(+), 16 deletions(-)


Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.55 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.56
--- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.55	Sun Aug 27 03:12:27 2006
+++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp	Tue Oct 10 23:29:42 2006
@@ -99,7 +99,8 @@
 
   public:
     AlphaDAGToDAGISel(TargetMachine &TM)
-      : SelectionDAGISel(AlphaLowering), AlphaLowering(TM) 
+      : SelectionDAGISel(AlphaLowering), 
+	AlphaLowering(*(AlphaTargetLowering*)(TM.getTargetLowering())) 
     {}
 
     /// getI64Imm - Return a target constant with the specified value, of type
@@ -201,7 +202,7 @@
                                 CurDAG->getTargetFrameIndex(FI, MVT::i32),
                                 getI64Imm(0));
   }
-  case AlphaISD::GlobalBaseReg: {
+  case ISD::GLOBAL_OFFSET_TABLE: {
     SDOperand Result = getGlobalBaseReg();
     ReplaceUses(Op, Result);
     return NULL;


Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.66 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.67
--- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.66	Mon Oct  9 15:57:24 2006
+++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp	Tue Oct 10 23:29:42 2006
@@ -132,7 +132,6 @@
 
   setOperationAction(ISD::JumpTable, MVT::i64, Custom);
   setOperationAction(ISD::JumpTable, MVT::i32, Custom);
-  setOperationAction(ISD::JumpTableRelocBase, MVT::i64, Custom);
 
   setStackPointerRegisterToSaveRestore(Alpha::R30);
 
@@ -160,7 +159,6 @@
   case AlphaISD::GPRelHi: return "Alpha::GPRelHi";
   case AlphaISD::GPRelLo: return "Alpha::GPRelLo";
   case AlphaISD::RelLit: return "Alpha::RelLit";
-  case AlphaISD::GlobalBaseReg: return "Alpha::GlobalBaseReg";
   case AlphaISD::GlobalRetAddr: return "Alpha::GlobalRetAddr";
   case AlphaISD::CALL:   return "Alpha::CALL";
   case AlphaISD::DivCall: return "Alpha::DivCall";
@@ -177,7 +175,7 @@
   const TargetMachine &TM = DAG.getTarget();
 
   SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi,  MVT::i64, JTI,
-			     DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+			     DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, MVT::i64));
   SDOperand Lo = DAG.getNode(AlphaISD::GPRelLo, MVT::i64, JTI, Hi);
   return Lo;
 }
@@ -414,8 +412,6 @@
 							   GP, RA);
   case ISD::RET: return LowerRET(Op,DAG, getVRegRA());
   case ISD::JumpTable: return LowerJumpTable(Op, DAG);
-  case ISD::JumpTableRelocBase: 
-    return DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64);
 
   case ISD::SINT_TO_FP: {
     assert(MVT::i64 == Op.getOperand(0).getValueType() && 
@@ -462,7 +458,7 @@
     SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i64, CP->getAlignment());
     
     SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi,  MVT::i64, CPI,
-			       DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+			       DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, MVT::i64));
     SDOperand Lo = DAG.getNode(AlphaISD::GPRelLo, MVT::i64, CPI, Hi);
     return Lo;
   }
@@ -474,16 +470,18 @@
     //    if (!GV->hasWeakLinkage() && !GV->isExternal() && !GV->hasLinkOnceLinkage()) {
     if (GV->hasInternalLinkage()) {
       SDOperand Hi = DAG.getNode(AlphaISD::GPRelHi,  MVT::i64, GA,
-				 DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+				 DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, MVT::i64));
       SDOperand Lo = DAG.getNode(AlphaISD::GPRelLo, MVT::i64, GA, Hi);
       return Lo;
     } else
-      return DAG.getNode(AlphaISD::RelLit, MVT::i64, GA, DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+      return DAG.getNode(AlphaISD::RelLit, MVT::i64, GA, 
+			 DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, MVT::i64));
   }
   case ISD::ExternalSymbol: {
     return DAG.getNode(AlphaISD::RelLit, MVT::i64, 
-		       DAG.getTargetExternalSymbol(cast(Op)->getSymbol(), MVT::i64),
-		       DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
+		       DAG.getTargetExternalSymbol(cast(Op)
+						   ->getSymbol(), MVT::i64),
+		       DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, MVT::i64));
   }
 
   case ISD::UREM:


Index: llvm/lib/Target/Alpha/AlphaISelLowering.h
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.19 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.20
--- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.19	Wed Jun 21 08:37:27 2006
+++ llvm/lib/Target/Alpha/AlphaISelLowering.h	Tue Oct 10 23:29:42 2006
@@ -36,9 +36,6 @@
       /// RetLit - Literal Relocation of a Global
       RelLit,
 
-      /// GlobalBaseReg - used to restore the GOT ptr
-      GlobalBaseReg,
-
       /// GlobalRetAddr - used to restore the return address
       GlobalRetAddr,
       


Index: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp
diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.33 llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.34
--- llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.33	Sun Sep 24 14:46:56 2006
+++ llvm/lib/Target/Alpha/AlphaTargetMachine.cpp	Tue Oct 10 23:29:42 2006
@@ -58,7 +58,8 @@
   : DataLayout("e"),
     FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0),
     JITInfo(*this),
-    Subtarget(M, FS) {
+    Subtarget(M, FS),
+    TLInfo(*this) {
   setRelocationModel(Reloc::PIC_);
 }
 


Index: llvm/lib/Target/Alpha/AlphaTargetMachine.h
diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.17 llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.18
--- llvm/lib/Target/Alpha/AlphaTargetMachine.h:1.17	Thu Sep  7 18:39:26 2006
+++ llvm/lib/Target/Alpha/AlphaTargetMachine.h	Tue Oct 10 23:29:42 2006
@@ -19,6 +19,7 @@
 #include "llvm/Target/TargetFrameInfo.h"
 #include "AlphaInstrInfo.h"
 #include "AlphaJITInfo.h"
+#include "AlphaISelLowering.h"
 #include "AlphaSubtarget.h"
 
 namespace llvm {
@@ -31,6 +32,7 @@
   TargetFrameInfo FrameInfo;
   AlphaJITInfo JITInfo;
   AlphaSubtarget Subtarget;
+  AlphaTargetLowering TLInfo;
   
 protected:
   virtual const TargetAsmInfo *createTargetAsmInfo() const;
@@ -44,6 +46,9 @@
   virtual const MRegisterInfo *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
+  virtual TargetLowering* getTargetLowering() const { 
+    return const_cast(&TLInfo);
+  }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }
   virtual TargetJITInfo* getJITInfo() {
     return &JITInfo;





From alenhar2 at cs.uiuc.edu  Tue Oct 10 23:30:00 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 23:30:00 -0500
Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h
Message-ID: <200610110430.k9B4U0np001282@zion.cs.uiuc.edu>



Changes in directory llvm/include/llvm/CodeGen:

SelectionDAGNodes.h updated: 1.151 -> 1.152
---
Log message:

Jimptables working again on alpha.

As a bonus, use the GOT node instead of the AlphaISD::GOT for internal stuff.



---
Diffs of the changes:  (+2 -2)

 SelectionDAGNodes.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)


Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h
diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.151 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.152
--- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.151	Mon Oct  9 20:44:58 2006
+++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h	Tue Oct 10 23:29:42 2006
@@ -82,8 +82,8 @@
     Constant, ConstantFP,
     GlobalAddress, FrameIndex, JumpTable, ConstantPool, ExternalSymbol,
 
-    // The relocation value to add to the value loaded from a jump table
-    JumpTableRelocBase,
+    // The address of the GOT
+    GLOBAL_OFFSET_TABLE,
 
     // TargetConstant* - Like Constant*, but the DAG does not do any folding or
     // simplification of the constant.





From alenhar2 at cs.uiuc.edu  Tue Oct 10 23:30:03 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 23:30:03 -0500
Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/jmp_table.ll
Message-ID: <200610110430.k9B4U3VF001296@zion.cs.uiuc.edu>



Changes in directory llvm/test/Regression/CodeGen/Alpha:

jmp_table.ll updated: 1.4 -> 1.5
---
Log message:

Jimptables working again on alpha.

As a bonus, use the GOT node instead of the AlphaISD::GOT for internal stuff.



---
Diffs of the changes:  (+0 -2)

 jmp_table.ll |    2 --
 1 files changed, 2 deletions(-)


Index: llvm/test/Regression/CodeGen/Alpha/jmp_table.ll
diff -u llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.4 llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.5
--- llvm/test/Regression/CodeGen/Alpha/jmp_table.ll:1.4	Mon Oct  9 12:34:40 2006
+++ llvm/test/Regression/CodeGen/Alpha/jmp_table.ll	Tue Oct 10 23:29:42 2006
@@ -4,8 +4,6 @@
 ; RUN: llvm-as < %s | llc -march=alpha | grep 'ldl' &&
 ; RUN: llvm-as < %s | llc -march=alpha | grep 'rodata'
 
-; XFAIL: *
-
 target endian = little
 target pointersize = 64
 target triple = "alphaev67-unknown-linux-gnu"





From alenhar2 at cs.uiuc.edu  Tue Oct 10 23:30:03 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 23:30:03 -0500
Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp
Message-ID: <200610110430.k9B4U3mr001293@zion.cs.uiuc.edu>



Changes in directory llvm/lib/CodeGen:

AsmPrinter.cpp updated: 1.108 -> 1.109
---
Log message:

Jimptables working again on alpha.

As a bonus, use the GOT node instead of the AlphaISD::GOT for internal stuff.



---
Diffs of the changes:  (+1 -1)

 AsmPrinter.cpp |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.108 llvm/lib/CodeGen/AsmPrinter.cpp:1.109
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.108	Fri Oct  6 17:50:56 2006
+++ llvm/lib/CodeGen/AsmPrinter.cpp	Tue Oct 10 23:29:42 2006
@@ -204,7 +204,7 @@
     TargetLowering *LoweringInfo = TM.getTargetLowering();
     if (LoweringInfo && LoweringInfo->usesGlobalOffsetTable()) {
       SwitchToDataSection(TAI->getJumpTableDataSection(), 0);
-      if (TD->getPointerSize() == 8)
+      if (TD->getPointerSize() == 8 && !JTEntryDirective)
         JTEntryDirective = TAI->getData64bitsDirective();
     } else {      
       // In PIC mode, we need to emit the jump table to the same section as the





From alenhar2 at cs.uiuc.edu  Tue Oct 10 23:30:04 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Tue, 10 Oct 2006 23:30:04 -0500
Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
	SelectionDAG.cpp SelectionDAGISel.cpp
Message-ID: <200610110430.k9B4U4Sp001318@zion.cs.uiuc.edu>



Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.408 -> 1.409
SelectionDAG.cpp updated: 1.346 -> 1.347
SelectionDAGISel.cpp updated: 1.286 -> 1.287
---
Log message:

Jimptables working again on alpha.

As a bonus, use the GOT node instead of the AlphaISD::GOT for internal stuff.



---
Diffs of the changes:  (+7 -13)

 LegalizeDAG.cpp      |   12 +-----------
 SelectionDAG.cpp     |    2 +-
 SelectionDAGISel.cpp |    6 +++++-
 3 files changed, 7 insertions(+), 13 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.408 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.409
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.408	Tue Oct 10 13:54:19 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp	Tue Oct 10 23:29:42 2006
@@ -534,6 +534,7 @@
   case ISD::SRCVALUE:
   case ISD::STRING:
   case ISD::CONDCODE:
+  case ISD::GLOBAL_OFFSET_TABLE:
     // Primitives must all be legal.
     assert(TLI.isOperationLegal(Node->getValueType(0), Node->getValueType(0)) &&
            "This must be legal!");
@@ -558,17 +559,6 @@
 #endif
     assert(0 && "Do not know how to legalize this operator!");
     abort();
-  case ISD::JumpTableRelocBase:
-    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
-    case TargetLowering::Custom:
-      Tmp1 = TLI.LowerOperation(Op, DAG);
-      if (Tmp1.Val) Result = Tmp1;
-      break;
-    default:
-      Result = LegalizeOp(Node->getOperand(0));
-      break;
-    }
-    break;
   case ISD::GlobalAddress:
   case ISD::ExternalSymbol:
   case ISD::ConstantPool:


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.346 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.347
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.346	Tue Oct 10 20:47:58 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Tue Oct 10 23:29:42 2006
@@ -2454,7 +2454,7 @@
   case ISD::GlobalAddress: return "GlobalAddress";
   case ISD::FrameIndex:    return "FrameIndex";
   case ISD::JumpTable:     return "JumpTable";
-  case ISD::JumpTableRelocBase: return "JumpTableRelocBase";
+  case ISD::GLOBAL_OFFSET_TABLE: return "GLOBAL_OFFSET_TABLE";
   case ISD::ConstantPool:  return "ConstantPool";
   case ISD::ExternalSymbol: return "ExternalSymbol";
   case ISD::INTRINSIC_WO_CHAIN: {


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.286 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.287
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.286	Tue Oct 10 22:58:02 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Tue Oct 10 23:29:42 2006
@@ -864,7 +864,11 @@
     // For Pic, the sequence is:
     // BRIND(load(Jumptable + index) + RelocBase)
     // RelocBase is the JumpTable on PPC and X86, GOT on Alpha
-    SDOperand Reloc = DAG.getNode(ISD::JumpTableRelocBase, PTy, TAB);
+    SDOperand Reloc;
+    if (TLI.usesGlobalOffsetTable())
+      Reloc = DAG.getNode(ISD::GLOBAL_OFFSET_TABLE, PTy);
+    else
+      Reloc = TAB;
     ADD = DAG.getNode(ISD::ADD, PTy,
         ((PTy != MVT::i32) ? DAG.getNode(ISD::SIGN_EXTEND, PTy, LD) : LD), Reloc);
     DAG.setRoot(DAG.getNode(ISD::BRIND, MVT::Other, LD.getValue(1), ADD));





From sabre at nondot.org  Wed Oct 11 00:10:33 2006
From: sabre at nondot.org (Chris Lattner)
Date: Wed, 11 Oct 2006 00:10:33 -0500
Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/zapnot4.ll
Message-ID: <200610110510.k9B5AX8B002208@zion.cs.uiuc.edu>



Changes in directory llvm/test/Regression/CodeGen/Alpha:

zapnot4.ll added (r1.1)
---
Log message:

new testcase, this should turn into zap


---
Diffs of the changes:  (+8 -0)

 zapnot4.ll |    8 ++++++++
 1 files changed, 8 insertions(+)


Index: llvm/test/Regression/CodeGen/Alpha/zapnot4.ll
diff -c /dev/null llvm/test/Regression/CodeGen/Alpha/zapnot4.ll:1.1
*** /dev/null	Wed Oct 11 00:10:29 2006
--- llvm/test/Regression/CodeGen/Alpha/zapnot4.ll	Wed Oct 11 00:10:19 2006
***************
*** 0 ****
--- 1,8 ----
+ ; RUN: llvm-as < %s | llc -march=alpha | grep zapnot
+ 
+ ulong %foo(ulong %y) {
+         %tmp = shl ulong %y, ubyte 3            ;  [#uses=1]
+         %tmp2 = and ulong %tmp, 65535            ;  [#uses=1]
+         ret ulong %tmp2
+ }
+ 





From sabre at nondot.org  Wed Oct 11 00:14:10 2006
From: sabre at nondot.org (Chris Lattner)
Date: Wed, 11 Oct 2006 00:14:10 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
	AlphaInstrInfo.td
Message-ID: <200610110514.k9B5EAWs002296@zion.cs.uiuc.edu>



Changes in directory llvm/lib/Target/Alpha:

AlphaISelDAGToDAG.cpp updated: 1.56 -> 1.57
AlphaInstrInfo.td updated: 1.127 -> 1.128
---
Log message:

Use cute tblgen tricks to make zap handling more powerful.  Specifically,
when the dag combiner simplifies an and mask, notice this and allow those bits
to be missing from the zap mask.

This compiles Alpha/zapnot4.ll into:

        sll $16,3,$0
        zapnot $0,3,$0
        ret $31,($26),1

instead of:

        ldah $0,1($31)
        lda $0,-8($0)
        sll $16,3,$1
        and $1,$0,$0
        ret $31,($26),1

It would be *really* nice to replace the hunk of code in the 
AlphaISelDAGToDAG.cpp file that matches (and (srl (x, C), c2) into
(SRL (ZAPNOTi)) with a similar pattern, but I've spent enough time poking
at alpha.  Make andrew will do this.



---
Diffs of the changes:  (+70 -21)

 AlphaISelDAGToDAG.cpp |   65 ++++++++++++++++++++++++++++++++++++++++----------
 AlphaInstrInfo.td     |   26 +++++++++++++-------
 2 files changed, 70 insertions(+), 21 deletions(-)


Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.56 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.57
--- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.56	Tue Oct 10 23:29:42 2006
+++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp	Wed Oct 11 00:13:56 2006
@@ -59,19 +59,57 @@
       return x - get_ldah16(x) * IMM_MULT;
     }
 
+    /// get_zapImm - Return a zap mask if X is a valid immediate for a zapnot
+    /// instruction (if not, return 0).  Note that this code accepts partial
+    /// zap masks.  For example (and LHS, 1) is a valid zap, as long we know
+    /// that the bits 1-7 of LHS are already zero.  If LHS is non-null, we are
+    /// in checking mode.  If LHS is null, we assume that the mask has already
+    /// been validated before.
+    uint64_t get_zapImm(SDOperand LHS, uint64_t Constant) {
+      uint64_t BitsToCheck = 0;
+      unsigned Result = 0;
+      for (unsigned i = 0; i != 8; ++i) {
+        if (((Constant >> 8*i) & 0xFF) == 0) {
+          // nothing to do.
+        } else {
+          Result |= 1 << i;
+          if (((Constant >> 8*i) & 0xFF) == 0xFF) {
+            // If the entire byte is set, zapnot the byte.
+          } else if (LHS.Val == 0) {
+            // Otherwise, if the mask was previously validated, we know its okay
+            // to zapnot this entire byte even though all the bits aren't set.
+          } else {
+            // Otherwise we don't know that the it's okay to zapnot this entire
+            // byte.  Only do this iff we can prove that the missing bits are
+            // already null, so the bytezap doesn't need to really null them.
+            BitsToCheck |= ~Constant & (0xFF << 8*i);
+          }
+        }
+      }
+      
+      // If there are missing bits in a byte (for example, X & 0xEF00), check to
+      // see if the missing bits (0x1000) are already known zero if not, the zap
+      // isn't okay to do, as it won't clear all the required bits.
+      if (BitsToCheck &&
+          !getTargetLowering().MaskedValueIsZero(LHS, BitsToCheck))
+        return 0;
+      
+      return Result;
+    }
+    
     static uint64_t get_zapImm(uint64_t x) {
-      unsigned int build = 0;
-      for(int i = 0; i < 8; ++i)
-	{
-	  if ((x & 0x00FF) == 0x00FF)
-	    build |= 1 << i;
-	  else if ((x & 0x00FF) != 0)
-	    { build = 0; break; }
-	  x >>= 8;
-	}
+      unsigned build = 0;
+      for(int i = 0; i != 8; ++i) {
+        if ((x & 0x00FF) == 0x00FF)
+          build |= 1 << i;
+        else if ((x & 0x00FF) != 0)
+          return 0;
+        x >>= 8;
+      }
       return build;
     }
-
+      
+    
     static uint64_t getNearPower2(uint64_t x) {
       if (!x) return 0;
       unsigned at = CountLeadingZeros_64(x);
@@ -380,10 +418,11 @@
       {
 	uint64_t sval = SC->getValue();
 	uint64_t mval = MC->getValue();
-	if (get_zapImm(mval)) //the result is a zap, let the autogened stuff deal
+        // If the result is a zap, let the autogened stuff handle it.
+	if (get_zapImm(N->getOperand(0), mval))
 	  break;
-	// given mask X, and shift S, we want to see if there is any zap in the mask
-	// if we play around with the botton S bits
+	// given mask X, and shift S, we want to see if there is any zap in the
+        // mask if we play around with the botton S bits
 	uint64_t dontcare = (~0ULL) >> (64 - sval);
 	uint64_t mask = mval << sval;
 


Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td
diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.127 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.128
--- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.127	Tue Oct 10 23:12:39 2006
+++ llvm/lib/Target/Alpha/AlphaInstrInfo.td	Wed Oct 11 00:13:56 2006
@@ -59,8 +59,9 @@
 def LH16 : SDNodeXFormgetValue()));
 }]>;
-def iZAPX : SDNodeXFormgetValue()));
+def iZAPX : SDNodeXForm(N->getOperand(1));
+  return getI64Imm(get_zapImm(SDOperand(), RHS->getValue()));
 }]>;
 def nearP2X : SDNodeXFormgetValue())));
@@ -85,10 +86,15 @@
 def immSExt16int  : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
   return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
 }], SExt16>;
-def immZAP  : PatLeaf<(imm), [{ //imm is good for zapi
-  uint64_t build = get_zapImm((uint64_t)N->getValue());
-  return build != 0;
-}], iZAPX>;
+
+def zappat : PatFrag<(ops node:$LHS), (and node:$LHS, imm:$L), [{
+  if (ConstantSDNode *RHS = dyn_cast(N->getOperand(1))) {
+    uint64_t build = get_zapImm(N->getOperand(0), (uint64_t)RHS->getValue());
+    return build != 0;
+  }
+  return false;
+}]>;
+
 def immFPZ  : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
   return true;
 }]>;
@@ -386,8 +392,12 @@
 def XORi     : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
                       [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))], s_ilog>;
                       
-def ZAPNOTi  : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", 
-                      [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))], s_ishf>; 
+def ZAPNOTi  : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
+
+// Define the pattern that produces ZAPNOTi.
+def : Pat<(i64 (zappat GPRC:$RA):$imm),
+          (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
+
 
 //Comparison, int
 //So this is a waste of what this instruction can do, but it still saves something





From isanbard at gmail.com  Wed Oct 11 01:30:24 2006
From: isanbard at gmail.com (Bill Wendling)
Date: Wed, 11 Oct 2006 01:30:24 -0500
Subject: [llvm-commits] CVS: llvm/docs/CodeGenerator.html
	ProgrammersManual.html
Message-ID: <200610110630.k9B6UO4D003561@zion.cs.uiuc.edu>



Changes in directory llvm/docs:

CodeGenerator.html updated: 1.40 -> 1.41
ProgrammersManual.html updated: 1.92 -> 1.93
---
Log message:

Put code example inside of "doc_code" divisions.


---
Diffs of the changes:  (+379 -102)

 CodeGenerator.html     |   29 ++-
 ProgrammersManual.html |  451 +++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 378 insertions(+), 102 deletions(-)


Index: llvm/docs/CodeGenerator.html
diff -u llvm/docs/CodeGenerator.html:1.40 llvm/docs/CodeGenerator.html:1.41
--- llvm/docs/CodeGenerator.html:1.40	Sun Sep 17 15:25:45 2006
+++ llvm/docs/CodeGenerator.html	Wed Oct 11 01:30:10 2006
@@ -1227,7 +1227,16 @@
 
 
 
-

To Be Written

+ +

We now have the information available to perform the liver intervals analysis +and build the live intervals themselves. We start off by numbering the basic +blocks and machine instructions. We then handle the "live-in" values. These +are in physical registers, so the physical register is assumed to be killed by +the end of the basic block. Live intervals for virtual registers are computed +for some ordering of the machine instructions [1,N]. A live interval +is an interval [i,j), where 1 <= i <= j < N, for which a +variable is live.

+
@@ -1239,14 +1248,14 @@
-

The Register Allocation problem consists in mapping a -program Pv, that can use an unbounded number of -virtual registers, to a program Pp that contains a -finite (possibly small) number of physical registers. Each target -architecture has a different number of physical registers. If the -number of physical registers is not enough to accommodate all the -virtual registers, some of them will have to be mapped into -memory. These virtuals are called spilled virtuals.

+

The Register Allocation problem consists in mapping a program +Pv, that can use an unbounded number of virtual +registers, to a program Pp that contains a finite +(possibly small) number of physical registers. Each target architecture has +a different number of physical registers. If the number of physical +registers is not enough to accommodate all the virtual registers, some of +them will have to be mapped into memory. These virtuals are called +spilled virtuals.

@@ -1722,7 +1731,7 @@ Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2006/09/17 20:25:45 $ + Last modified: $Date: 2006/10/11 06:30:10 $ Index: llvm/docs/ProgrammersManual.html diff -u llvm/docs/ProgrammersManual.html:1.92 llvm/docs/ProgrammersManual.html:1.93 --- llvm/docs/ProgrammersManual.html:1.92 Mon Oct 2 07:28:07 2006 +++ llvm/docs/ProgrammersManual.html Wed Oct 11 01:30:10 2006 @@ -282,29 +282,32 @@
isa<>:
-
The isa<> operator works exactly like the Java +

The isa<> operator works exactly like the Java "instanceof" operator. It returns true or false depending on whether a reference or pointer points to an instance of the specified class. This can - be very useful for constraint checking of various sorts (example below).

+ be very useful for constraint checking of various sorts (example below).

+
cast<>:
-
The cast<> operator is a "checked cast" operation. It +

The cast<> operator is a "checked cast" operation. It converts a pointer or reference from a base class to a derived cast, causing an assertion failure if it is not really an instance of the right type. This should be used in cases where you have some information that makes you believe that something is of the right type. An example of the isa<> - and cast<> template is: - -

-  static bool isLoopInvariant(const Value *V, const Loop *L) {
-    if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
-      return true;
+  and cast<> template is:

- // Otherwise, it must be an instruction... - return !L->contains(cast<Instruction>(V)->getParent()); - } -
+
+
+static bool isLoopInvariant(const Value *V, const Loop *L) {
+  if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
+    return true;
+
+  // Otherwise, it must be an instruction...
+  return !L->contains(cast<Instruction>(V)->getParent());
+}
+
+

Note that you should not use an isa<> test followed by a cast<>, for that use the dyn_cast<> @@ -314,20 +317,22 @@

dyn_cast<>:
-
The dyn_cast<> operator is a "checking cast" operation. It - checks to see if the operand is of the specified type, and if so, returns a +

The dyn_cast<> operator is a "checking cast" operation. + It checks to see if the operand is of the specified type, and if so, returns a pointer to it (this operator does not work with references). If the operand is not of the correct type, a null pointer is returned. Thus, this works very much like the dynamic_cast<> operator in C++, and should be used in the same circumstances. Typically, the dyn_cast<> operator is used in an if statement or some other flow control - statement like this: + statement like this:

-
-     if (AllocationInst *AI = dyn_cast<AllocationInst>(Val)) {
-       ...
-     }
-  
+
+
+if (AllocationInst *AI = dyn_cast<AllocationInst>(Val)) {
+  // ...
+}
+
+

This form of the if statement effectively combines together a call to isa<> and a call to cast<> into one @@ -344,17 +349,17 @@

cast_or_null<>:
-
The cast_or_null<> operator works just like the +

The cast_or_null<> operator works just like the cast<> operator, except that it allows for a null pointer as an argument (which it then propagates). This can sometimes be useful, allowing - you to combine several null checks into one.

+ you to combine several null checks into one.

dyn_cast_or_null<>:
-
The dyn_cast_or_null<> operator works just like the +

The dyn_cast_or_null<> operator works just like the dyn_cast<> operator, except that it allows for a null pointer as an argument (which it then propagates). This can sometimes be useful, - allowing you to combine several null checks into one.

+ allowing you to combine several null checks into one.

@@ -375,7 +380,7 @@

Often when working on your pass you will put a bunch of debugging printouts and other code into your pass. After you get it working, you want to remove -it... but you may need it again in the future (to work out new bugs that you run +it, but you may need it again in the future (to work out new bugs that you run across).

Naturally, because of this, you don't want to delete the debug printouts, @@ -388,11 +393,22 @@ DEBUG macro, and it is only executed if 'opt' (or any other tool) is run with the '-debug' command line argument:

-
     ... 
DEBUG(std::cerr << "I am here!\n");
...
+
+
+DEBUG(std::cerr << "I am here!\n");
+
+

Then you can run your pass like this:

-
  $ opt < a.bc > /dev/null -mypass
<no output>
$ opt < a.bc > /dev/null -mypass -debug
I am here!
$
+
+
+$ opt < a.bc > /dev/null -mypass
+<no output>
+$ opt < a.bc > /dev/null -mypass -debug
+I am here!
+
+

Using the DEBUG() macro instead of a home-brewed solution allows you to not have to create "yet another" command line option for the debug output for @@ -422,11 +438,38 @@ control, you define the DEBUG_TYPE macro and the -debug only option as follows:

-
     ...
DEBUG(std::cerr << "No debug type\n");
#undef DEBUG_TYPE
#define DEBUG_TYPE "foo"
DEBUG(std::cerr << "'foo' debug type\n");
#undef DEBUG_TYPE
#define DEBUG_TYPE "bar"
DEBUG(std::cerr << "'bar' debug type\n");
#undef DEBUG_TYPE
#define DEBUG_TYPE ""
DEBUG(std::cerr << "No debug type (2)\n");
...
+
+
+DEBUG(std::cerr << "No debug type\n");
+#undef  DEBUG_TYPE
+#define DEBUG_TYPE "foo"
+DEBUG(std::cerr << "'foo' debug type\n");
+#undef  DEBUG_TYPE
+#define DEBUG_TYPE "bar"
+DEBUG(std::cerr << "'bar' debug type\n");
+#undef  DEBUG_TYPE
+#define DEBUG_TYPE ""
+DEBUG(std::cerr << "No debug type (2)\n");
+
+

Then you can run your pass like this:

-
  $ opt < a.bc > /dev/null -mypass
<no output>
$ opt < a.bc > /dev/null -mypass -debug
No debug type
'foo' debug type
'bar' debug type
No debug type (2)
$ opt < a.bc > /dev/null -mypass -debug-only=foo
'foo' debug type
$ opt < a.bc > /dev/null -mypass -debug-only=bar
'bar' debug type
$
+
+
+$ opt < a.bc > /dev/null -mypass
+<no output>
+$ opt < a.bc > /dev/null -mypass -debug
+No debug type
+'foo' debug type
+'bar' debug type
+No debug type (2)
+$ opt < a.bc > /dev/null -mypass -debug-only=foo
+'foo' debug type
+$ opt < a.bc > /dev/null -mypass -debug-only=bar
+'bar' debug type
+
+

Of course, in practice, you should only set DEBUG_TYPE at the top of a file, to specify the debug type for the entire module (if you do this before @@ -466,27 +509,71 @@ it are as follows:

    -
  1. Define your statistic like this: -
    static Statistic<> NumXForms("mypassname", "The # of times I did stuff");
    +
  2. Define your statistic like this:

    + +
    +
    +static Statistic<> NumXForms("mypassname", "The # of times I did stuff");
    +
    +

    The Statistic template can emulate just about any data-type, but if you do not specify a template argument, it defaults to acting like an unsigned int counter (this is usually what you want).

  3. -
  4. Whenever you make a transformation, bump the counter: -
       ++NumXForms;   // I did stuff
    +
  5. Whenever you make a transformation, bump the counter:

    + +
    +
    +++NumXForms;   // I did stuff!
    +
    +
    +

That's all you have to do. To get 'opt' to print out the statistics gathered, use the '-stats' option:

-
   $ opt -stats -mypassname < program.bc > /dev/null
... statistic output ...
+
+
+$ opt -stats -mypassname < program.bc > /dev/null
+... statistic output ...
+
+

When running gccas on a C file from the SPEC benchmark suite, it gives a report that looks like this:

-
   7646 bytecodewriter  - Number of normal instructions
725 bytecodewriter - Number of oversized instructions
129996 bytecodewriter - Number of bytecode bytes written
2817 raise - Number of insts DCEd or constprop'd
3213 raise - Number of cast-of-self removed
5046 raise - Number of expression trees converted
75 raise - Number of other getelementptr's formed
138 raise - Number of load/store peepholes
42 deadtypeelim - Number of unused typenames removed from symtab
392 funcresolve - Number of varargs functions resolved
27 globaldce - Number of global variables removed
2 adce - Number of basic blocks removed
134 cee - Number of branches revectored
49 cee - Number of setcc instruction eliminated
532 gcse - Number of loads removed
2919 gcse - Number ! of instructions removed
86 indvars - Number of canonical indvars added
87 indvars - Number of aux indvars removed
25 instcombine - Number of dead inst eliminate
434 instcombine - Number of insts combined
248 licm - Number of load insts hoisted
1298 licm - Number of insts hoisted to a loop pre-header
3 licm - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
75 mem2reg - Number of alloca's promoted
1444 cfgsimplify - Number of blocks simplified
+
+
+   7646 bytecodewriter  - Number of normal instructions
+    725 bytecodewriter  - Number of oversized instructions
+ 129996 bytecodewriter  - Number of bytecode bytes written
+   2817 raise           - Number of insts DCEd or constprop'd
+   3213 raise           - Number of cast-of-self removed
+   5046 raise           - Number of expression trees converted
+     75 raise           - Number of other getelementptr's formed
+    138 raise           - Number of load/store peepholes
+     42 deadtypeelim    - Number of unused typenames removed from symtab
+    392 funcresolve     - Number of varargs functions resolved
+     27 globaldce       - Number of global variables removed
+      2 adce            - Number of basic blocks removed
+    134 cee             - Number of branches revectored
+     49 cee             - Number of setcc instruction eliminated
+    532 gcse            - Number of loads removed
+   2919 gcse            - Number of instructions removed
+     86 indvars         - Number of canonical indvars added
+     87 indvars         - Number of aux indvars removed
+     25 instcombine     - Number of dead inst eliminate
+    434 instcombine     - Number of insts combined
+    248 licm            - Number of load insts hoisted
+   1298 licm            - Number of insts hoisted to a loop pre-header
+      3 licm            - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
+     75 mem2reg         - Number of alloca's promoted
+   1444 cfgsimplify     - Number of blocks simplified
+
+

Obviously, with so many optimizations, having a unified framework for this stuff is very nice. Making your pass fit well into the framework makes it more @@ -602,7 +689,17 @@ an example that prints the name of a BasicBlock and the number of Instructions it contains:

-
  // func is a pointer to a Function instance
for (Function::iterator i = func->begin(), e = func->end(); i != e; ++i) {

// print out the name of the basic block if it has one, and then the
// number of instructions that it contains

std::cerr << "Basic block (name=" << i->getName() << ") has "
<< i->size() << " instructions.\n";
}
+
+
+// func is a pointer to a Function instance
+for (Function::iterator i = func->begin(), e = func->end(); i != e; ++i) {
+  // print out the name of the basic block if it has one, and then the
+  // number of instructions that it contains
+  std::cerr << "Basic block (name=" << i->getName() << ") has "
+            << i->size() << " instructions.\n";
+}
+
+

Note that i can be used as if it were a pointer for the purposes of invoking member functions of the Instruction class. This is @@ -626,13 +723,15 @@ BasicBlocks. Here's a code snippet that prints out each instruction in a BasicBlock:

+
-  // blk is a pointer to a BasicBlock instance
-  for (BasicBlock::iterator i = blk->begin(), e = blk->end(); i != e; ++i)
-     // the next statement works since operator<<(ostream&,...)
-     // is overloaded for Instruction&
-     std::cerr << *i << "\n";
+// blk is a pointer to a BasicBlock instance
+for (BasicBlock::iterator i = blk->begin(), e = blk->end(); i != e; ++i)
+   // the next statement works since operator<<(ostream&,...)
+   // is overloaded for Instruction&
+   std::cerr << *i << "\n";
 
+

However, this isn't really the best way to print out the contents of a BasicBlock! Since the ostream operators are overloaded for virtually @@ -657,12 +756,27 @@ and then instantiate InstIterators explicitly in your code. Here's a small example that shows how to dump all instructions in a function to the standard error stream:

-

#include "llvm/Support/InstIterator.h"
...
// Suppose F is a ptr to a function
for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)
std::cerr << *i << "\n";
-Easy, isn't it? You can also use InstIterators to fill a +
+
+#include "llvm/Support/InstIterator.h"
+
+// Suppose F is a ptr to a function
+for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)
+  std::cerr << *i << "\n";
+
+
+ +

Easy, isn't it? You can also use InstIterators to fill a worklist with its initial contents. For example, if you wanted to initialize a worklist to contain all instructions in a Function -F, all you would need to do is something like: -

std::set<Instruction*> worklist;
worklist.insert(inst_begin(F), inst_end(F));
+F, all you would need to do is something like:

+ +
+
+std::set<Instruction*> worklist;
+worklist.insert(inst_begin(F), inst_end(F));
+
+

The STL set worklist would now contain all instructions in the Function pointed to by F.

@@ -683,7 +797,13 @@ Assuming that i is a BasicBlock::iterator and j is a BasicBlock::const_iterator:

-
    Instruction& inst = *i;   // grab reference to instruction reference
Instruction* pinst = &*i; // grab pointer to instruction reference
const Instruction& inst = *j;
+
+
+Instruction& inst = *i;   // grab reference to instruction reference
+Instruction* pinst = &*i; // grab pointer to instruction reference
+const Instruction& inst = *j;
+
+

However, the iterators you'll be working with in the LLVM framework are special: they will automatically convert to a ptr-to-instance type whenever they @@ -693,11 +813,19 @@ (behind the scenes, this is a result of overloading casting mechanisms). Thus the last line of the last example,

-
Instruction* pinst = &*i;
+
+
+Instruction* pinst = &*i;
+
+

is semantically equivalent to

-
Instruction* pinst = i;
+
+
+Instruction* pinst = i;
+
+

It's also possible to turn a class pointer into the corresponding iterator, and this is a constant time operation (very efficient). The following code @@ -705,7 +833,15 @@ iterators. By using these, you can explicitly grab the iterator of something without actually obtaining it via iteration over some structure:

-
void printNextInstruction(Instruction* inst) {
BasicBlock::iterator it(inst);
++it; // after this line, it refers to the instruction after *inst.
if (it != inst->getParent()->end()) std::cerr << *it << "\n";
}
+
+
+void printNextInstruction(Instruction* inst) {
+  BasicBlock::iterator it(inst);
+  ++it; // after this line, it refers to the instruction after *inst.
+  if (it != inst->getParent()->end()) std::cerr << *it << "\n";
+}
+
+
@@ -725,15 +861,50 @@ you'd do it if you didn't have InstVisitor around. In pseudocode, this is what we want to do:

-
initialize callCounter to zero
for each Function f in the Module
for each BasicBlock b in f
for each Instruction i in b
if (i is a CallInst and calls the given function)
increment callCounter
+
+
+initialize callCounter to zero
+for each Function f in the Module
+  for each BasicBlock b in f
+    for each Instruction i in b
+      if (i is a CallInst and calls the given function)
+        increment callCounter
+
+
-

And the actual code is (remember, since we're writing a +

And the actual code is (remember, because we're writing a FunctionPass, our FunctionPass-derived class simply has to -override the runOnFunction method...):

+override the runOnFunction method):

-
Function* targetFunc = ...;

class OurFunctionPass : public FunctionPass {
public:
OurFunctionPass(): callCounter(0) { }

virtual runOnFunction(Function& F) {
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
for (BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) {
if (CallInst* callInst = dyn_cast<CallInst>(&*i)) {
// we know we've encountered a call instruction, so we
// need to determine if it's a call to the
// function pointed to by m_func or not.

if (callInst->getCalledFunction() == targetFunc)
++callCounter;
}
}
}

private:
unsigned callCounter;
};
+
+
+Function* targetFunc = ...;
+
+class OurFunctionPass : public FunctionPass {
+  public:
+    OurFunctionPass(): callCounter(0) { }
+
+    virtual runOnFunction(Function& F) {
+      for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
+        for (BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) {
+          if (CallInst* callInst = dyn_cast<CallInst>(&*i)) {
+            // we know we've encountered a call instruction, so we
+            // need to determine if it's a call to the
+            // function pointed to by m_func or not.
+
+            if (callInst->getCalledFunction() == targetFunc)
+              ++callCounter;
+          }
+        }
+      }
+
+
+  private:
+    unsigned  callCounter;
+};
+
+
@@ -780,7 +951,18 @@ use foo is as simple as iterating over the def-use chain of F:

-
Function* F = ...;

for (Value::use_iterator i = F->use_begin(), e = F->use_end(); i != e; ++i) {
if (Instruction *Inst = dyn_cast<Instruction>(*i)) {
std::cerr << "F is used in instruction:\n";
std::cerr << *Inst << "\n";
}
}
+
+
+Function* F = ...;
+
+for (Value::use_iterator i = F->use_begin(), e = F->use_end(); i != e; ++i) {
+  if (Instruction *Inst = dyn_cast<Instruction>(*i)) {
+    std::cerr << "F is used in instruction:\n";
+    std::cerr << *Inst << "\n";
+  }
+}
+
+

Alternately, it's common to have an instance of the User Class and need to know what @@ -790,7 +972,16 @@ all of the values that a particular instruction uses (that is, the operands of the particular Instruction):

-
Instruction* pi = ...;

for (User::op_iterator i = pi->op_begin(), e = pi->op_end(); i != e; ++i) {
Value* v = *i;
...
}
+
+
+Instruction* pi = ...;
+
+for (User::op_iterator i = pi->op_begin(), e = pi->op_end(); i != e; ++i) {
+  Value* v = *i;
+  ...
+}
+
+
(X & 8) >> 3 // Perform the xform if the AND RHS is a single bit. - if ((AndRHS->getValue() & (AndRHS->getValue()-1)) == 0) { + if (isPowerOf2_64(AndRHS->getValue())) { return getNode(ISD::SRL, VT, N1, getConstant(Log2_64(AndRHS->getValue()), TLI.getShiftAmountTy())); @@ -918,7 +918,7 @@ } else if (Cond == ISD::SETEQ && C2 == AndRHS->getValue()) { // (X & 8) == 8 --> (X & 8) >> 3 // Perform the xform if C2 is a single bit. - if ((C2 & (C2-1)) == 0) { + if (isPowerOf2_64(C2)) { return getNode(ISD::SRL, VT, N1, getConstant(Log2_64(C2),TLI.getShiftAmountTy())); } From jlaskey at apple.com Fri Oct 13 18:32:42 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 13 Oct 2006 18:32:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200610132332.k9DNWglZ003172@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.219 -> 1.220 --- Log message: Reduce the workload by not adding chain users to work list. --- Diffs of the changes: (+29 -13) DAGCombiner.cpp | 42 +++++++++++++++++++++++++++++------------- 1 files changed, 29 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.219 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.220 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.219 Fri Oct 13 16:12:22 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 13 18:32:28 2006 @@ -85,7 +85,8 @@ WorkList.push_back(N); } - SDOperand CombineTo(SDNode *N, const SDOperand *To, unsigned NumTo) { + SDOperand CombineTo(SDNode *N, const SDOperand *To, unsigned NumTo, + bool AddTo = true) { assert(N->getNumValues() == NumTo && "Broken CombineTo call!"); ++NodesCombined; DEBUG(std::cerr << "\nReplacing.1 "; N->dump(); @@ -94,10 +95,12 @@ std::vector NowDead; DAG.ReplaceAllUsesWith(N, To, &NowDead); - // Push the new nodes and any users onto the worklist - for (unsigned i = 0, e = NumTo; i != e; ++i) { - AddToWorkList(To[i].Val); - AddUsersToWorkList(To[i].Val); + if (AddTo) { + // Push the new nodes and any users onto the worklist + for (unsigned i = 0, e = NumTo; i != e; ++i) { + AddToWorkList(To[i].Val); + AddUsersToWorkList(To[i].Val); + } } // Nodes can be reintroduced into the worklist. Make sure we do not @@ -111,13 +114,14 @@ return SDOperand(N, 0); } - SDOperand CombineTo(SDNode *N, SDOperand Res) { - return CombineTo(N, &Res, 1); + SDOperand CombineTo(SDNode *N, SDOperand Res, bool AddTo = true) { + return CombineTo(N, &Res, 1, AddTo); } - SDOperand CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1) { + SDOperand CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1, + bool AddTo = true) { SDOperand To[] = { Res0, Res1 }; - return CombineTo(N, To, 2); + return CombineTo(N, To, 2, AddTo); } private: @@ -602,6 +606,9 @@ // New and improved token factor. Result = DAG.getNode(ISD::TokenFactor, MVT::Other, &Ops[0], Ops.size()); } + + // Don't add users to work list. + return CombineTo(N, Result, false); } return Result; @@ -2717,8 +2724,9 @@ SDOperand Token = DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplLoad.getValue(1)); - // Replace uses with load result and token factor. - return CombineTo(N, ReplLoad.getValue(0), Token); + // Replace uses with load result and token factor. Don't add users + // to work list. + return CombineTo(N, ReplLoad.getValue(0), Token, false); } } @@ -2745,7 +2753,11 @@ ST->getSrcValueOffset(), ST->getStoredVT()); // Create token to keep both nodes around. - return DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplTStore); + SDOperand Token = + DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplTStore); + + // Don't add users to work list. + return CombineTo(N, Token, false); } } @@ -2796,7 +2808,11 @@ SDOperand ReplStore = DAG.getStore(BetterChain, Value, Ptr, ST->getSrcValue(), ST->getSrcValueOffset()); // Create token to keep both nodes around. - return DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplStore); + SDOperand Token = + DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplStore); + + // Don't add users to work list. + return CombineTo(N, Token, false); } } From sabre at nondot.org Fri Oct 13 18:54:30 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 18:54:30 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/2006-10-13-Miscompile.ll Message-ID: <200610132354.k9DNsUOI003565@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: 2006-10-13-Miscompile.ll added (r1.1) --- Log message: testcase for recent selectiondag patch --- Diffs of the changes: (+19 -0) 2006-10-13-Miscompile.ll | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/2006-10-13-Miscompile.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/2006-10-13-Miscompile.ll:1.1 *** /dev/null Fri Oct 13 18:54:26 2006 --- llvm/test/Regression/CodeGen/PowerPC/2006-10-13-Miscompile.ll Fri Oct 13 18:54:16 2006 *************** *** 0 **** --- 1,19 ---- + ; RUN: llvm-as < %s | llc -march=ppc32 && + ; RUN: llvm-as < %s | llc -march=ppc32 | not grep IMPLICIT_DEF + + void %foo(long %X) { + entry: + %tmp1 = and long %X, 3 ; [#uses=1] + %tmp = setgt long %tmp1, 2 ; [#uses=1] + br bool %tmp, label %UnifiedReturnBlock, label %cond_true + + cond_true: ; preds = %entry + %tmp = tail call int (...)* %bar( ) ; [#uses=0] + ret void + + UnifiedReturnBlock: ; preds = %entry + ret void + } + + declare int %bar(...) + From sabre at nondot.org Fri Oct 13 19:22:02 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 19:22:02 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/BranchFolding.cpp Message-ID: <200610140022.k9E0M2Xj004024@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: BranchFolding.cpp updated: 1.9 -> 1.10 --- Log message: falling off the end of a function is ok with an unreachable instruction. --- Diffs of the changes: (+57 -28) BranchFolding.cpp | 85 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 57 insertions(+), 28 deletions(-) Index: llvm/lib/CodeGen/BranchFolding.cpp diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.9 llvm/lib/CodeGen/BranchFolding.cpp:1.10 --- llvm/lib/CodeGen/BranchFolding.cpp:1.9 Fri Oct 13 15:43:10 2006 +++ llvm/lib/CodeGen/BranchFolding.cpp Fri Oct 13 19:21:48 2006 @@ -26,32 +26,30 @@ namespace { struct BranchFolder : public MachineFunctionPass { virtual bool runOnMachineFunction(MachineFunction &MF); - virtual const char *getPassName() const { return "Branch Folder"; } + virtual const char *getPassName() const { return "Control Flow Optimizer"; } + const TargetInstrInfo *TII; + bool MadeChange; private: - bool OptimizeBlock(MachineFunction::iterator MBB, - const TargetInstrInfo &TII); - - bool isUncondBranch(const MachineInstr *MI, const TargetInstrInfo &TII) { - return TII.isBarrier(MI->getOpcode()) && TII.isBranch(MI->getOpcode()); - } - bool isCondBranch(const MachineInstr *MI, const TargetInstrInfo &TII) { - return TII.isBranch(MI->getOpcode()) && !TII.isBarrier(MI->getOpcode()); - } + void OptimizeBlock(MachineFunction::iterator MBB); }; } FunctionPass *llvm::createBranchFoldingPass() { return new BranchFolder(); } bool BranchFolder::runOnMachineFunction(MachineFunction &MF) { + TII = MF.getTarget().getInstrInfo(); + if (!TII) return false; + + //MF.dump(); + bool EverMadeChange = false; - bool MadeChange = true; - const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo(); + MadeChange = true; while (MadeChange) { MadeChange = false; for (MachineFunction::iterator MBB = ++MF.begin(), E = MF.end(); MBB != E; ++MBB) - MadeChange |= OptimizeBlock(MBB, TII); - + OptimizeBlock(MBB); + // If branches were folded away somehow, do a quick scan and delete any dead // blocks. if (MadeChange) { @@ -78,13 +76,13 @@ static void ReplaceUsesOfBlockWith(MachineBasicBlock *BB, MachineBasicBlock *Old, MachineBasicBlock *New, - const TargetInstrInfo &TII) { + const TargetInstrInfo *TII) { assert(Old != New && "Cannot replace self with self!"); MachineBasicBlock::iterator I = BB->end(); while (I != BB->begin()) { --I; - if (!TII.isTerminatorInstr(I->getOpcode())) break; + if (!TII->isTerminatorInstr(I->getOpcode())) break; // Scan the operands of this machine instruction, replacing any uses of Old // with New. @@ -103,23 +101,55 @@ } } - -bool BranchFolder::OptimizeBlock(MachineFunction::iterator MBB, - const TargetInstrInfo &TII) { +/// OptimizeBlock - Analyze and optimize control flow related to the specified +/// block. This is never called on the entry block. +void BranchFolder::OptimizeBlock(MachineFunction::iterator MBB) { // If this block is empty, make everyone use its fall-through, not the block // explicitly. if (MBB->empty()) { - if (MBB->pred_empty()) return false; - MachineFunction::iterator FallThrough =next(MBB); - assert(FallThrough != MBB->getParent()->end() && - "Fell off the end of the function!"); - while (!MBB->pred_empty()) { - MachineBasicBlock *Pred = *(MBB->pred_end()-1); - ReplaceUsesOfBlockWith(Pred, MBB, FallThrough, TII); + if (MBB->pred_empty()) return; // dead block? Leave for cleanup later. + + MachineFunction::iterator FallThrough = next(MBB); + + if (FallThrough != MBB->getParent()->end()) { + while (!MBB->pred_empty()) { + MachineBasicBlock *Pred = *(MBB->pred_end()-1); + ReplaceUsesOfBlockWith(Pred, MBB, FallThrough, TII); + } + MadeChange = true; } - return true; + // TODO: CHANGE STUFF TO NOT BRANCH HERE! + return; } + // Check to see if we can simplify the terminator of the block before this + // one. +#if 0 + MachineBasicBlock *PriorTBB = 0, *PriorFBB = 0; + std::vector PriorCond; + if (!TII->AnalyzeBranch(*prior(MBB), PriorTBB, PriorFBB, PriorCond)) { + // If the previous branch is conditional and both conditions go to the same + // destination, remove the branch, replacing it with an unconditional one. + if (PriorTBB && PriorTBB == PriorFBB) { + TII->RemoveBranch(*prior(MBB)); + PriorCond.clear(); + if (PriorTBB != &*MBB) + TII->InsertBranch(*prior(MBB), PriorTBB, 0, PriorCond); + MadeChange = true; + return OptimizeBlock(MBB); + } + + // If the previous branch *only* branches to *this* block (conditional or + // not) remove the branch. + if (PriorTBB == &*MBB && PriorFBB == 0) { + TII->RemoveBranch(*prior(MBB)); + MadeChange = true; + return OptimizeBlock(MBB); + } + } +#endif + + #if 0 if (MBB->pred_size() == 1) { @@ -235,5 +265,4 @@ } } #endif - return false; } From sabre at nondot.org Fri Oct 13 19:30:20 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 19:30:20 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/BranchFolding.cpp Message-ID: <200610140030.k9E0UKwA004181@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: BranchFolding.cpp updated: 1.10 -> 1.11 --- Log message: disable this pass for now, it's causing issues --- Diffs of the changes: (+4 -0) BranchFolding.cpp | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/CodeGen/BranchFolding.cpp diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.10 llvm/lib/CodeGen/BranchFolding.cpp:1.11 --- llvm/lib/CodeGen/BranchFolding.cpp:1.10 Fri Oct 13 19:21:48 2006 +++ llvm/lib/CodeGen/BranchFolding.cpp Fri Oct 13 19:30:06 2006 @@ -40,6 +40,10 @@ TII = MF.getTarget().getInstrInfo(); if (!TII) return false; + + // DISABLED FOR NOW. + return false; + //MF.dump(); bool EverMadeChange = false; From sabre at nondot.org Fri Oct 13 19:41:16 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 19:41:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200610140041.k9E0fGZb004484@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.136 -> 1.137 --- Log message: When SimplifySetCC was moved to the DAGCombiner, it was never removed from SelectionDAG and it has since bitrotted. Remove the copy from SelectionDAG. Next, remove the constant folding piece of DAGCombiner::SimplifySetCC into a new FoldSetCC method which can be used by getNode() and SimplifySetCC. This fixes obscure bugs. --- Diffs of the changes: (+4 -5) SelectionDAG.h | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.136 llvm/include/llvm/CodeGen/SelectionDAG.h:1.137 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.136 Fri Oct 13 16:08:54 2006 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Fri Oct 13 19:41:01 2006 @@ -449,6 +449,10 @@ void dump() const; + /// FoldSetCC - Constant fold a setcc to true or false. + SDOperand FoldSetCC(MVT::ValueType VT, SDOperand N1, + SDOperand N2, ISD::CondCode Cond); + private: void RemoveNodeFromCSEMaps(SDNode *N); SDNode *AddNonLeafNodeToCSEMaps(SDNode *N); @@ -460,11 +464,6 @@ void DeleteNodeNotInCSEMaps(SDNode *N); - /// SimplifySetCC - Try to simplify a setcc built with the specified operands - /// and cc. If unable to simplify it, return a null SDOperand. - SDOperand SimplifySetCC(MVT::ValueType VT, SDOperand N1, - SDOperand N2, ISD::CondCode Cond); - // List of non-single value types. std::list > VTList; From sabre at nondot.org Fri Oct 13 19:41:17 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 19:41:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp SelectionDAG.cpp Message-ID: <200610140041.k9E0fH3u004491@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.220 -> 1.221 SelectionDAG.cpp updated: 1.351 -> 1.352 --- Log message: When SimplifySetCC was moved to the DAGCombiner, it was never removed from SelectionDAG and it has since bitrotted. Remove the copy from SelectionDAG. Next, remove the constant folding piece of DAGCombiner::SimplifySetCC into a new FoldSetCC method which can be used by getNode() and SimplifySetCC. This fixes obscure bugs. --- Diffs of the changes: (+25 -194) DAGCombiner.cpp | 48 ++------------- SelectionDAG.cpp | 171 +++++-------------------------------------------------- 2 files changed, 25 insertions(+), 194 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.220 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.221 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.220 Fri Oct 13 18:32:28 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 13 19:41:01 2006 @@ -3586,27 +3586,7 @@ if (ConstantSDNode *N1C = dyn_cast(N1.Val)) { uint64_t C1 = N1C->getValue(); if (ConstantSDNode *N0C = dyn_cast(N0.Val)) { - uint64_t C0 = N0C->getValue(); - - // Sign extend the operands if required - if (ISD::isSignedIntSetCC(Cond)) { - C0 = N0C->getSignExtended(); - C1 = N1C->getSignExtended(); - } - - switch (Cond) { - default: assert(0 && "Unknown integer setcc!"); - case ISD::SETEQ: return DAG.getConstant(C0 == C1, VT); - case ISD::SETNE: return DAG.getConstant(C0 != C1, VT); - case ISD::SETULT: return DAG.getConstant(C0 < C1, VT); - case ISD::SETUGT: return DAG.getConstant(C0 > C1, VT); - case ISD::SETULE: return DAG.getConstant(C0 <= C1, VT); - case ISD::SETUGE: return DAG.getConstant(C0 >= C1, VT); - case ISD::SETLT: return DAG.getConstant((int64_t)C0 < (int64_t)C1, VT); - case ISD::SETGT: return DAG.getConstant((int64_t)C0 > (int64_t)C1, VT); - case ISD::SETLE: return DAG.getConstant((int64_t)C0 <= (int64_t)C1, VT); - case ISD::SETGE: return DAG.getConstant((int64_t)C0 >= (int64_t)C1, VT); - } + return DAG.FoldSetCC(VT, N0, N1, Cond); } else { // If the LHS is '(srl (ctlz x), 5)', the RHS is 0/1, and this is an // equality comparison, then we're just comparing whether X itself is @@ -3797,7 +3777,7 @@ dyn_cast(N0.getOperand(1))) { if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0 --> (X & 8) >> 3 // Perform the xform if the AND RHS is a single bit. - if ((AndRHS->getValue() & (AndRHS->getValue()-1)) == 0) { + if (isPowerOf2_64(AndRHS->getValue())) { return DAG.getNode(ISD::SRL, VT, N0, DAG.getConstant(Log2_64(AndRHS->getValue()), TLI.getShiftAmountTy())); @@ -3805,7 +3785,7 @@ } else if (Cond == ISD::SETEQ && C1 == AndRHS->getValue()) { // (X & 8) == 8 --> (X & 8) >> 3 // Perform the xform if C1 is a single bit. - if ((C1 & (C1-1)) == 0) { + if (isPowerOf2_64(C1)) { return DAG.getNode(ISD::SRL, VT, N0, DAG.getConstant(Log2_64(C1),TLI.getShiftAmountTy())); } @@ -3817,23 +3797,11 @@ return DAG.getSetCC(VT, N1, N0, ISD::getSetCCSwappedOperands(Cond)); } - if (ConstantFPSDNode *N0C = dyn_cast(N0.Val)) - if (ConstantFPSDNode *N1C = dyn_cast(N1.Val)) { - double C0 = N0C->getValue(), C1 = N1C->getValue(); - - switch (Cond) { - default: break; // FIXME: Implement the rest of these! - case ISD::SETEQ: return DAG.getConstant(C0 == C1, VT); - case ISD::SETNE: return DAG.getConstant(C0 != C1, VT); - case ISD::SETLT: return DAG.getConstant(C0 < C1, VT); - case ISD::SETGT: return DAG.getConstant(C0 > C1, VT); - case ISD::SETLE: return DAG.getConstant(C0 <= C1, VT); - case ISD::SETGE: return DAG.getConstant(C0 >= C1, VT); - } - } else { - // Ensure that the constant occurs on the RHS. - return DAG.getSetCC(VT, N1, N0, ISD::getSetCCSwappedOperands(Cond)); - } + if (ConstantFPSDNode *N0C = dyn_cast(N0.Val)) { + // Constant fold or commute setcc. + SDOperand O = DAG.FoldSetCC(VT, N0, N1, Cond); + if (O.Val) return O; + } if (N0 == N1) { // We can always fold X == Y for integer setcc's. Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.351 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.352 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.351 Fri Oct 13 17:46:18 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Oct 13 19:41:01 2006 @@ -736,8 +736,8 @@ return SDOperand(N, 0); } -SDOperand SelectionDAG::SimplifySetCC(MVT::ValueType VT, SDOperand N1, - SDOperand N2, ISD::CondCode Cond) { +SDOperand SelectionDAG::FoldSetCC(MVT::ValueType VT, SDOperand N1, + SDOperand N2, ISD::CondCode Cond) { // These setcc operations always fold. switch (Cond) { default: break; @@ -759,18 +759,18 @@ assert(!MVT::isInteger(N1.getValueType()) && "Illegal setcc for integer!"); break; } - + if (ConstantSDNode *N2C = dyn_cast(N2.Val)) { uint64_t C2 = N2C->getValue(); if (ConstantSDNode *N1C = dyn_cast(N1.Val)) { uint64_t C1 = N1C->getValue(); - + // Sign extend the operands if required if (ISD::isSignedIntSetCC(Cond)) { C1 = N1C->getSignExtended(); C2 = N2C->getSignExtended(); } - + switch (Cond) { default: assert(0 && "Unknown integer setcc!"); case ISD::SETEQ: return getConstant(C1 == C2, VT); @@ -784,156 +784,12 @@ case ISD::SETLE: return getConstant((int64_t)C1 <= (int64_t)C2, VT); case ISD::SETGE: return getConstant((int64_t)C1 >= (int64_t)C2, VT); } - } else { - // If the LHS is a ZERO_EXTEND, perform the comparison on the input. - if (N1.getOpcode() == ISD::ZERO_EXTEND) { - unsigned InSize = MVT::getSizeInBits(N1.getOperand(0).getValueType()); - - // If the comparison constant has bits in the upper part, the - // zero-extended value could never match. - if (C2 & (~0ULL << InSize)) { - unsigned VSize = MVT::getSizeInBits(N1.getValueType()); - switch (Cond) { - case ISD::SETUGT: - case ISD::SETUGE: - case ISD::SETEQ: return getConstant(0, VT); - case ISD::SETULT: - case ISD::SETULE: - case ISD::SETNE: return getConstant(1, VT); - case ISD::SETGT: - case ISD::SETGE: - // True if the sign bit of C2 is set. - return getConstant((C2 & (1ULL << VSize)) != 0, VT); - case ISD::SETLT: - case ISD::SETLE: - // True if the sign bit of C2 isn't set. - return getConstant((C2 & (1ULL << VSize)) == 0, VT); - default: - break; - } - } - - // Otherwise, we can perform the comparison with the low bits. - switch (Cond) { - case ISD::SETEQ: - case ISD::SETNE: - case ISD::SETUGT: - case ISD::SETUGE: - case ISD::SETULT: - case ISD::SETULE: - return getSetCC(VT, N1.getOperand(0), - getConstant(C2, N1.getOperand(0).getValueType()), - Cond); - default: - break; // todo, be more careful with signed comparisons - } - } else if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG && - (Cond == ISD::SETEQ || Cond == ISD::SETNE)) { - MVT::ValueType ExtSrcTy = cast(N1.getOperand(1))->getVT(); - unsigned ExtSrcTyBits = MVT::getSizeInBits(ExtSrcTy); - MVT::ValueType ExtDstTy = N1.getValueType(); - unsigned ExtDstTyBits = MVT::getSizeInBits(ExtDstTy); - - // If the extended part has any inconsistent bits, it cannot ever - // compare equal. In other words, they have to be all ones or all - // zeros. - uint64_t ExtBits = - (~0ULL >> (64-ExtSrcTyBits)) & (~0ULL << (ExtDstTyBits-1)); - if ((C2 & ExtBits) != 0 && (C2 & ExtBits) != ExtBits) - return getConstant(Cond == ISD::SETNE, VT); - - // Otherwise, make this a use of a zext. - return getSetCC(VT, getZeroExtendInReg(N1.getOperand(0), ExtSrcTy), - getConstant(C2 & (~0ULL>>(64-ExtSrcTyBits)), ExtDstTy), - Cond); - } - - uint64_t MinVal, MaxVal; - unsigned OperandBitSize = MVT::getSizeInBits(N2C->getValueType(0)); - if (ISD::isSignedIntSetCC(Cond)) { - MinVal = 1ULL << (OperandBitSize-1); - if (OperandBitSize != 1) // Avoid X >> 64, which is undefined. - MaxVal = ~0ULL >> (65-OperandBitSize); - else - MaxVal = 0; - } else { - MinVal = 0; - MaxVal = ~0ULL >> (64-OperandBitSize); - } - - // Canonicalize GE/LE comparisons to use GT/LT comparisons. - if (Cond == ISD::SETGE || Cond == ISD::SETUGE) { - if (C2 == MinVal) return getConstant(1, VT); // X >= MIN --> true - --C2; // X >= C1 --> X > (C1-1) - return getSetCC(VT, N1, getConstant(C2, N2.getValueType()), - (Cond == ISD::SETGE) ? ISD::SETGT : ISD::SETUGT); - } - - if (Cond == ISD::SETLE || Cond == ISD::SETULE) { - if (C2 == MaxVal) return getConstant(1, VT); // X <= MAX --> true - ++C2; // X <= C1 --> X < (C1+1) - return getSetCC(VT, N1, getConstant(C2, N2.getValueType()), - (Cond == ISD::SETLE) ? ISD::SETLT : ISD::SETULT); - } - - if ((Cond == ISD::SETLT || Cond == ISD::SETULT) && C2 == MinVal) - return getConstant(0, VT); // X < MIN --> false - - // Canonicalize setgt X, Min --> setne X, Min - if ((Cond == ISD::SETGT || Cond == ISD::SETUGT) && C2 == MinVal) - return getSetCC(VT, N1, N2, ISD::SETNE); - - // If we have setult X, 1, turn it into seteq X, 0 - if ((Cond == ISD::SETLT || Cond == ISD::SETULT) && C2 == MinVal+1) - return getSetCC(VT, N1, getConstant(MinVal, N1.getValueType()), - ISD::SETEQ); - // If we have setugt X, Max-1, turn it into seteq X, Max - else if ((Cond == ISD::SETGT || Cond == ISD::SETUGT) && C2 == MaxVal-1) - return getSetCC(VT, N1, getConstant(MaxVal, N1.getValueType()), - ISD::SETEQ); - - // If we have "setcc X, C1", check to see if we can shrink the immediate - // by changing cc. - - // SETUGT X, SINTMAX -> SETLT X, 0 - if (Cond == ISD::SETUGT && OperandBitSize != 1 && - C2 == (~0ULL >> (65-OperandBitSize))) - return getSetCC(VT, N1, getConstant(0, N2.getValueType()), ISD::SETLT); - - // FIXME: Implement the rest of these. - - - // Fold bit comparisons when we can. - if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && - VT == N1.getValueType() && N1.getOpcode() == ISD::AND) - if (ConstantSDNode *AndRHS = - dyn_cast(N1.getOperand(1))) { - if (Cond == ISD::SETNE && C2 == 0) {// (X & 8) != 0 --> (X & 8) >> 3 - // Perform the xform if the AND RHS is a single bit. - if (isPowerOf2_64(AndRHS->getValue())) { - return getNode(ISD::SRL, VT, N1, - getConstant(Log2_64(AndRHS->getValue()), - TLI.getShiftAmountTy())); - } - } else if (Cond == ISD::SETEQ && C2 == AndRHS->getValue()) { - // (X & 8) == 8 --> (X & 8) >> 3 - // Perform the xform if C2 is a single bit. - if (isPowerOf2_64(C2)) { - return getNode(ISD::SRL, VT, N1, - getConstant(Log2_64(C2),TLI.getShiftAmountTy())); - } - } - } } - } else if (isa(N1.Val)) { - // Ensure that the constant occurs on the RHS. - return getSetCC(VT, N2, N1, ISD::getSetCCSwappedOperands(Cond)); } - if (ConstantFPSDNode *N1C = dyn_cast(N1.Val)) if (ConstantFPSDNode *N2C = dyn_cast(N2.Val)) { double C1 = N1C->getValue(), C2 = N2C->getValue(); - + switch (Cond) { default: break; // FIXME: Implement the rest of these! case ISD::SETEQ: return getConstant(C1 == C2, VT); @@ -947,11 +803,12 @@ // Ensure that the constant occurs on the RHS. return getSetCC(VT, N2, N1, ISD::getSetCCSwappedOperands(Cond)); } - + // Could not fold it. return SDOperand(); } + /// getNode - Gets or creates the specified node. /// SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT) { @@ -1369,8 +1226,14 @@ } } - // Finally, fold operations that do not require constants. + // Fold operations. switch (Opcode) { + case ISD::AND: + // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's + // worth handling here. + if (N2C && N2C->getValue() == 0) + return N2; + break; case ISD::FP_ROUND_INREG: if (cast(N2)->getVT() == VT) return N1; // Not actually rounding. break; @@ -1445,8 +1308,8 @@ //ConstantSDNode *N3C = dyn_cast(N3.Val); switch (Opcode) { case ISD::SETCC: { - // Use SimplifySetCC to simplify SETCC's. - SDOperand Simp = SimplifySetCC(VT, N1, N2, cast(N3)->get()); + // Use FoldSetCC to simplify SETCC's. + SDOperand Simp = FoldSetCC(VT, N1, N2, cast(N3)->get()); if (Simp.Val) return Simp; break; } From sabre at nondot.org Fri Oct 13 20:02:44 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 20:02:44 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200610140102.k9E12iq8004853@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.221 -> 1.222 --- Log message: fold setcc of a setcc. --- Diffs of the changes: (+40 -24) DAGCombiner.cpp | 64 +++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 40 insertions(+), 24 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.221 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.222 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.221 Fri Oct 13 19:41:01 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 13 20:02:29 2006 @@ -3685,30 +3685,46 @@ ExtDstTy), Cond); } else if ((N1C->getValue() == 0 || N1C->getValue() == 1) && - (Cond == ISD::SETEQ || Cond == ISD::SETNE) && - (N0.getOpcode() == ISD::XOR || - (N0.getOpcode() == ISD::AND && - N0.getOperand(0).getOpcode() == ISD::XOR && - N0.getOperand(1) == N0.getOperand(0).getOperand(1))) && - isa(N0.getOperand(1)) && - cast(N0.getOperand(1))->getValue() == 1) { - // If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We can - // only do this if the top bits are known zero. - if (TLI.MaskedValueIsZero(N1, - MVT::getIntVTBitMask(N0.getValueType())-1)) { - // Okay, get the un-inverted input value. - SDOperand Val; - if (N0.getOpcode() == ISD::XOR) - Val = N0.getOperand(0); - else { - assert(N0.getOpcode() == ISD::AND && - N0.getOperand(0).getOpcode() == ISD::XOR); - // ((X^1)&1)^1 -> X & 1 - Val = DAG.getNode(ISD::AND, N0.getValueType(), - N0.getOperand(0).getOperand(0), N0.getOperand(1)); + (Cond == ISD::SETEQ || Cond == ISD::SETNE)) { + + // SETCC (SETCC), [0|1], [EQ|NE] -> SETCC + if (N0.getOpcode() == ISD::SETCC) { + bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (N1C->getValue() != 1); + if (TrueWhenTrue) + return N0; + + // Invert the condition. + ISD::CondCode CC = cast(N0.getOperand(2))->get(); + CC = ISD::getSetCCInverse(CC, + MVT::isInteger(N0.getOperand(0).getValueType())); + return DAG.getSetCC(VT, N0.getOperand(0), N0.getOperand(1), CC); + } + + if ((N0.getOpcode() == ISD::XOR || + (N0.getOpcode() == ISD::AND && + N0.getOperand(0).getOpcode() == ISD::XOR && + N0.getOperand(1) == N0.getOperand(0).getOperand(1))) && + isa(N0.getOperand(1)) && + cast(N0.getOperand(1))->getValue() == 1) { + // If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We + // can only do this if the top bits are known zero. + if (TLI.MaskedValueIsZero(N1, + MVT::getIntVTBitMask(N0.getValueType())-1)){ + // Okay, get the un-inverted input value. + SDOperand Val; + if (N0.getOpcode() == ISD::XOR) + Val = N0.getOperand(0); + else { + assert(N0.getOpcode() == ISD::AND && + N0.getOperand(0).getOpcode() == ISD::XOR); + // ((X^1)&1)^1 -> X & 1 + Val = DAG.getNode(ISD::AND, N0.getValueType(), + N0.getOperand(0).getOperand(0), + N0.getOperand(1)); + } + return DAG.getSetCC(VT, Val, N1, + Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ); } - return DAG.getSetCC(VT, Val, N1, - Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ); } } @@ -3804,7 +3820,7 @@ } if (N0 == N1) { - // We can always fold X == Y for integer setcc's. + // We can always fold X == X for integer setcc's. if (MVT::isInteger(N0.getValueType())) return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT); unsigned UOF = ISD::getUnorderedFlavor(Cond); From sabre at nondot.org Fri Oct 13 22:40:16 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 22:40:16 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/cmp-cmp.ll Message-ID: <200610140340.k9E3eGK1007529@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: cmp-cmp.ll added (r1.1) --- Log message: testcase for recent dag combiner patch. Before the entry bb was: _test: stwu r1, -80(r1) stw r1, 76(r1) mflr r11 stw r11, 88(r1) rlwinm r2, r4, 0, 30, 31 cmplwi cr7, r2, 2 mfcr r2 rlwinm r2, r2, 30, 31, 31 cmplwi cr0, r2, 0 bne cr0, LBB1_2 ;UnifiedReturnBlock after it is: _test: stwu r1, -80(r1) stw r1, 76(r1) mflr r11 stw r11, 88(r1) rlwinm r2, r4, 0, 30, 31 cmplwi cr0, r2, 2 bgt cr0, LBB1_2 ;UnifiedReturnBlock --- Diffs of the changes: (+16 -0) cmp-cmp.ll | 16 ++++++++++++++++ 1 files changed, 16 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/cmp-cmp.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/cmp-cmp.ll:1.1 *** /dev/null Fri Oct 13 22:40:12 2006 --- llvm/test/Regression/CodeGen/PowerPC/cmp-cmp.ll Fri Oct 13 22:40:02 2006 *************** *** 0 **** --- 1,16 ---- + ; RUN: llvm-as < %s | llc -march=ppc32 && + ; RUN: llvm-as < %s | llc -march=ppc32 | not grep mfcr + + void %test(long %X) { + %tmp1 = and long %X, 3 ; [#uses=1] + %tmp = setgt long %tmp1, 2 ; [#uses=1] + br bool %tmp, label %UnifiedReturnBlock, label %cond_true + + cond_true: ; preds = %entry + tail call void %test(long 0) + ret void + + UnifiedReturnBlock: ; preds = %entry + ret void + } + From sabre at nondot.org Fri Oct 13 22:53:00 2006 From: sabre at nondot.org (Chris Lattner) Date: Fri, 13 Oct 2006 22:53:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200610140353.k9E3r0WQ007808@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.222 -> 1.223 --- Log message: Make sure that the node returned by SimplifySetCC is added to the worklist so that it can be deleted if unused. --- Diffs of the changes: (+5 -0) DAGCombiner.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.222 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.223 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.222 Fri Oct 13 20:02:29 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 13 22:52:46 2006 @@ -1845,6 +1845,7 @@ // Determine if the condition we're dealing with is constant SDOperand SCC = SimplifySetCC(TLI.getSetCCResultTy(), N0, N1, CC, false); + if (SCC.Val) AddToWorkList(SCC.Val); if (ConstantSDNode *SCCC = dyn_cast_or_null(SCC.Val)) { if (SCCC->getValue()) @@ -2660,6 +2661,8 @@ // Use SimplifySetCC to simplify SETCC's. SDOperand Simp = SimplifySetCC(MVT::i1, CondLHS, CondRHS, CC->get(), false); + if (Simp.Val) AddToWorkList(Simp.Val); + ConstantSDNode *SCCC = dyn_cast_or_null(Simp.Val); // fold br_cc true, dest -> br dest (unconditional branch) @@ -2669,6 +2672,7 @@ // fold br_cc false, dest -> unconditional fall through if (SCCC && SCCC->isNullValue()) return N->getOperand(0); + // fold to a simpler setcc if (Simp.Val && Simp.getOpcode() == ISD::SETCC) return DAG.getNode(ISD::BR_CC, MVT::Other, N->getOperand(0), @@ -3424,6 +3428,7 @@ // Determine if the condition we're dealing with is constant SDOperand SCC = SimplifySetCC(TLI.getSetCCResultTy(), N0, N1, CC, false); + if (SCC.Val) AddToWorkList(SCC.Val); ConstantSDNode *SCCC = dyn_cast_or_null(SCC.Val); // fold select_cc true, x, y -> x From evan.cheng at apple.com Sat Oct 14 03:30:29 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Sat, 14 Oct 2006 03:30:29 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200610140830.k9E8UT3V020595@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.270 -> 1.271 --- Log message: When checking if a load can be folded, we check if there is any non-direct way to reach the load via any nodes that would be folded. Start from the root of the matched sub-tree. --- Diffs of the changes: (+12 -10) DAGISelEmitter.cpp | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.270 llvm/utils/TableGen/DAGISelEmitter.cpp:1.271 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.270 Thu Oct 12 18:18:52 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Sat Oct 14 03:30:15 2006 @@ -2199,8 +2199,8 @@ /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo /// if the match fails. At this point, we already know that the opcode for N /// matches, and the SDNode for the result has the RootName specified name. - void EmitMatchCode(TreePatternNode *N, TreePatternNode *P, - const std::string &RootName, + void EmitMatchCode(TreePatternNode *Root, TreePatternNode *N, + TreePatternNode *P, const std::string &RootName, const std::string &ChainSuffix, bool &FoundChain) { bool isRoot = (P == NULL); // Emit instruction predicates. Each predicate is just a string for now. @@ -2284,13 +2284,14 @@ // | ^ // [XX]-------| const SDNodeInfo &PInfo = ISE.getSDNodeInfo(P->getOperator()); - if (PInfo.getNumOperands() > 1 || + if (P != Root || + PInfo.getNumOperands() > 1 || PInfo.hasProperty(SDNPHasChain) || PInfo.hasProperty(SDNPInFlag) || PInfo.hasProperty(SDNPOptInFlag)) { std::string ParentName(RootName.begin(), RootName.end()-1); emitCheck("CanBeFoldedBy(" + RootName + ".Val, " + ParentName + - ".Val)"); + ".Val, N.Val)"); } } } @@ -2358,7 +2359,7 @@ emitCheck(MaskPredicate + RootName + "0, cast(" + RootName + "1), " + itostr(II->getValue()) + ")"); - EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0), + EmitChildMatchCode(Root, N->getChild(0), N, RootName + utostr(0), ChainSuffix + utostr(0), FoundChain); return; } @@ -2369,7 +2370,7 @@ emitInit("SDOperand " + RootName + utostr(OpNo) + " = " + RootName + ".getOperand(" +utostr(OpNo) + ");"); - EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo), + EmitChildMatchCode(Root, N->getChild(i), N, RootName + utostr(OpNo), ChainSuffix + utostr(OpNo), FoundChain); } @@ -2400,15 +2401,15 @@ } } - void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent, - const std::string &RootName, + void EmitChildMatchCode(TreePatternNode *Root, TreePatternNode *Child, + TreePatternNode *Parent, const std::string &RootName, const std::string &ChainSuffix, bool &FoundChain) { if (!Child->isLeaf()) { // If it's not a leaf, recursively match. const SDNodeInfo &CInfo = ISE.getSDNodeInfo(Child->getOperator()); emitCheck(RootName + ".getOpcode() == " + CInfo.getEnumName()); - EmitMatchCode(Child, Parent, RootName, ChainSuffix, FoundChain); + EmitMatchCode(Root, Child, Parent, RootName, ChainSuffix, FoundChain); if (NodeHasProperty(Child, SDNPHasChain, ISE)) FoldedChains.push_back(std::make_pair(RootName, CInfo.getNumResults())); } else { @@ -3098,7 +3099,8 @@ // Emit the matcher, capturing named arguments in VariableMap. bool FoundChain = false; - Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", FoundChain); + Emitter.EmitMatchCode(Pattern.getSrcPattern(), Pattern.getSrcPattern(), NULL, + "N", "", FoundChain); // TP - Get *SOME* tree pattern, we don't care which. TreePattern &TP = *PatternFragments.begin()->second; From evan.cheng at apple.com Sat Oct 14 03:31:07 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Sat, 14 Oct 2006 03:31:07 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGISel.h Message-ID: <200610140831.k9E8V7X4020621@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAGISel.h updated: 1.26 -> 1.27 --- Log message: Start checking from the root of the matched sub-tree. --- Diffs of the changes: (+2 -2) SelectionDAGISel.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.26 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.27 --- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.26 Tue Oct 10 22:58:02 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGISel.h Sat Oct 14 03:30:53 2006 @@ -71,8 +71,8 @@ } /// CanBeFoldedBy - Returns true if the specific operand node N of U can be - /// folded during instruction selection? - virtual bool CanBeFoldedBy(SDNode *N, SDNode *U) { return true; } + /// folded during instruction selection that starts at Root? + virtual bool CanBeFoldedBy(SDNode *N, SDNode *U, SDNode *Root) { return true;} /// CreateTargetHazardRecognizer - Return a newly allocated hazard recognizer /// to use for this target when scheduling the DAG. From evan.cheng at apple.com Sat Oct 14 03:33:40 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Sat, 14 Oct 2006 03:33:40 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200610140833.k9E8Xev6020675@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.118 -> 1.119 --- Log message: Corrected load folding check. We need to start from the root of the sub-dag being matched and ensure there isn't a non-direct path to the load (i.e. a path that goes out of the sub-dag.) --- Diffs of the changes: (+65 -52) X86ISelDAGToDAG.cpp | 117 ++++++++++++++++++++++++++++------------------------ 1 files changed, 65 insertions(+), 52 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.118 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.119 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.118 Fri Oct 13 16:14:26 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Sat Oct 14 03:33:25 2006 @@ -134,7 +134,7 @@ virtual void EmitFunctionEntryCode(Function &Fn, MachineFunction &MF); - virtual bool CanBeFoldedBy(SDNode *N, SDNode *U); + virtual bool CanBeFoldedBy(SDNode *N, SDNode *U, SDNode *Root); // Include the pieces autogenerated from the target description. #include "X86GenDAGISel.inc" @@ -227,52 +227,54 @@ return NULL; } -static void findNonImmUse(SDNode* Use, SDNode* Def, SDNode *Ignore, bool &found, +static void findNonImmUse(SDNode *Use, SDNode* Def, SDNode *ImmedUse, + SDNode *Root, SDNode *Skip, bool &found, std::set &Visited) { if (found || Use->getNodeId() > Def->getNodeId() || !Visited.insert(Use).second) return; - for (unsigned i = 0, e = Use->getNumOperands(); i != e; ++i) { + for (unsigned i = 0, e = Use->getNumOperands(); !found && i != e; ++i) { SDNode *N = Use->getOperand(i).Val; - if (N == Ignore) + if (N == Skip) continue; - if (N != Def) { - findNonImmUse(N, Def, Ignore, found, Visited); - } else { + if (N == Def) { + if (Use == ImmedUse) + continue; // Immediate use is ok. + if (Use == Root) { + assert(Use->getOpcode() == ISD::STORE || + Use->getOpcode() == X86ISD::CMP); + continue; + } found = true; break; } + findNonImmUse(N, Def, ImmedUse, Root, Skip, found, Visited); } } -static inline bool isNonImmUse(SDNode* Use, SDNode* Def, SDNode *Ignore=NULL) { +/// isNonImmUse - Start searching from Root up the DAG to check is Def can +/// be reached. Return true if that's the case. However, ignore direct uses +/// by ImmedUse (which would be U in the example illustrated in +/// CanBeFoldedBy) and by Root (which can happen in the store case). +/// FIXME: to be really generic, we should allow direct use by any node +/// that is being folded. But realisticly since we only fold loads which +/// have one non-chain use, we only need to watch out for load/op/store +/// and load/op/cmp case where the root (store / cmp) may reach the load via +/// its chain operand. +static inline bool isNonImmUse(SDNode *Root, SDNode *Def, SDNode *ImmedUse, + SDNode *Skip = NULL) { std::set Visited; bool found = false; - for (unsigned i = 0, e = Use->getNumOperands(); i != e; ++i) { - SDNode *N = Use->getOperand(i).Val; - if (N != Def && N != Ignore) { - findNonImmUse(N, Def, Ignore, found, Visited); - if (found) break; - } - } - - if (!found && Ignore) { - // We must be checking for reachability between Def and a flag use. Go down - // recursively if Use also produces a flag. - MVT::ValueType VT = Use->getValueType(Use->getNumValues()-1); - if (VT == MVT::Flag && !Use->use_empty()) { - SDNode *FU = findFlagUse(Use); - if (FU) - return !isNonImmUse(FU, Def, Use); - } - } + findNonImmUse(Root, Def, ImmedUse, Root, Skip, found, Visited); return found; } -bool X86DAGToDAGISel::CanBeFoldedBy(SDNode *N, SDNode *U) { +bool X86DAGToDAGISel::CanBeFoldedBy(SDNode *N, SDNode *U, SDNode *Root) { + if (FastISel) return false; + // If U use can somehow reach N through another path then U can't fold N or // it will create a cycle. e.g. In the following diagram, U can reach N // through X. If N is folded into into U, then X is both a predecessor and @@ -285,32 +287,43 @@ // / [X] // | ^ // [U]--------| - if (!FastISel && !isNonImmUse(U, N)) { - // If U produces a flag, then it gets (even more) interesting. Since it - // would have been "glued" together with its flag use, we need to check if - // it might reach N: - // - // [ N ] - // ^ ^ - // | | - // [U] \-- - // ^ [TF] - // | | - // \ / - // [FU] - // - // If FU (flag use) indirectly reach N (the load), and U fold N (call it - // NU), then TF is a predecessor of FU and a successor of NU. But since - // NU and FU are flagged together, this effectively creates a cycle. - MVT::ValueType VT = U->getValueType(U->getNumValues()-1); - if (VT == MVT::Flag && !U->use_empty()) { - SDNode *FU = findFlagUse(U); - if (FU) - return !isNonImmUse(FU, N, U); + + if (isNonImmUse(Root, N, U)) + return false; + + // If U produces a flag, then it gets (even more) interesting. Since it + // would have been "glued" together with its flag use, we need to check if + // it might reach N: + // + // [ N ] + // ^ ^ + // | | + // [U] \-- + // ^ [TF] + // | ^ + // | | + // \ / + // [FU] + // + // If FU (flag use) indirectly reach N (the load), and U fold N (call it + // NU), then TF is a predecessor of FU and a successor of NU. But since + // NU and FU are flagged together, this effectively creates a cycle. + bool HasFlagUse = false; + MVT::ValueType VT = Root->getValueType(Root->getNumValues()-1); + while ((VT == MVT::Flag && !Root->use_empty())) { + SDNode *FU = findFlagUse(Root); + if (FU == NULL) + break; + else { + Root = FU; + HasFlagUse = true; } - return true; + VT = Root->getValueType(Root->getNumValues()-1); } - return false; + + if (HasFlagUse) + return !isNonImmUse(Root, N, Root, U); + return true; } /// MoveBelowTokenFactor - Replace TokenFactor operand with load's chain operand @@ -909,7 +922,7 @@ SDOperand &Index, SDOperand &Disp) { if (ISD::isNON_EXTLoad(N.Val) && N.hasOneUse() && - CanBeFoldedBy(N.Val, P.Val)) + CanBeFoldedBy(N.Val, P.Val, P.Val)) return SelectAddr(N.getOperand(1), Base, Scale, Index, Disp); return false; } From evan.cheng at apple.com Sat Oct 14 03:34:20 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Sat, 14 Oct 2006 03:34:20 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp ScheduleDAGRRList.cpp Message-ID: <200610140834.k9E8YKUZ020702@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.103 -> 1.104 ScheduleDAGRRList.cpp updated: 1.14 -> 1.15 --- Log message: Debug tweak. --- Diffs of the changes: (+4 -4) ScheduleDAG.cpp | 4 ++-- ScheduleDAGRRList.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.103 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.104 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.103 Tue Sep 12 16:00:35 2006 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Sat Oct 14 03:34:06 2006 @@ -656,7 +656,7 @@ std::cerr << " ch #"; else std::cerr << " val #"; - std::cerr << I->first << "\n"; + std::cerr << I->first << " - SU(" << I->first->NodeNum << ")\n"; } } if (Succs.size() != 0) { @@ -667,7 +667,7 @@ std::cerr << " ch #"; else std::cerr << " val #"; - std::cerr << I->first << "\n"; + std::cerr << I->first << " - SU(" << I->first->NodeNum << ")\n"; } } std::cerr << "\n"; Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.14 llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.15 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.14 Sun Aug 27 07:54:01 2006 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp Sat Oct 14 03:34:06 2006 @@ -90,10 +90,10 @@ // Build scheduling units. BuildSchedUnits(); - CalculateDepths(); - CalculateHeights(); DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su) SUnits[su].dumpAll(&DAG)); + CalculateDepths(); + CalculateHeights(); AvailableQueue->initNodes(SUnits); From evan.cheng at apple.com Sat Oct 14 03:35:16 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Sat, 14 Oct 2006 03:35:16 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/2006-10-13-CycleInDAG.ll Message-ID: <200610140835.k9E8ZGTr020731@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: 2006-10-13-CycleInDAG.ll added (r1.1) --- Log message: One cyclic dag a day is good for ya... --- Diffs of the changes: (+20 -0) 2006-10-13-CycleInDAG.ll | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+) Index: llvm/test/Regression/CodeGen/X86/2006-10-13-CycleInDAG.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/2006-10-13-CycleInDAG.ll:1.1 *** /dev/null Sat Oct 14 03:35:12 2006 --- llvm/test/Regression/CodeGen/X86/2006-10-13-CycleInDAG.ll Sat Oct 14 03:35:02 2006 *************** *** 0 **** --- 1,20 ---- + ; RUN: llvm-as < %s | llc -march=x86 + + %str = external global [18 x sbyte] + + void %test() { + bb.i: + %tmp.i660 = load <4 x float>* null + call void (int, ...)* %printf( int 0, sbyte* getelementptr ([18 x sbyte]* %str, int 0, uint 0), double 0.000000e+00, double 0.000000e+00, double 0.000000e+00, double 0.000000e+00 ) + %tmp152.i = load <4 x uint>* null + %tmp156.i = cast <4 x uint> %tmp152.i to <4 x int> + %tmp175.i = cast <4 x float> %tmp.i660 to <4 x int> + %tmp176.i = xor <4 x int> %tmp156.i, < int -1, int -1, int -1, int -1 > + %tmp177.i = and <4 x int> %tmp176.i, %tmp175.i + %tmp190.i = or <4 x int> %tmp177.i, zeroinitializer + %tmp191.i = cast <4 x int> %tmp190.i to <4 x float> + store <4 x float> %tmp191.i, <4 x float>* null + ret void + } + + declare void %printf(int, ...) From jlaskey at apple.com Sat Oct 14 07:14:42 2006 From: jlaskey at apple.com (Jim Laskey) Date: Sat, 14 Oct 2006 07:14:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200610141214.k9ECEgVg026490@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.223 -> 1.224 --- Log message: Tidy up after truncstore changes. --- Diffs of the changes: (+9 -46) DAGCombiner.cpp | 55 +++++++++---------------------------------------------- 1 files changed, 9 insertions(+), 46 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.223 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.224 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.223 Fri Oct 13 22:52:46 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sat Oct 14 07:14:27 2006 @@ -2743,50 +2743,6 @@ SDOperand Value = ST->getValue(); SDOperand Ptr = ST->getBasePtr(); - // FIXME - Switch over after StoreSDNode comes online. - if (ST->isTruncatingStore()) { - if (CombinerAA) { - // Walk up chain skipping non-aliasing memory nodes. - SDOperand BetterChain = FindBetterChain(N, Chain); - - // If there is a better chain. - if (Chain != BetterChain) { - // Replace the chain to avoid dependency. - SDOperand ReplTStore = - DAG.getTruncStore(BetterChain, Value, Ptr, ST->getSrcValue(), - ST->getSrcValueOffset(), ST->getStoredVT()); - - // Create token to keep both nodes around. - SDOperand Token = - DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplTStore); - - // Don't add users to work list. - return CombineTo(N, Token, false); - } - } - - return SDOperand(); - } - - // If this is a store that kills a previous store, remove the previous store. - if (ISD::isNON_TRUNCStore(Chain.Val)) { - StoreSDNode *PrevST = cast(Chain); - if (PrevST->getBasePtr() == Ptr && - Chain.Val->hasOneUse() /* Avoid introducing DAG cycles */ && - // Make sure that these stores are the same value type: - // FIXME: we really care that the second store is >= size of the first. - Value.getValueType() == PrevST->getValue().getValueType()) { - // Create a new store of Value that replaces both stores. - if (PrevST->getValue() == Value) // Same value multiply stored. - return Chain; - SDOperand NewStore = DAG.getStore(PrevST->getChain(), Value, Ptr, - ST->getSrcValue(), ST->getSrcValueOffset()); - CombineTo(N, NewStore); // Nuke this store. - CombineTo(Chain.Val, NewStore); // Nuke the previous store. - return SDOperand(N, 0); - } - } - // If this is a store of a bit convert, store the input value. // FIXME: This needs to know that the resultant store does not need a // higher alignment than the original. @@ -2809,8 +2765,15 @@ // If there is a better chain. if (Chain != BetterChain) { // Replace the chain to avoid dependency. - SDOperand ReplStore = DAG.getStore(BetterChain, Value, Ptr, - ST->getSrcValue(), ST->getSrcValueOffset()); + SDOperand ReplStore; + if (ST->isTruncatingStore()) { + ReplStore = DAG.getTruncStore(BetterChain, Value, Ptr, + ST->getSrcValue(),ST->getSrcValueOffset(), ST->getStoredVT()); + } else { + ReplStore = DAG.getStore(BetterChain, Value, Ptr, + ST->getSrcValue(), ST->getSrcValueOffset()); + } + // Create token to keep both nodes around. SDOperand Token = DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplStore); From rafael.espindola at gmail.com Sat Oct 14 08:43:11 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Sat, 14 Oct 2006 08:43:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp ARMInstrInfo.td Message-ID: <200610141343.k9EDhBef028030@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.68 -> 1.69 ARMInstrInfo.td updated: 1.48 -> 1.49 --- Log message: fix some fp condition codes use non trapping comparison instructions --- Diffs of the changes: (+28 -41) ARMISelDAGToDAG.cpp | 60 ++++++++++++++++++++++++---------------------------- ARMInstrInfo.td | 9 ------- 2 files changed, 28 insertions(+), 41 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.68 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.69 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.68 Fri Oct 13 16:14:26 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Sat Oct 14 08:42:53 2006 @@ -92,7 +92,6 @@ RET_FLAG, CMP, - CMPE, SELECT, @@ -120,36 +119,42 @@ } /// DAGFPCCToARMCC - Convert a DAG fp condition code to an ARM CC +// Unordered = !N & !Z & C & V = V +// Ordered = N | Z | !C | !V = N | Z | !V static ARMCC::CondCodes DAGFPCCToARMCC(ISD::CondCode CC) { switch (CC) { default: assert(0 && "Unknown fp condition code!"); -// For the following conditions we use a comparison that throws exceptions, -// so we may assume that V=0 +// SETOEQ = (N | Z | !V) & Z = Z = EQ + case ISD::SETEQ: case ISD::SETOEQ: return ARMCC::EQ; +// SETOGT = (N | Z | !V) & !N & !Z = !V &!N &!Z = (N = V) & !Z = GT + case ISD::SETGT: case ISD::SETOGT: return ARMCC::GT; +// SETOGE = (N | Z | !V) & !N = (Z | !V) & !N = !V & !N = GE + case ISD::SETGE: case ISD::SETOGE: return ARMCC::GE; - case ISD::SETOLT: return ARMCC::LT; - case ISD::SETOLE: return ARMCC::LE; +// SETOLT = (N | Z | !V) & N = N = MI + case ISD::SETLT: + case ISD::SETOLT: return ARMCC::MI; +// SETOLE = (N | Z | !V) & (N | Z) = N | Z = !C | Z = LS + case ISD::SETLE: + case ISD::SETOLE: return ARMCC::LS; +// SETONE = (N | Z | !V) & !Z = (N | !V) & Z = !V & Z = Z = NE + case ISD::SETNE: case ISD::SETONE: return ARMCC::NE; -// For the following conditions the result is undefined in case of a nan, -// so we may assume that V=0 - case ISD::SETEQ: return ARMCC::EQ; - case ISD::SETGT: return ARMCC::GT; - case ISD::SETGE: return ARMCC::GE; - case ISD::SETLT: return ARMCC::LT; - case ISD::SETLE: return ARMCC::LE; - case ISD::SETNE: return ARMCC::NE; -// For the following we may not assume anything -// SETO = N | Z | !C | !V = ??? -// SETUO = (!N & !Z & C & V) = ??? -// SETUEQ = (!N & !Z & C & V) | Z = ??? -// SETUGT = (!N & !Z & C & V) | (!Z & !N) = ??? -// SETUGE = (!N & !Z & C & V) | !N = !N = PL +// SETO = N | Z | !V = Z | !V = !V = VC + case ISD::SETO: return ARMCC::VC; +// SETUO = V = VS + case ISD::SETUO: return ARMCC::VS; +// SETUEQ = V | Z = ?? +// SETUGT = V | (!Z & !N) = !Z & !N = !Z & C = HI + case ISD::SETUGT: return ARMCC::HI; +// SETUGE = V | !N = !N = PL case ISD::SETUGE: return ARMCC::PL; -// SETULT = (!N & !Z & C & V) | N = ??? -// SETULE = (!N & !Z & C & V) | Z | N = ??? -// SETUNE = (!N & !Z & C & V) | !Z = !Z = NE +// SETULT = V | N = ?? +// SETULE = V | Z | N = ?? +// SETUNE = V | !Z = !Z = NE case ISD::SETUNE: return ARMCC::NE; } } @@ -179,7 +184,6 @@ case ARMISD::RET_FLAG: return "ARMISD::RET_FLAG"; case ARMISD::SELECT: return "ARMISD::SELECT"; case ARMISD::CMP: return "ARMISD::CMP"; - case ARMISD::CMPE: return "ARMISD::CMPE"; case ARMISD::BR: return "ARMISD::BR"; case ARMISD::FSITOS: return "ARMISD::FSITOS"; case ARMISD::FTOSIS: return "ARMISD::FTOSIS"; @@ -586,15 +590,7 @@ MVT::ValueType vt = LHS.getValueType(); assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64); - bool isOrderedFloat = (vt == MVT::f32 || vt == MVT::f64) && - (CC >= ISD::SETOEQ && CC <= ISD::SETONE); - - SDOperand Cmp; - if (isOrderedFloat) { - Cmp = DAG.getNode(ARMISD::CMPE, MVT::Flag, LHS, RHS); - } else { - Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); - } + SDOperand Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); if (vt != MVT::i32) Cmp = DAG.getNode(ARMISD::FMSTAT, MVT::Flag, Cmp); Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.48 llvm/lib/Target/ARM/ARMInstrInfo.td:1.49 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.48 Fri Oct 13 12:37:35 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Sat Oct 14 08:42:53 2006 @@ -76,7 +76,6 @@ def SDTVoidBinOp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>; def armcmp : SDNode<"ARMISD::CMP", SDTVoidBinOp, [SDNPOutFlag]>; -def armcmpe : SDNode<"ARMISD::CMPE", SDTVoidBinOp, [SDNPOutFlag]>; def armfsitos : SDNode<"ARMISD::FSITOS", SDTUnaryOp>; def armftosis : SDNode<"ARMISD::FTOSIS", SDTUnaryOp>; @@ -192,14 +191,6 @@ "fcmps $a, $b", [(armcmp FPRegs:$a, FPRegs:$b)]>; -def fcmpes : InstARM<(ops FPRegs:$a, FPRegs:$b), - "fcmpes $a, $b", - [(armcmpe FPRegs:$a, FPRegs:$b)]>; - -def fcmped : InstARM<(ops DFPRegs:$a, DFPRegs:$b), - "fcmped $a, $b", - [(armcmpe DFPRegs:$a, DFPRegs:$b)]>; - def fcmpd : InstARM<(ops DFPRegs:$a, DFPRegs:$b), "fcmpd $a, $b", [(armcmp DFPRegs:$a, DFPRegs:$b)]>; From rafael.espindola at gmail.com Sat Oct 14 08:43:11 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Sat, 14 Oct 2006 08:43:11 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/fpcmp.ll Message-ID: <200610141343.k9EDhBvR028023@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: fpcmp.ll updated: 1.3 -> 1.4 --- Log message: fix some fp condition codes use non trapping comparison instructions --- Diffs of the changes: (+2 -4) fpcmp.ll | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/test/Regression/CodeGen/ARM/fpcmp.ll diff -u llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.3 llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.4 --- llvm/test/Regression/CodeGen/ARM/fpcmp.ll:1.3 Fri Oct 13 08:14:59 2006 +++ llvm/test/Regression/CodeGen/ARM/fpcmp.ll Sat Oct 14 08:42:53 2006 @@ -1,12 +1,10 @@ ; RUN: llvm-as < %s | llc -march=arm && -; RUN: llvm-as < %s | llc -march=arm | grep movlt && +; RUN: llvm-as < %s | llc -march=arm | grep movmi && ; RUN: llvm-as < %s | llc -march=arm | grep moveq && ; RUN: llvm-as < %s | llc -march=arm | grep movgt && ; RUN: llvm-as < %s | llc -march=arm | grep movge && -; RUN: llvm-as < %s | llc -march=arm | grep movle && -; RUN: llvm-as < %s | llc -march=arm | grep fcmpes && +; RUN: llvm-as < %s | llc -march=arm | grep movls && ; RUN: llvm-as < %s | llc -march=arm | grep fcmps && -; RUN: llvm-as < %s | llc -march=arm | grep fcmped && ; RUN: llvm-as < %s | llc -march=arm | grep fcmpd int %f1(float %a) { From rafael.espindola at gmail.com Sat Oct 14 13:00:08 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Sat, 14 Oct 2006 13:00:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200610141800.k9EI08fj031838@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.69 -> 1.70 --- Log message: expand ISD::BRCOND --- Diffs of the changes: (+2 -0) ARMISelDAGToDAG.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.69 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.70 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.69 Sat Oct 14 08:42:53 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Sat Oct 14 12:59:54 2006 @@ -70,6 +70,8 @@ setOperationAction(ISD::BR_CC, MVT::f32, Custom); setOperationAction(ISD::BR_CC, MVT::f64, Custom); + setOperationAction(ISD::BRCOND, MVT::Other, Expand); + setOperationAction(ISD::VASTART, MVT::Other, Custom); setOperationAction(ISD::VAEND, MVT::Other, Expand); From asl at math.spbu.ru Sat Oct 14 15:53:55 2006 From: asl at math.spbu.ru (Anton Korobeynikov) Date: Sat, 14 Oct 2006 15:53:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86AsmPrinter.cpp Message-ID: <200610142053.k9EKrtMF001980@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86AsmPrinter.cpp updated: 1.200 -> 1.201 --- Log message: Align stack size to DWORD boundary --- Diffs of the changes: (+3 -0) X86AsmPrinter.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Target/X86/X86AsmPrinter.cpp diff -u llvm/lib/Target/X86/X86AsmPrinter.cpp:1.200 llvm/lib/Target/X86/X86AsmPrinter.cpp:1.201 --- llvm/lib/Target/X86/X86AsmPrinter.cpp:1.200 Mon Sep 25 22:57:53 2006 +++ llvm/lib/Target/X86/X86AsmPrinter.cpp Sat Oct 14 15:53:35 2006 @@ -53,6 +53,9 @@ AI != AE; ++AI) Size += TD->getTypeSize(AI->getType()); + // Size should be aligned to DWORD boundary + Size = ((Size + 3)/4)*4; + // We're not supporting tooooo huge arguments :) Info.setBytesToPopOnReturn((unsigned int)Size); return Info; From reid at x10sys.com Sat Oct 14 19:11:19 2006 From: reid at x10sys.com (Reid Spencer) Date: Sat, 14 Oct 2006 19:11:19 -0500 Subject: [llvm-commits] CVS: llvm/docs/BytecodeFormat.html Message-ID: <200610150011.k9F0BJGq005026@zion.cs.uiuc.edu> Changes in directory llvm/docs: BytecodeFormat.html updated: 1.53 -> 1.54 --- Log message: Document the VAArg, and vector instruction opcodes. --- Diffs of the changes: (+13 -3) BytecodeFormat.html | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) Index: llvm/docs/BytecodeFormat.html diff -u llvm/docs/BytecodeFormat.html:1.53 llvm/docs/BytecodeFormat.html:1.54 --- llvm/docs/BytecodeFormat.html:1.53 Thu Sep 14 13:23:26 2006 +++ llvm/docs/BytecodeFormat.html Sat Oct 14 19:11:05 2006 @@ -1613,9 +1613,19 @@ Call2911.0 Shl3011.0 Shr3111.0 - VANext3211.0 - VAArg3311.0 + VANext3211.0,unused since 1.5 + VAArg3311.0,unused sine 1.5 Select3421.2 + UserOp13511.0 + UserOp23611.0 + VAArg3751.5 + ExtractElement3851.5 + InsertElement3951.5 + ShuffleElement4051.5 + Pseudo Instructions* @@ -2157,7 +2167,7 @@ Reid Spencer and Chris Lattner
The LLVM Compiler Infrastructure
-Last modified: $Date: 2006/09/14 18:23:26 $ +Last modified: $Date: 2006/10/15 00:11:05 $ From sabre at nondot.org Sun Oct 15 15:06:13 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 15:06:13 -0500 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200610152006.k9FK6Dg4027439@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.157 -> 1.158 --- Log message: clarify --- Diffs of the changes: (+6 -5) LangRef.html | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.157 llvm/docs/LangRef.html:1.158 --- llvm/docs/LangRef.html:1.157 Thu Sep 14 13:23:26 2006 +++ llvm/docs/LangRef.html Sun Oct 15 15:05:59 2006 @@ -3181,8 +3181,9 @@
Overview:

-The 'llvm.returnaddress' intrinsic returns a target-specific value -indicating the return address of the current function or one of its callers. +The 'llvm.returnaddress' intrinsic attempts to compute a +target-specific value indicating the return address of the current function +or one of its callers.

Arguments:
@@ -3225,8 +3226,8 @@
Overview:

-The 'llvm.frameaddress' intrinsic returns the target-specific frame -pointer value for the specified stack frame. +The 'llvm.frameaddress' intrinsic attempts to return the +target-specific frame pointer value for the specified stack frame.

Arguments:
@@ -3909,7 +3910,7 @@ Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2006/09/14 18:23:26 $ + Last modified: $Date: 2006/10/15 20:05:59 $ From sabre at nondot.org Sun Oct 15 17:42:30 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 17:42:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200610152242.k9FMgULS029838@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.518 -> 1.519 --- Log message: fix a buggy check that accidentally disabled this xform --- Diffs of the changes: (+1 -1) InstructionCombining.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.518 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.519 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.518 Thu Oct 5 01:55:50 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Sun Oct 15 17:42:15 2006 @@ -1973,7 +1973,7 @@ // -(X sdiv C) -> (X sdiv -C) if (Op1I->getOpcode() == Instruction::Div) if (ConstantSInt *CSI = dyn_cast(Op0)) - if (CSI->isNullValue()) + if (!CSI->isNullValue()) if (Constant *DivRHS = dyn_cast(Op1I->getOperand(1))) return BinaryOperator::createDiv(Op1I->getOperand(0), ConstantExpr::getNeg(DivRHS)); From sabre at nondot.org Sun Oct 15 18:21:27 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 18:21:27 -0500 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Type.cpp Message-ID: <200610152321.k9FNLRQn030377@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Type.cpp updated: 1.146 -> 1.147 --- Log message: label* is not a valid type, add an assertion. --- Diffs of the changes: (+1 -0) Type.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/VMCore/Type.cpp diff -u llvm/lib/VMCore/Type.cpp:1.146 llvm/lib/VMCore/Type.cpp:1.147 --- llvm/lib/VMCore/Type.cpp:1.146 Thu Sep 28 18:45:00 2006 +++ llvm/lib/VMCore/Type.cpp Sun Oct 15 18:21:12 2006 @@ -1204,6 +1204,7 @@ assert(ValueType && "Can't get a pointer to type!"); assert(ValueType != Type::VoidTy && "Pointer to void is not valid, use sbyte* instead!"); + assert(ValueType != Type::LabelTy && "Pointer to label is not valid!"); PointerValType PVT(ValueType); PointerType *PT = PointerTypes->get(PVT); From sabre at nondot.org Sun Oct 15 18:26:42 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 18:26:42 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Verifier/2006-10-15-AddrLabel.ll Message-ID: <200610152326.k9FNQgMV030533@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Verifier: 2006-10-15-AddrLabel.ll added (r1.1) --- Log message: testcase that causes the asmparser to assert --- Diffs of the changes: (+9 -0) 2006-10-15-AddrLabel.ll | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/test/Regression/Verifier/2006-10-15-AddrLabel.ll diff -c /dev/null llvm/test/Regression/Verifier/2006-10-15-AddrLabel.ll:1.1 *** /dev/null Sun Oct 15 18:26:38 2006 --- llvm/test/Regression/Verifier/2006-10-15-AddrLabel.ll Sun Oct 15 18:26:28 2006 *************** *** 0 **** --- 1,9 ---- + ; RUN: not llvm-as %s -o /dev/null -f && + ; RUN: llvm-as %s -o /dev/null -f 2>&1 | grep 'Cannot form' + + int %main() { + %foo = call sbyte* %llvm.stacksave() + %foop = cast sbyte* %foo to label* + %nret = load label* %foop + br label %nret; + } From sabre at nondot.org Sun Oct 15 18:27:00 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 18:27:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200610152327.k9FNR0ou030548@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.264 -> 1.265 --- Log message: Produce a useful error message for Regression/Verifier/2006-10-15-AddrLabel.ll --- Diffs of the changes: (+2 -0) llvmAsmParser.y | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.264 llvm/lib/AsmParser/llvmAsmParser.y:1.265 --- llvm/lib/AsmParser/llvmAsmParser.y:1.264 Mon Oct 9 12:36:59 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y Sun Oct 15 18:26:46 2006 @@ -1296,6 +1296,8 @@ CHECK_FOR_ERROR } | UpRTypes '*' { // Pointer type? + if (*$1 == Type::LabelTy) + GEN_ERROR("Cannot form a pointer to a basic block"); $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1))); delete $1; CHECK_FOR_ERROR From sabre at nondot.org Sun Oct 15 18:27:40 2006 From: sabre at nondot.org (Chris Lattner) Date: Sun, 15 Oct 2006 18:27:40 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs llvmAsmParser.h.cvs llvmAsmParser.y.cvs Message-ID: <200610152327.k9FNReJm030588@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp.cvs updated: 1.16 -> 1.17 llvmAsmParser.h.cvs updated: 1.11 -> 1.12 llvmAsmParser.y.cvs updated: 1.16 -> 1.17 --- Log message: regenerate --- Diffs of the changes: (+2857 -3845) llvmAsmParser.cpp.cvs | 6333 +++++++++++++++++++++----------------------------- llvmAsmParser.h.cvs | 367 -- llvmAsmParser.y.cvs | 2 3 files changed, 2857 insertions(+), 3845 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.16 llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.17 --- llvm/lib/AsmParser/llvmAsmParser.cpp.cvs:1.16 Mon Oct 9 12:36:59 2006 +++ llvm/lib/AsmParser/llvmAsmParser.cpp.cvs Sun Oct 15 18:27:25 2006 @@ -1,288 +1,123 @@ -/* A Bison parser, made by GNU Bison 2.1. */ -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +/* A Bison parser, made from /Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y + by GNU Bison version 1.28 */ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* Written by Richard Stallman by simplifying the original so called - ``semantic'' parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.1" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 +#define YYBISON 1 /* Identify Bison output. */ -/* Substitute the variable and function names. */ #define yyparse llvmAsmparse -#define yylex llvmAsmlex +#define yylex llvmAsmlex #define yyerror llvmAsmerror -#define yylval llvmAsmlval -#define yychar llvmAsmchar +#define yylval llvmAsmlval +#define yychar llvmAsmchar #define yydebug llvmAsmdebug #define yynerrs llvmAsmnerrs +#define ESINT64VAL 257 +#define EUINT64VAL 258 +#define SINTVAL 259 +#define UINTVAL 260 +#define FPVAL 261 +#define VOID 262 +#define BOOL 263 +#define SBYTE 264 +#define UBYTE 265 +#define SHORT 266 +#define USHORT 267 +#define INT 268 +#define UINT 269 +#define LONG 270 +#define ULONG 271 +#define FLOAT 272 +#define DOUBLE 273 +#define TYPE 274 +#define LABEL 275 +#define VAR_ID 276 +#define LABELSTR 277 +#define STRINGCONSTANT 278 +#define IMPLEMENTATION 279 +#define ZEROINITIALIZER 280 +#define TRUETOK 281 +#define FALSETOK 282 +#define BEGINTOK 283 +#define ENDTOK 284 +#define DECLARE 285 +#define GLOBAL 286 +#define CONSTANT 287 +#define SECTION 288 +#define VOLATILE 289 +#define TO 290 +#define DOTDOTDOT 291 +#define NULL_TOK 292 +#define UNDEF 293 +#define CONST 294 +#define INTERNAL 295 +#define LINKONCE 296 +#define WEAK 297 +#define APPENDING 298 +#define DLLIMPORT 299 +#define DLLEXPORT 300 +#define EXTERN_WEAK 301 +#define OPAQUE 302 +#define NOT 303 +#define EXTERNAL 304 +#define TARGET 305 +#define TRIPLE 306 +#define ENDIAN 307 +#define POINTERSIZE 308 +#define LITTLE 309 +#define BIG 310 +#define ALIGN 311 +#define DEPLIBS 312 +#define CALL 313 +#define TAIL 314 +#define ASM_TOK 315 +#define MODULE 316 +#define SIDEEFFECT 317 +#define CC_TOK 318 +#define CCC_TOK 319 +#define CSRETCC_TOK 320 +#define FASTCC_TOK 321 +#define COLDCC_TOK 322 +#define X86_STDCALLCC_TOK 323 +#define X86_FASTCALLCC_TOK 324 +#define RET 325 +#define BR 326 +#define SWITCH 327 +#define INVOKE 328 +#define UNWIND 329 +#define UNREACHABLE 330 +#define ADD 331 +#define SUB 332 +#define MUL 333 +#define DIV 334 +#define REM 335 +#define AND 336 +#define OR 337 +#define XOR 338 +#define SETLE 339 +#define SETGE 340 +#define SETLT 341 +#define SETGT 342 +#define SETEQ 343 +#define SETNE 344 +#define MALLOC 345 +#define ALLOCA 346 +#define FREE 347 +#define LOAD 348 +#define STORE 349 +#define GETELEMENTPTR 350 +#define PHI_TOK 351 +#define CAST 352 +#define SELECT 353 +#define SHL 354 +#define SHR 355 +#define VAARG 356 +#define EXTRACTELEMENT 357 +#define INSERTELEMENT 358 +#define SHUFFLEVECTOR 359 +#define VAARG_old 360 +#define VANEXT_old 361 - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - ESINT64VAL = 258, - EUINT64VAL = 259, - SINTVAL = 260, - UINTVAL = 261, - FPVAL = 262, - VOID = 263, - BOOL = 264, - SBYTE = 265, - UBYTE = 266, - SHORT = 267, - USHORT = 268, - INT = 269, - UINT = 270, - LONG = 271, - ULONG = 272, - FLOAT = 273, - DOUBLE = 274, - TYPE = 275, - LABEL = 276, - VAR_ID = 277, - LABELSTR = 278, - STRINGCONSTANT = 279, - IMPLEMENTATION = 280, - ZEROINITIALIZER = 281, - TRUETOK = 282, - FALSETOK = 283, - BEGINTOK = 284, - ENDTOK = 285, - DECLARE = 286, - GLOBAL = 287, - CONSTANT = 288, - SECTION = 289, - VOLATILE = 290, - TO = 291, - DOTDOTDOT = 292, - NULL_TOK = 293, - UNDEF = 294, - CONST = 295, - INTERNAL = 296, - LINKONCE = 297, - WEAK = 298, - APPENDING = 299, - DLLIMPORT = 300, - DLLEXPORT = 301, - EXTERN_WEAK = 302, - OPAQUE = 303, - NOT = 304, - EXTERNAL = 305, - TARGET = 306, - TRIPLE = 307, - ENDIAN = 308, - POINTERSIZE = 309, - LITTLE = 310, - BIG = 311, - ALIGN = 312, - DEPLIBS = 313, - CALL = 314, - TAIL = 315, - ASM_TOK = 316, - MODULE = 317, - SIDEEFFECT = 318, - CC_TOK = 319, - CCC_TOK = 320, - CSRETCC_TOK = 321, - FASTCC_TOK = 322, - COLDCC_TOK = 323, - X86_STDCALLCC_TOK = 324, - X86_FASTCALLCC_TOK = 325, - RET = 326, - BR = 327, - SWITCH = 328, - INVOKE = 329, - UNWIND = 330, - UNREACHABLE = 331, - ADD = 332, - SUB = 333, - MUL = 334, - DIV = 335, - REM = 336, - AND = 337, - OR = 338, - XOR = 339, - SETLE = 340, - SETGE = 341, - SETLT = 342, - SETGT = 343, - SETEQ = 344, - SETNE = 345, - MALLOC = 346, - ALLOCA = 347, - FREE = 348, - LOAD = 349, - STORE = 350, - GETELEMENTPTR = 351, - PHI_TOK = 352, - CAST = 353, - SELECT = 354, - SHL = 355, - SHR = 356, - VAARG = 357, - EXTRACTELEMENT = 358, - INSERTELEMENT = 359, - SHUFFLEVECTOR = 360, - VAARG_old = 361, - VANEXT_old = 362 - }; -#endif -/* Tokens. */ -#define ESINT64VAL 258 -#define EUINT64VAL 259 -#define SINTVAL 260 -#define UINTVAL 261 -#define FPVAL 262 -#define VOID 263 -#define BOOL 264 -#define SBYTE 265 -#define UBYTE 266 -#define SHORT 267 -#define USHORT 268 -#define INT 269 -#define UINT 270 -#define LONG 271 -#define ULONG 272 -#define FLOAT 273 -#define DOUBLE 274 -#define TYPE 275 -#define LABEL 276 -#define VAR_ID 277 -#define LABELSTR 278 -#define STRINGCONSTANT 279 -#define IMPLEMENTATION 280 -#define ZEROINITIALIZER 281 -#define TRUETOK 282 -#define FALSETOK 283 -#define BEGINTOK 284 -#define ENDTOK 285 -#define DECLARE 286 -#define GLOBAL 287 -#define CONSTANT 288 -#define SECTION 289 -#define VOLATILE 290 -#define TO 291 -#define DOTDOTDOT 292 -#define NULL_TOK 293 -#define UNDEF 294 -#define CONST 295 -#define INTERNAL 296 -#define LINKONCE 297 -#define WEAK 298 -#define APPENDING 299 -#define DLLIMPORT 300 -#define DLLEXPORT 301 -#define EXTERN_WEAK 302 -#define OPAQUE 303 -#define NOT 304 -#define EXTERNAL 305 -#define TARGET 306 -#define TRIPLE 307 -#define ENDIAN 308 -#define POINTERSIZE 309 -#define LITTLE 310 -#define BIG 311 -#define ALIGN 312 -#define DEPLIBS 313 -#define CALL 314 -#define TAIL 315 -#define ASM_TOK 316 -#define MODULE 317 -#define SIDEEFFECT 318 -#define CC_TOK 319 -#define CCC_TOK 320 -#define CSRETCC_TOK 321 -#define FASTCC_TOK 322 -#define COLDCC_TOK 323 -#define X86_STDCALLCC_TOK 324 -#define X86_FASTCALLCC_TOK 325 -#define RET 326 -#define BR 327 -#define SWITCH 328 -#define INVOKE 329 -#define UNWIND 330 -#define UNREACHABLE 331 -#define ADD 332 -#define SUB 333 -#define MUL 334 -#define DIV 335 -#define REM 336 -#define AND 337 -#define OR 338 -#define XOR 339 -#define SETLE 340 -#define SETGE 341 -#define SETLT 342 -#define SETGT 343 -#define SETEQ 344 -#define SETNE 345 -#define MALLOC 346 -#define ALLOCA 347 -#define FREE 348 -#define LOAD 349 -#define STORE 350 -#define GETELEMENTPTR 351 -#define PHI_TOK 352 -#define CAST 353 -#define SELECT 354 -#define SHL 355 -#define SHR 356 -#define VAARG 357 -#define EXTRACTELEMENT 358 -#define INSERTELEMENT 359 -#define SHUFFLEVECTOR 360 -#define VAARG_old 361 -#define VANEXT_old 362 - - - - -/* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" +#line 14 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -1242,28 +1077,8 @@ } - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - -#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 974 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" -typedef union YYSTYPE { +#line 974 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +typedef union { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -1302,1457 +1117,997 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -/* Line 196 of yacc.c. */ -#line 1307 "llvmAsmParser.tab.c" -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - - - -/* Copy the second part of user declarations. */ - - -/* Line 219 of yacc.c. */ -#line 1319 "llvmAsmParser.tab.c" - -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int -#endif - -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -#if ! defined (yyoverflow) || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# else -# define YYSTACK_ALLOC alloca -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYINCLUDED_STDLIB_H -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) -# endif -# ifdef __cplusplus -extern "C" { -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ - && (defined (__STDC__) || defined (__cplusplus))) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ - && (defined (__STDC__) || defined (__cplusplus))) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifdef __cplusplus -} -# endif -# endif -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ +#include +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif -#if (! defined (yyoverflow) \ - && (! defined (__cplusplus) \ - || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - short int yyss; - YYSTYPE yyvs; - }; -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +#define YYFINAL 514 +#define YYFLAG -32768 +#define YYNTBASE 122 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 361 ? yytranslate[x] : 196) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 111, + 112, 120, 2, 109, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 116, + 108, 117, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 113, 110, 115, 2, 2, 2, 2, 2, 121, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, + 2, 2, 118, 2, 119, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107 +}; -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined (__GNUC__) && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (0) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, + 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, + 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, + 60, 62, 64, 67, 68, 70, 72, 74, 76, 78, + 80, 82, 83, 84, 86, 88, 90, 92, 94, 96, + 99, 100, 103, 104, 108, 111, 112, 114, 115, 119, + 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, + 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, + 162, 164, 166, 169, 174, 180, 186, 190, 193, 196, + 198, 202, 204, 208, 210, 211, 216, 220, 224, 229, + 234, 238, 241, 244, 247, 250, 253, 256, 259, 262, + 265, 268, 275, 281, 290, 297, 304, 311, 318, 325, + 334, 343, 347, 349, 351, 353, 355, 358, 361, 366, + 369, 371, 376, 379, 384, 385, 393, 394, 402, 403, + 411, 412, 420, 424, 429, 430, 432, 434, 436, 440, + 444, 448, 452, 456, 458, 459, 461, 463, 465, 466, + 469, 473, 475, 477, 481, 483, 484, 493, 495, 497, + 501, 503, 505, 508, 509, 511, 513, 514, 519, 520, + 522, 524, 526, 528, 530, 532, 534, 536, 538, 542, + 544, 550, 552, 554, 556, 558, 561, 564, 567, 571, + 574, 575, 577, 580, 583, 587, 597, 607, 616, 630, + 632, 634, 641, 647, 650, 657, 665, 667, 671, 673, + 674, 677, 679, 685, 691, 697, 700, 705, 710, 717, + 722, 727, 732, 737, 744, 751, 754, 762, 764, 767, + 768, 770, 771, 775, 782, 786, 793, 796, 801, 808 +}; -#endif +static const short yyrhs[] = { 5, + 0, 6, 0, 3, 0, 4, 0, 77, 0, 78, + 0, 79, 0, 80, 0, 81, 0, 82, 0, 83, + 0, 84, 0, 85, 0, 86, 0, 87, 0, 88, + 0, 89, 0, 90, 0, 100, 0, 101, 0, 16, + 0, 14, 0, 12, 0, 10, 0, 17, 0, 15, + 0, 13, 0, 11, 0, 128, 0, 129, 0, 18, + 0, 19, 0, 164, 108, 0, 0, 41, 0, 42, + 0, 43, 0, 44, 0, 45, 0, 46, 0, 47, + 0, 0, 0, 65, 0, 66, 0, 67, 0, 68, + 0, 69, 0, 70, 0, 64, 4, 0, 0, 57, + 4, 0, 0, 109, 57, 4, 0, 34, 24, 0, + 0, 137, 0, 0, 109, 140, 139, 0, 137, 0, + 57, 4, 0, 143, 0, 8, 0, 145, 0, 8, + 0, 145, 0, 9, 0, 10, 0, 11, 0, 12, + 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, + 0, 18, 0, 19, 0, 20, 0, 21, 0, 48, + 0, 144, 0, 179, 0, 110, 4, 0, 142, 111, + 147, 112, 0, 113, 4, 114, 145, 115, 0, 116, + 4, 114, 145, 117, 0, 118, 146, 119, 0, 118, + 119, 0, 145, 120, 0, 145, 0, 146, 109, 145, + 0, 146, 0, 146, 109, 37, 0, 37, 0, 0, + 143, 113, 150, 115, 0, 143, 113, 115, 0, 143, + 121, 24, 0, 143, 116, 150, 117, 0, 143, 118, + 150, 119, 0, 143, 118, 119, 0, 143, 38, 0, + 143, 39, 0, 143, 179, 0, 143, 149, 0, 143, + 26, 0, 128, 123, 0, 129, 4, 0, 9, 27, + 0, 9, 28, 0, 131, 7, 0, 98, 111, 148, + 36, 143, 112, 0, 96, 111, 148, 193, 112, 0, + 99, 111, 148, 109, 148, 109, 148, 112, 0, 124, + 111, 148, 109, 148, 112, 0, 125, 111, 148, 109, + 148, 112, 0, 126, 111, 148, 109, 148, 112, 0, + 127, 111, 148, 109, 148, 112, 0, 103, 111, 148, + 109, 148, 112, 0, 104, 111, 148, 109, 148, 109, + 148, 112, 0, 105, 111, 148, 109, 148, 109, 148, + 112, 0, 150, 109, 148, 0, 148, 0, 32, 0, + 33, 0, 153, 0, 153, 173, 0, 153, 175, 0, + 153, 62, 61, 159, 0, 153, 25, 0, 154, 0, + 154, 132, 20, 141, 0, 154, 175, 0, 154, 62, + 61, 159, 0, 0, 154, 132, 133, 151, 148, 155, + 139, 0, 0, 154, 132, 50, 151, 143, 156, 139, + 0, 0, 154, 132, 45, 151, 143, 157, 139, 0, + 0, 154, 132, 47, 151, 143, 158, 139, 0, 154, + 51, 161, 0, 154, 58, 108, 162, 0, 0, 24, + 0, 56, 0, 55, 0, 53, 108, 160, 0, 54, + 108, 4, 0, 52, 108, 24, 0, 113, 163, 115, + 0, 163, 109, 24, 0, 24, 0, 0, 22, 0, + 24, 0, 164, 0, 0, 143, 165, 0, 167, 109, + 166, 0, 166, 0, 167, 0, 167, 109, 37, 0, + 37, 0, 0, 134, 141, 164, 111, 168, 112, 138, + 135, 0, 29, 0, 118, 0, 133, 169, 170, 0, + 30, 0, 119, 0, 182, 172, 0, 0, 45, 0, + 47, 0, 0, 31, 176, 174, 169, 0, 0, 63, + 0, 3, 0, 4, 0, 7, 0, 27, 0, 28, + 0, 38, 0, 39, 0, 26, 0, 116, 150, 117, + 0, 149, 0, 61, 177, 24, 109, 24, 0, 122, + 0, 164, 0, 179, 0, 178, 0, 143, 180, 0, + 182, 183, 0, 171, 183, 0, 184, 132, 185, 0, + 184, 187, 0, 0, 23, 0, 71, 181, 0, 71, + 8, 0, 72, 21, 180, 0, 72, 9, 180, 109, + 21, 180, 109, 21, 180, 0, 73, 130, 180, 109, + 21, 180, 113, 186, 115, 0, 73, 130, 180, 109, + 21, 180, 113, 115, 0, 74, 134, 141, 180, 111, + 190, 112, 36, 21, 180, 75, 21, 180, 0, 75, + 0, 76, 0, 186, 130, 178, 109, 21, 180, 0, + 130, 178, 109, 21, 180, 0, 132, 192, 0, 143, + 113, 180, 109, 180, 115, 0, 188, 109, 113, 180, + 109, 180, 115, 0, 181, 0, 189, 109, 181, 0, + 189, 0, 0, 60, 59, 0, 59, 0, 124, 143, + 180, 109, 180, 0, 125, 143, 180, 109, 180, 0, + 126, 143, 180, 109, 180, 0, 49, 181, 0, 127, + 181, 109, 181, 0, 98, 181, 36, 143, 0, 99, + 181, 109, 181, 109, 181, 0, 102, 181, 109, 143, + 0, 106, 181, 109, 143, 0, 107, 181, 109, 143, + 0, 103, 181, 109, 181, 0, 104, 181, 109, 181, + 109, 181, 0, 105, 181, 109, 181, 109, 181, 0, + 97, 188, 0, 191, 134, 141, 180, 111, 190, 112, + 0, 195, 0, 109, 189, 0, 0, 35, 0, 0, + 91, 143, 136, 0, 91, 143, 109, 15, 180, 136, + 0, 92, 143, 136, 0, 92, 143, 109, 15, 180, + 136, 0, 93, 181, 0, 194, 94, 143, 180, 0, + 194, 95, 181, 109, 143, 180, 0, 96, 143, 180, + 193, 0 +}; -#if defined (__STDC__) || defined (__cplusplus) - typedef signed char yysigned_char; -#else - typedef short int yysigned_char; #endif -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 4 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1330 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 122 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 75 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 251 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 514 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 362 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const unsigned char yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 111, 112, 120, 2, 109, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 116, 108, 117, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 113, 110, 115, 2, 2, 2, 2, 2, 121, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 114, 2, 2, 118, 2, 119, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107 +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 1096, 1097, 1105, 1106, 1116, 1116, 1116, 1116, 1116, 1117, + 1117, 1117, 1118, 1118, 1118, 1118, 1118, 1118, 1120, 1120, + 1124, 1124, 1124, 1124, 1125, 1125, 1125, 1125, 1126, 1126, + 1127, 1127, 1130, 1134, 1139, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1148, 1148, 1149, 1150, 1151, 1152, 1153, 1154, + 1164, 1164, 1171, 1171, 1180, 1188, 1188, 1194, 1194, 1196, + 1201, 1215, 1215, 1216, 1216, 1218, 1228, 1228, 1228, 1228, + 1228, 1228, 1228, 1229, 1229, 1229, 1229, 1229, 1229, 1230, + 1234, 1238, 1246, 1254, 1267, 1272, 1284, 1294, 1298, 1309, + 1314, 1320, 1321, 1325, 1329, 1340, 1366, 1380, 1410, 1436, + 1457, 1470, 1480, 1485, 1546, 1553, 1562, 1568, 1574, 1578, + 1582, 1590, 1601, 1633, 1641, 1663, 1674, 1680, 1688, 1694, + 1700, 1709, 1713, 1721, 1721, 1731, 1739, 1744, 1748, 1752, + 1756, 1771, 1793, 1796, 1799, 1804, 1807, 1811, 1815, 1819, + 1823, 1828, 1832, 1835, 1838, 1842, 1855, 1856, 1858, 1862, + 1871, 1877, 1879, 1884, 1889, 1898, 1898, 1899, 1899, 1901, + 1908, 1914, 1921, 1925, 1931, 1936, 1941, 2036, 2036, 2038, + 2046, 2046, 2048, 2053, 2053, 2054, 2057, 2057, 2067, 2071, + 2076, 2080, 2084, 2088, 2092, 2096, 2100, 2104, 2108, 2133, + 2137, 2151, 2155, 2161, 2161, 2167, 2172, 2176, 2185, 2196, + 2201, 2213, 2226, 2230, 2234, 2239, 2248, 2267, 2276, 2332, + 2336, 2343, 2354, 2367, 2376, 2385, 2395, 2399, 2406, 2406, + 2408, 2412, 2417, 2433, 2448, 2462, 2475, 2483, 2491, 2499, + 2505, 2525, 2548, 2554, 2560, 2566, 2581, 2640, 2647, 2650, + 2655, 2659, 2666, 2671, 2677, 2682, 2688, 2696, 2708, 2723 }; +#endif -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const unsigned short int yyprhs[] = -{ - 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, - 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, - 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, - 59, 61, 63, 65, 67, 70, 71, 73, 75, 77, - 79, 81, 83, 85, 86, 87, 89, 91, 93, 95, - 97, 99, 102, 103, 106, 107, 111, 114, 115, 117, - 118, 122, 124, 127, 129, 131, 133, 135, 137, 139, - 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, - 161, 163, 165, 167, 169, 172, 177, 183, 189, 193, - 196, 199, 201, 205, 207, 211, 213, 214, 219, 223, - 227, 232, 237, 241, 244, 247, 250, 253, 256, 259, - 262, 265, 268, 271, 278, 284, 293, 300, 307, 314, - 321, 328, 337, 346, 350, 352, 354, 356, 358, 361, - 364, 369, 372, 374, 379, 382, 387, 388, 396, 397, - 405, 406, 414, 415, 423, 427, 432, 433, 435, 437, - 439, 443, 447, 451, 455, 459, 461, 462, 464, 466, - 468, 469, 472, 476, 478, 480, 484, 486, 487, 496, - 498, 500, 504, 506, 508, 511, 512, 514, 516, 517, - 522, 523, 525, 527, 529, 531, 533, 535, 537, 539, - 541, 545, 547, 553, 555, 557, 559, 561, 564, 567, - 570, 574, 577, 578, 580, 583, 586, 590, 600, 610, - 619, 633, 635, 637, 644, 650, 653, 660, 668, 670, - 674, 676, 677, 680, 682, 688, 694, 700, 703, 708, - 713, 720, 725, 730, 735, 740, 747, 754, 757, 765, - 767, 770, 771, 773, 774, 778, 785, 789, 796, 799, - 804, 811 -}; -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const short int yyrhs[] = -{ - 153, 0, -1, 5, -1, 6, -1, 3, -1, 4, - -1, 77, -1, 78, -1, 79, -1, 80, -1, 81, - -1, 82, -1, 83, -1, 84, -1, 85, -1, 86, - -1, 87, -1, 88, -1, 89, -1, 90, -1, 100, - -1, 101, -1, 16, -1, 14, -1, 12, -1, 10, - -1, 17, -1, 15, -1, 13, -1, 11, -1, 129, - -1, 130, -1, 18, -1, 19, -1, 165, 108, -1, - -1, 41, -1, 42, -1, 43, -1, 44, -1, 45, - -1, 46, -1, 47, -1, -1, -1, 65, -1, 66, - -1, 67, -1, 68, -1, 69, -1, 70, -1, 64, - 4, -1, -1, 57, 4, -1, -1, 109, 57, 4, - -1, 34, 24, -1, -1, 138, -1, -1, 109, 141, - 140, -1, 138, -1, 57, 4, -1, 144, -1, 8, - -1, 146, -1, 8, -1, 146, -1, 9, -1, 10, - -1, 11, -1, 12, -1, 13, -1, 14, -1, 15, - -1, 16, -1, 17, -1, 18, -1, 19, -1, 20, - -1, 21, -1, 48, -1, 145, -1, 180, -1, 110, - 4, -1, 143, 111, 148, 112, -1, 113, 4, 114, - 146, 115, -1, 116, 4, 114, 146, 117, -1, 118, - 147, 119, -1, 118, 119, -1, 146, 120, -1, 146, - -1, 147, 109, 146, -1, 147, -1, 147, 109, 37, - -1, 37, -1, -1, 144, 113, 151, 115, -1, 144, - 113, 115, -1, 144, 121, 24, -1, 144, 116, 151, - 117, -1, 144, 118, 151, 119, -1, 144, 118, 119, - -1, 144, 38, -1, 144, 39, -1, 144, 180, -1, - 144, 150, -1, 144, 26, -1, 129, 124, -1, 130, - 4, -1, 9, 27, -1, 9, 28, -1, 132, 7, - -1, 98, 111, 149, 36, 144, 112, -1, 96, 111, - 149, 194, 112, -1, 99, 111, 149, 109, 149, 109, - 149, 112, -1, 125, 111, 149, 109, 149, 112, -1, - 126, 111, 149, 109, 149, 112, -1, 127, 111, 149, - 109, 149, 112, -1, 128, 111, 149, 109, 149, 112, - -1, 103, 111, 149, 109, 149, 112, -1, 104, 111, - 149, 109, 149, 109, 149, 112, -1, 105, 111, 149, - 109, 149, 109, 149, 112, -1, 151, 109, 149, -1, - 149, -1, 32, -1, 33, -1, 154, -1, 154, 174, - -1, 154, 176, -1, 154, 62, 61, 160, -1, 154, - 25, -1, 155, -1, 155, 133, 20, 142, -1, 155, - 176, -1, 155, 62, 61, 160, -1, -1, 155, 133, - 134, 152, 149, 156, 140, -1, -1, 155, 133, 50, - 152, 144, 157, 140, -1, -1, 155, 133, 45, 152, - 144, 158, 140, -1, -1, 155, 133, 47, 152, 144, - 159, 140, -1, 155, 51, 162, -1, 155, 58, 108, - 163, -1, -1, 24, -1, 56, -1, 55, -1, 53, - 108, 161, -1, 54, 108, 4, -1, 52, 108, 24, - -1, 113, 164, 115, -1, 164, 109, 24, -1, 24, - -1, -1, 22, -1, 24, -1, 165, -1, -1, 144, - 166, -1, 168, 109, 167, -1, 167, -1, 168, -1, - 168, 109, 37, -1, 37, -1, -1, 135, 142, 165, - 111, 169, 112, 139, 136, -1, 29, -1, 118, -1, - 134, 170, 171, -1, 30, -1, 119, -1, 183, 173, - -1, -1, 45, -1, 47, -1, -1, 31, 177, 175, - 170, -1, -1, 63, -1, 3, -1, 4, -1, 7, - -1, 27, -1, 28, -1, 38, -1, 39, -1, 26, - -1, 116, 151, 117, -1, 150, -1, 61, 178, 24, - 109, 24, -1, 123, -1, 165, -1, 180, -1, 179, - -1, 144, 181, -1, 183, 184, -1, 172, 184, -1, - 185, 133, 186, -1, 185, 188, -1, -1, 23, -1, - 71, 182, -1, 71, 8, -1, 72, 21, 181, -1, - 72, 9, 181, 109, 21, 181, 109, 21, 181, -1, - 73, 131, 181, 109, 21, 181, 113, 187, 115, -1, - 73, 131, 181, 109, 21, 181, 113, 115, -1, 74, - 135, 142, 181, 111, 191, 112, 36, 21, 181, 75, - 21, 181, -1, 75, -1, 76, -1, 187, 131, 179, - 109, 21, 181, -1, 131, 179, 109, 21, 181, -1, - 133, 193, -1, 144, 113, 181, 109, 181, 115, -1, - 189, 109, 113, 181, 109, 181, 115, -1, 182, -1, - 190, 109, 182, -1, 190, -1, -1, 60, 59, -1, - 59, -1, 125, 144, 181, 109, 181, -1, 126, 144, - 181, 109, 181, -1, 127, 144, 181, 109, 181, -1, - 49, 182, -1, 128, 182, 109, 182, -1, 98, 182, - 36, 144, -1, 99, 182, 109, 182, 109, 182, -1, - 102, 182, 109, 144, -1, 106, 182, 109, 144, -1, - 107, 182, 109, 144, -1, 103, 182, 109, 182, -1, - 104, 182, 109, 182, 109, 182, -1, 105, 182, 109, - 182, 109, 182, -1, 97, 189, -1, 192, 135, 142, - 181, 111, 191, 112, -1, 196, -1, 109, 190, -1, - -1, 35, -1, -1, 91, 144, 137, -1, 91, 144, - 109, 15, 181, 137, -1, 92, 144, 137, -1, 92, - 144, 109, 15, 181, 137, -1, 93, 182, -1, 195, - 94, 144, 181, -1, 195, 95, 182, 109, 144, 181, - -1, 96, 144, 181, 194, -1 -}; +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned short int yyrline[] = -{ - 0, 1096, 1096, 1097, 1105, 1106, 1116, 1116, 1116, 1116, - 1116, 1117, 1117, 1117, 1118, 1118, 1118, 1118, 1118, 1118, - 1120, 1120, 1124, 1124, 1124, 1124, 1125, 1125, 1125, 1125, - 1126, 1126, 1127, 1127, 1130, 1134, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1164, 1165, 1171, 1172, 1180, 1188, 1189, 1194, - 1195, 1196, 1201, 1215, 1215, 1216, 1216, 1218, 1228, 1228, - 1228, 1228, 1228, 1228, 1228, 1229, 1229, 1229, 1229, 1229, - 1229, 1230, 1234, 1238, 1246, 1254, 1267, 1272, 1284, 1294, - 1298, 1307, 1312, 1318, 1319, 1323, 1327, 1338, 1364, 1378, - 1408, 1434, 1455, 1468, 1478, 1483, 1544, 1551, 1560, 1566, - 1572, 1576, 1580, 1588, 1599, 1631, 1639, 1661, 1672, 1678, - 1686, 1692, 1698, 1707, 1711, 1719, 1719, 1729, 1737, 1742, - 1746, 1750, 1754, 1769, 1791, 1794, 1797, 1797, 1805, 1805, - 1813, 1813, 1821, 1821, 1830, 1833, 1836, 1840, 1853, 1854, - 1856, 1860, 1869, 1875, 1877, 1882, 1887, 1896, 1896, 1897, - 1897, 1899, 1906, 1912, 1919, 1923, 1929, 1934, 1939, 2034, - 2034, 2036, 2044, 2044, 2046, 2051, 2052, 2053, 2055, 2055, - 2065, 2069, 2074, 2078, 2082, 2086, 2090, 2094, 2098, 2102, - 2106, 2131, 2135, 2149, 2153, 2159, 2159, 2165, 2170, 2174, - 2183, 2194, 2199, 2211, 2224, 2228, 2232, 2237, 2246, 2265, - 2274, 2330, 2334, 2341, 2352, 2365, 2374, 2383, 2393, 2397, - 2404, 2404, 2406, 2410, 2415, 2431, 2446, 2460, 2473, 2481, - 2489, 2497, 2503, 2523, 2546, 2552, 2558, 2564, 2579, 2638, - 2645, 2648, 2653, 2657, 2664, 2669, 2675, 2680, 2686, 2694, - 2706, 2721 +static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL", +"EUINT64VAL","SINTVAL","UINTVAL","FPVAL","VOID","BOOL","SBYTE","UBYTE","SHORT", +"USHORT","INT","UINT","LONG","ULONG","FLOAT","DOUBLE","TYPE","LABEL","VAR_ID", +"LABELSTR","STRINGCONSTANT","IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK", +"BEGINTOK","ENDTOK","DECLARE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO", +"DOTDOTDOT","NULL_TOK","UNDEF","CONST","INTERNAL","LINKONCE","WEAK","APPENDING", +"DLLIMPORT","DLLEXPORT","EXTERN_WEAK","OPAQUE","NOT","EXTERNAL","TARGET","TRIPLE", +"ENDIAN","POINTERSIZE","LITTLE","BIG","ALIGN","DEPLIBS","CALL","TAIL","ASM_TOK", +"MODULE","SIDEEFFECT","CC_TOK","CCC_TOK","CSRETCC_TOK","FASTCC_TOK","COLDCC_TOK", +"X86_STDCALLCC_TOK","X86_FASTCALLCC_TOK","RET","BR","SWITCH","INVOKE","UNWIND", +"UNREACHABLE","ADD","SUB","MUL","DIV","REM","AND","OR","XOR","SETLE","SETGE", +"SETLT","SETGT","SETEQ","SETNE","MALLOC","ALLOCA","FREE","LOAD","STORE","GETELEMENTPTR", +"PHI_TOK","CAST","SELECT","SHL","SHR","VAARG","EXTRACTELEMENT","INSERTELEMENT", +"SHUFFLEVECTOR","VAARG_old","VANEXT_old","'='","','","'\\\\'","'('","')'","'['", +"'x'","']'","'<'","'>'","'{'","'}'","'*'","'c'","INTVAL","EINT64VAL","ArithmeticOps", +"LogicalOps","SetCondOps","ShiftOps","SIntType","UIntType","IntType","FPType", +"OptAssign","OptLinkage","OptCallingConv","OptAlign","OptCAlign","SectionString", +"OptSection","GlobalVarAttributes","GlobalVarAttribute","TypesV","UpRTypesV", +"Types","PrimType","UpRTypes","TypeListI","ArgTypeListI","ConstVal","ConstExpr", +"ConstVector","GlobalType","Module","FunctionList","ConstPool","@1","@2","@3", +"@4","AsmBlock","BigOrLittle","TargetDefinition","LibrariesDefinition","LibList", +"Name","OptName","ArgVal","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader", +"END","Function","FnDeclareLinkage","FunctionProto","@5","OptSideEffect","ConstValueRef", +"SymbolicValueRef","ValueRef","ResolvedVal","BasicBlockList","BasicBlock","InstructionList", +"BBTerminatorInst","JumpTable","Inst","PHIList","ValueRefList","ValueRefListE", +"OptTailCall","InstVal","IndexList","OptVolatile","MemoryInst", NULL }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL", - "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT", - "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL", - "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", - "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", - "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", - "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE", - "WEAK", "APPENDING", "DLLIMPORT", "DLLEXPORT", "EXTERN_WEAK", "OPAQUE", - "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", "POINTERSIZE", "LITTLE", - "BIG", "ALIGN", "DEPLIBS", "CALL", "TAIL", "ASM_TOK", "MODULE", - "SIDEEFFECT", "CC_TOK", "CCC_TOK", "CSRETCC_TOK", "FASTCC_TOK", - "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "RET", "BR", - "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "DIV", - "REM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", - "SETNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", - "PHI_TOK", "CAST", "SELECT", "SHL", "SHR", "VAARG", "EXTRACTELEMENT", - "INSERTELEMENT", "SHUFFLEVECTOR", "VAARG_old", "VANEXT_old", "'='", - "','", "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", - "'}'", "'*'", "'c'", "$accept", "INTVAL", "EINT64VAL", "ArithmeticOps", - "LogicalOps", "SetCondOps", "ShiftOps", "SIntType", "UIntType", - "IntType", "FPType", "OptAssign", "OptLinkage", "OptCallingConv", - "OptAlign", "OptCAlign", "SectionString", "OptSection", - "GlobalVarAttributes", "GlobalVarAttribute", "TypesV", "UpRTypesV", - "Types", "PrimType", "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", - "ConstExpr", "ConstVector", "GlobalType", "Module", "FunctionList", - "ConstPool", "@1", "@2", "@3", "@4", "AsmBlock", "BigOrLittle", - "TargetDefinition", "LibrariesDefinition", "LibList", "Name", "OptName", - "ArgVal", "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", - "FunctionHeader", "END", "Function", "FnDeclareLinkage", "FunctionProto", - "@5", "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef", - "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList", - "BBTerminatorInst", "JumpTable", "Inst", "PHIList", "ValueRefList", - "ValueRefListE", "OptTailCall", "InstVal", "IndexList", "OptVolatile", - "MemoryInst", 0 +static const short yyr1[] = { 0, + 122, 122, 123, 123, 124, 124, 124, 124, 124, 125, + 125, 125, 126, 126, 126, 126, 126, 126, 127, 127, + 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, + 131, 131, 132, 132, 133, 133, 133, 133, 133, 133, + 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, + 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, + 140, 141, 141, 142, 142, 143, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 146, + 146, 147, 147, 147, 147, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 150, 150, 151, 151, 152, 153, 153, 153, 153, + 153, 154, 154, 154, 155, 154, 156, 154, 157, 154, + 158, 154, 154, 154, 154, 159, 160, 160, 161, 161, + 161, 162, 163, 163, 163, 164, 164, 165, 165, 166, + 167, 167, 168, 168, 168, 168, 169, 170, 170, 171, + 172, 172, 173, 174, 174, 174, 176, 175, 177, 177, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 179, 179, 180, 180, 181, 182, 182, 183, 184, + 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 186, 186, 187, 188, 188, 189, 189, 190, 190, + 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, + 194, 194, 195, 195, 195, 195, 195, 195, 195, 195 }; -#endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const unsigned short int yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 61, 44, - 92, 40, 41, 91, 120, 93, 60, 62, 123, 125, - 42, 99 +static const short yyr2[] = { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 2, + 0, 2, 0, 3, 2, 0, 1, 0, 3, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 4, 5, 5, 3, 2, 2, 1, + 3, 1, 3, 1, 0, 4, 3, 3, 4, 4, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 6, 5, 8, 6, 6, 6, 6, 6, 8, + 8, 3, 1, 1, 1, 1, 2, 2, 4, 2, + 1, 4, 2, 4, 0, 7, 0, 7, 0, 7, + 0, 7, 3, 4, 0, 1, 1, 1, 3, 3, + 3, 3, 3, 1, 0, 1, 1, 1, 0, 2, + 3, 1, 1, 3, 1, 0, 8, 1, 1, 3, + 1, 1, 2, 0, 1, 1, 0, 4, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, + 5, 1, 1, 1, 1, 2, 2, 2, 3, 2, + 0, 1, 2, 2, 3, 9, 9, 8, 13, 1, + 1, 6, 5, 2, 6, 7, 1, 3, 1, 0, + 2, 1, 5, 5, 5, 2, 4, 4, 6, 4, + 4, 4, 4, 6, 6, 2, 7, 1, 2, 0, + 1, 0, 3, 6, 3, 6, 2, 4, 6, 4 }; -# endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const unsigned char yyr1[] = -{ - 0, 122, 123, 123, 124, 124, 125, 125, 125, 125, - 125, 126, 126, 126, 127, 127, 127, 127, 127, 127, - 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, - 131, 131, 132, 132, 133, 133, 134, 134, 134, 134, - 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, - 135, 135, 136, 136, 137, 137, 138, 139, 139, 140, - 140, 141, 141, 142, 142, 143, 143, 144, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 147, 147, 148, 148, 148, 148, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 151, 151, 152, 152, 153, 154, 154, - 154, 154, 154, 155, 155, 155, 156, 155, 157, 155, - 158, 155, 159, 155, 155, 155, 155, 160, 161, 161, - 162, 162, 162, 163, 164, 164, 164, 165, 165, 166, - 166, 167, 168, 168, 169, 169, 169, 169, 170, 171, - 171, 172, 173, 173, 174, 175, 175, 175, 177, 176, - 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 179, 180, 180, 181, 181, 182, 183, 183, - 184, 185, 185, 185, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 187, 187, 188, 189, 189, 190, 190, - 191, 191, 192, 192, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 194, 194, 195, 195, 196, 196, 196, 196, 196, 196, - 196, 196 +static const short yydefact[] = { 145, + 42, 131, 130, 177, 35, 36, 37, 38, 39, 40, + 41, 0, 43, 201, 127, 128, 201, 156, 157, 0, + 0, 0, 42, 0, 133, 174, 0, 0, 44, 45, + 46, 47, 48, 49, 0, 0, 202, 198, 34, 171, + 172, 173, 197, 0, 0, 0, 143, 0, 0, 0, + 0, 0, 0, 0, 33, 175, 176, 43, 146, 129, + 50, 1, 2, 63, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 0, 0, + 0, 0, 192, 0, 0, 62, 81, 66, 193, 82, + 168, 169, 170, 242, 200, 0, 0, 0, 155, 144, + 134, 132, 124, 125, 0, 0, 0, 0, 178, 83, + 0, 0, 65, 88, 90, 0, 0, 95, 89, 241, + 0, 222, 0, 0, 0, 0, 43, 210, 211, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, + 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 199, 43, 214, 0, 238, 151, 148, 147, + 149, 150, 154, 0, 139, 141, 137, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 0, 0, + 0, 0, 135, 0, 0, 0, 87, 166, 94, 92, + 0, 0, 226, 221, 204, 203, 0, 0, 24, 28, + 23, 27, 22, 26, 21, 25, 29, 30, 0, 0, + 53, 53, 247, 0, 0, 236, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 152, 58, 58, 58, 109, 110, 3, 4, + 107, 108, 111, 106, 102, 103, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 104, 58, 64, 64, 91, 165, 159, 162, 163, + 0, 0, 84, 181, 182, 183, 188, 184, 185, 186, + 187, 179, 0, 190, 195, 194, 196, 0, 205, 0, + 0, 0, 243, 0, 245, 240, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 153, 0, 140, 142, 138, 0, 0, + 0, 0, 0, 0, 97, 123, 0, 0, 101, 0, + 98, 0, 0, 0, 0, 136, 85, 86, 158, 160, + 0, 56, 93, 180, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 250, 0, 0, 228, 0, 230, 233, + 0, 0, 231, 232, 0, 0, 0, 227, 0, 248, + 0, 0, 0, 60, 58, 240, 0, 0, 0, 0, + 0, 0, 96, 99, 100, 0, 0, 0, 0, 164, + 161, 57, 51, 0, 189, 0, 0, 220, 53, 54, + 53, 217, 239, 0, 0, 0, 0, 0, 223, 224, + 225, 220, 0, 55, 61, 59, 0, 0, 0, 0, + 0, 0, 122, 0, 0, 0, 0, 0, 167, 0, + 0, 0, 219, 0, 0, 244, 246, 0, 0, 0, + 229, 234, 235, 0, 249, 113, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 191, 0, 0, 0, + 218, 215, 0, 237, 112, 0, 119, 0, 0, 115, + 116, 117, 118, 0, 208, 0, 0, 0, 216, 0, + 0, 0, 206, 0, 207, 0, 0, 114, 120, 121, + 0, 0, 0, 0, 0, 0, 213, 0, 0, 212, + 209, 0, 0, 0 }; -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const unsigned char yyr2[] = -{ - 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, - 1, 2, 0, 2, 0, 3, 2, 0, 1, 0, - 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 4, 5, 5, 3, 2, - 2, 1, 3, 1, 3, 1, 0, 4, 3, 3, - 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 6, 5, 8, 6, 6, 6, 6, - 6, 8, 8, 3, 1, 1, 1, 1, 2, 2, - 4, 2, 1, 4, 2, 4, 0, 7, 0, 7, - 0, 7, 0, 7, 3, 4, 0, 1, 1, 1, - 3, 3, 3, 3, 3, 1, 0, 1, 1, 1, - 0, 2, 3, 1, 1, 3, 1, 0, 8, 1, - 1, 3, 1, 1, 2, 0, 1, 1, 0, 4, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 5, 1, 1, 1, 1, 2, 2, 2, - 3, 2, 0, 1, 2, 2, 3, 9, 9, 8, - 13, 1, 1, 6, 5, 2, 6, 7, 1, 3, - 1, 0, 2, 1, 5, 5, 5, 2, 4, 4, - 6, 4, 4, 4, 4, 6, 6, 2, 7, 1, - 2, 0, 1, 0, 3, 6, 3, 6, 2, 4, - 6, 4 +static const short yydefgoto[] = { 83, + 251, 267, 268, 269, 270, 189, 190, 219, 191, 23, + 13, 35, 439, 303, 384, 403, 326, 385, 84, 85, + 192, 87, 88, 116, 201, 336, 294, 337, 105, 512, + 1, 2, 273, 246, 244, 245, 60, 171, 47, 100, + 174, 89, 350, 279, 280, 281, 36, 93, 14, 42, + 15, 58, 16, 26, 355, 295, 90, 297, 412, 17, + 38, 39, 163, 487, 95, 226, 443, 444, 164, 165, + 364, 166, 167 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const unsigned char yydefact[] = -{ - 146, 0, 43, 132, 1, 131, 178, 36, 37, 38, - 39, 40, 41, 42, 0, 44, 202, 128, 129, 202, - 157, 158, 0, 0, 0, 43, 0, 134, 175, 0, - 0, 45, 46, 47, 48, 49, 50, 0, 0, 203, - 199, 35, 172, 173, 174, 198, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 34, 176, 177, - 44, 147, 130, 51, 2, 3, 64, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 0, 0, 193, 0, 0, 63, 82, - 67, 194, 83, 169, 170, 171, 243, 201, 0, 0, - 0, 156, 145, 135, 133, 125, 126, 0, 0, 0, - 0, 179, 84, 0, 0, 66, 89, 91, 0, 0, - 96, 90, 242, 0, 223, 0, 0, 0, 0, 44, - 211, 212, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, - 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 44, 215, 0, 239, - 152, 149, 148, 150, 151, 155, 0, 140, 142, 138, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 0, 0, 0, 0, 136, 0, 0, 0, 88, - 167, 95, 93, 0, 0, 227, 222, 205, 204, 0, - 0, 25, 29, 24, 28, 23, 27, 22, 26, 30, - 31, 0, 0, 54, 54, 248, 0, 0, 237, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 153, 59, 59, 59, 110, - 111, 4, 5, 108, 109, 112, 107, 103, 104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 106, 105, 59, 65, 65, 92, 166, - 160, 163, 164, 0, 0, 85, 182, 183, 184, 189, - 185, 186, 187, 188, 180, 0, 191, 196, 195, 197, - 0, 206, 0, 0, 0, 244, 0, 246, 241, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 154, 0, 141, 143, - 139, 0, 0, 0, 0, 0, 0, 98, 124, 0, - 0, 102, 0, 99, 0, 0, 0, 0, 137, 86, - 87, 159, 161, 0, 57, 94, 181, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 251, 0, 0, 229, - 0, 231, 234, 0, 0, 232, 233, 0, 0, 0, - 228, 0, 249, 0, 0, 0, 61, 59, 241, 0, - 0, 0, 0, 0, 0, 97, 100, 101, 0, 0, - 0, 0, 165, 162, 58, 52, 0, 190, 0, 0, - 221, 54, 55, 54, 218, 240, 0, 0, 0, 0, - 0, 224, 225, 226, 221, 0, 56, 62, 60, 0, - 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, - 0, 168, 0, 0, 0, 220, 0, 0, 245, 247, - 0, 0, 0, 230, 235, 236, 0, 250, 114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 192, - 0, 0, 0, 219, 216, 0, 238, 113, 0, 120, - 0, 0, 116, 117, 118, 119, 0, 209, 0, 0, - 0, 217, 0, 0, 0, 207, 0, 208, 0, 0, - 115, 121, 122, 0, 0, 0, 0, 0, 0, 214, - 0, 0, 213, 210 +static const short yypact[] = {-32768, + 194, 602,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, -20, 38, 59,-32768,-32768, -18,-32768,-32768, 13, + -8, 75, 115, 58,-32768, 40, 124, 163,-32768,-32768, +-32768,-32768,-32768,-32768, 1052, -22,-32768,-32768, -3,-32768, +-32768,-32768,-32768, 60, 65, 67,-32768, 57, 124, 1052, + 62, 62, 62, 62,-32768,-32768,-32768, 38,-32768,-32768, +-32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 167, 172, + 173, 569,-32768, -3, 68,-32768,-32768, -30,-32768,-32768, +-32768,-32768,-32768, 1223,-32768, 159, 42, 180, 162,-32768, +-32768,-32768,-32768,-32768, 1093, 1093, 1093, 1134,-32768,-32768, + 73, 74,-32768,-32768, -30, -75, 78, 847,-32768,-32768, + 1093,-32768, 132, 1175, 14, 185, 38,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 1093, 1093, 1093, 1093, 1093, 1093, 1093, +-32768,-32768, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + 1093, 1093,-32768, 38,-32768, 22,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, -47,-32768,-32768,-32768, 111, 137, 199, + 140, 203, 142, 204, 147, 205, 210, 211, 151, 206, + 213, 412,-32768, 1093, 1093, 1093,-32768, 888,-32768, 103, + 110, 635,-32768,-32768, 61,-32768, 635, 635,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 635, 1052, + 114, 117,-32768, 635, 134, 118, 188, 119, 139, 141, + 144, 145, 146, 148, 635, 635, 635, 149, 1052, 1093, + 1093, 225,-32768, 150, 150, 150,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 152, 153, 154, 157, + 158, 175, 929, 1134, 589, 227, 176, 178, 179, 182, +-32768,-32768, 150, -51, -72, -30,-32768, -3,-32768, 161, + 183, 970,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 197, 1134,-32768,-32768,-32768,-32768, 164,-32768, 187, + 635, -4,-32768, 3,-32768, 189, 635, 171, 1093, 1093, + 1093, 1093, 1093, 1093, 1093, 1093, 193, 195, 200, 1093, + 635, 635, 201,-32768, -17,-32768,-32768,-32768, 1134, 1134, + 1134, 1134, 1134, 1134,-32768,-32768, -16, -26,-32768, -73, +-32768, 1134, 1134, 1134, 1134,-32768,-32768,-32768,-32768,-32768, + 1011, 228,-32768,-32768, 237, -25, 270, 273, 186, 635, + 299, 635, 1093,-32768, 214, 635,-32768, 215,-32768,-32768, + 216, 217,-32768,-32768, 635, 635, 635,-32768, 202,-32768, + 1093, 282, 304,-32768, 150, 189, 276, 218, 224, 229, + 230, 1134,-32768,-32768,-32768, 231, 232, 233, 234,-32768, +-32768,-32768, 257, 238,-32768, 635, 635, 1093, 239,-32768, + 239,-32768, 241, 635, 244, 1093, 1093, 1093,-32768,-32768, +-32768, 1093, 635,-32768,-32768,-32768, 242, 1093, 1134, 1134, + 1134, 1134,-32768, 1134, 1134, 1134, 1134, 311,-32768, 331, + 247, 245, 241, 248, 300,-32768,-32768, 1093, 246, 635, +-32768,-32768,-32768, 252,-32768,-32768, 254, 258, 260, 261, + 265, 263, 268, 272, 277,-32768,-32768, 348, 16, 341, +-32768,-32768, 275,-32768,-32768, 1134,-32768, 1134, 1134,-32768, +-32768,-32768,-32768, 635,-32768, 738, 63, 367,-32768, 279, + 280, 284,-32768, 285,-32768, 738, 635,-32768,-32768,-32768, + 376, 289, 324, 635, 379, 380,-32768, 635, 635,-32768, +-32768, 402, 403,-32768 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const short int yydefgoto[] = -{ - -1, 85, 253, 269, 270, 271, 272, 191, 192, 221, - 193, 25, 15, 37, 441, 305, 386, 405, 328, 387, - 86, 87, 194, 89, 90, 118, 203, 338, 296, 339, - 107, 1, 2, 3, 275, 248, 246, 247, 62, 173, - 49, 102, 176, 91, 352, 281, 282, 283, 38, 95, - 16, 44, 17, 60, 18, 28, 357, 297, 92, 299, - 414, 19, 40, 41, 165, 489, 97, 228, 445, 446, - 166, 167, 366, 168, 169 +static const short yypgoto[] = {-32768, +-32768, 310, 312, 313, 314, -125, -124, -449,-32768, 366, + 386, -103,-32768, -219, 69,-32768, -236,-32768, -46,-32768, + -35,-32768, -66, 292,-32768, -100, 219, -251, 80,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 363,-32768,-32768,-32768, +-32768, 4,-32768, 71,-32768,-32768, 356,-32768,-32768,-32768, +-32768,-32768, 413,-32768,-32768, -447, -55, 64, -99,-32768, + 399,-32768,-32768,-32768,-32768,-32768, 56, -2,-32768,-32768, + 37,-32768,-32768 }; -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -428 -static const short int yypact[] = -{ - -428, 45, 194, 602, -428, -428, -428, -428, -428, -428, - -428, -428, -428, -428, 26, 14, 85, -428, -428, -13, - -428, -428, 91, 28, 90, 49, 33, -428, 21, 155, - 158, -428, -428, -428, -428, -428, -428, 1052, -20, -428, - -428, 80, -428, -428, -428, -428, 75, 76, 79, -428, - 73, 155, 1052, 84, 84, 84, 84, -428, -428, -428, - 14, -428, -428, -428, -428, -428, 77, -428, -428, -428, - -428, -428, -428, -428, -428, -428, -428, -428, -428, -428, - -428, 185, 187, 191, 569, -428, 80, 86, -428, -428, - -44, -428, -428, -428, -428, -428, 1223, -428, 175, 78, - 192, 176, -428, -428, -428, -428, -428, 1093, 1093, 1093, - 1134, -428, -428, 87, 88, -428, -428, -44, -95, 92, - 847, -428, -428, 1093, -428, 139, 1175, 52, 144, 14, - -428, -428, -428, -428, -428, -428, -428, -428, -428, -428, - -428, -428, -428, -428, -428, -428, 1093, 1093, 1093, 1093, - 1093, 1093, 1093, -428, -428, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1093, 1093, 1093, -428, 14, -428, 44, -428, - -428, -428, -428, -428, -428, -428, -12, -428, -428, -428, - 138, 164, 203, 167, 204, 169, 205, 172, 206, 210, - 211, 174, 208, 213, 412, -428, 1093, 1093, 1093, -428, - 888, -428, 113, 111, 635, -428, -428, 77, -428, 635, - 635, -428, -428, -428, -428, -428, -428, -428, -428, -428, - -428, 635, 1052, 115, 117, -428, 635, 114, 119, 212, - 140, 141, 142, 145, 146, 148, 149, 635, 635, 635, - 150, 1052, 1093, 1093, 223, -428, 151, 151, 151, -428, - -428, -428, -428, -428, -428, -428, -428, -428, -428, 152, - 153, 154, 157, 159, 162, 929, 1134, 589, 229, 173, - 178, 179, 180, -428, -428, 151, -15, 15, -44, -428, - 80, -428, 160, 181, 970, -428, -428, -428, -428, -428, - -428, -428, -428, -428, 198, 1134, -428, -428, -428, -428, - 177, -428, 186, 635, -4, -428, 3, -428, 188, 635, - 183, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 189, - 193, 195, 1093, 635, 635, 197, -428, -11, -428, -428, - -428, 1134, 1134, 1134, 1134, 1134, 1134, -428, -428, -8, - -96, -428, -45, -428, 1134, 1134, 1134, 1134, -428, -428, - -428, -428, -428, 1011, 228, -428, -428, 263, -32, 273, - 282, 199, 635, 304, 635, 1093, -428, 200, 635, -428, - 214, -428, -428, 215, 216, -428, -428, 635, 635, 635, - -428, 201, -428, 1093, 289, 310, -428, 151, 188, 279, - 217, 218, 224, 230, 1134, -428, -428, -428, 231, 232, - 233, 234, -428, -428, -428, 281, 238, -428, 635, 635, - 1093, 239, -428, 239, -428, 241, 635, 244, 1093, 1093, - 1093, -428, -428, -428, 1093, 635, -428, -428, -428, 242, - 1093, 1134, 1134, 1134, 1134, -428, 1134, 1134, 1134, 1134, - 351, -428, 332, 248, 245, 241, 249, 303, -428, -428, - 1093, 251, 635, -428, -428, -428, 252, -428, -428, 255, - 260, 258, 265, 266, 268, 272, 276, 277, -428, -428, - 356, 16, 336, -428, -428, 275, -428, -428, 1134, -428, - 1134, 1134, -428, -428, -428, -428, 635, -428, 738, 25, - 370, -428, 280, 284, 285, -428, 290, -428, 738, 635, - -428, -428, -428, 373, 291, 323, 635, 380, 381, -428, - 635, 635, -428, -428 -}; -/* YYPGOTO[NTERM-NUM]. */ -static const short int yypgoto[] = -{ - -428, -428, -428, 307, 308, 309, 311, -127, -126, -427, - -428, 365, 383, -117, -428, -221, 55, -428, -241, -428, - -48, -428, -37, -428, -68, 292, -428, -102, 220, -247, - 94, -428, -428, -428, -428, -428, -428, -428, 359, -428, - -428, -428, -428, 2, -428, 58, -428, -428, 355, -428, - -428, -428, -428, -428, 413, -428, -428, -423, -57, 62, - -101, -428, 400, -428, -428, -428, -428, -428, 56, -2, - -428, -428, 32, -428, -428 -}; +#define YYLAST 1330 -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -128 -static const short int yytable[] = -{ - 88, 219, 220, 307, 104, 26, 329, 330, 195, 93, - 39, 362, 222, 394, 198, 88, 117, 42, 364, 340, - 342, 396, 205, 384, 199, 208, 211, 212, 213, 214, - 215, 216, 217, 218, 348, 211, 212, 213, 214, 215, - 216, 217, 218, 26, 488, 4, 385, 225, 358, 241, - 229, 230, 117, 363, 231, 232, 233, 234, 235, 236, - 363, 209, 498, 240, 394, 496, 58, -65, 59, 52, - 177, 178, 179, 210, 397, 504, 121, 394, 30, 31, - 32, 33, 34, 35, 36, 407, 204, 29, 119, 204, - 7, 8, 9, 10, 53, 12, 54, 244, 94, 55, - 349, 394, 20, 245, 21, 121, 43, 395, 39, 223, - 224, 204, 226, 227, 204, 204, 105, 106, 204, 204, - 204, 204, 204, 204, 237, 238, 239, 204, 276, 277, - 278, 487, 350, 171, 172, 121, 50, 274, 242, 243, - 497, 57, 325, 46, 47, 48, 428, 298, 108, 109, - 110, 51, 298, 298, 211, 212, 213, 214, 215, 216, - 217, 218, 63, 280, 298, 249, 250, -25, -25, 298, - -24, -24, -23, -23, 303, -22, -22, 251, 252, 61, - 298, 298, 298, 98, 99, 88, 101, 100, -66, 112, - 448, 113, 449, 323, -127, 114, 174, 120, 206, 170, - 175, 196, 197, 200, 88, 324, 204, -29, -28, -27, - -26, 370, 254, 372, 373, 374, 278, -32, -33, 5, - 255, 380, 284, 285, 304, 6, 306, 309, 310, 388, - 389, 390, 391, 392, 393, 7, 8, 9, 10, 11, - 12, 13, 398, 399, 400, 401, 298, 326, 311, 312, - 313, 314, 298, 343, 315, 316, 14, 317, 318, 322, - 327, 356, 384, 331, 332, 333, 298, 298, 334, 353, - 335, 300, 301, 336, 369, 204, 371, 204, 204, 204, - 375, 376, 351, 302, 344, 204, 359, 406, 308, 345, - 346, 347, 435, 354, 408, 360, 368, 365, 377, 319, - 320, 321, 378, 409, 379, 298, 383, 298, 412, 416, - 410, 298, 424, 426, 427, 430, 280, 453, 454, 455, - 298, 298, 298, 418, 419, 420, 431, 432, 204, 460, - 461, 462, 463, 433, 464, 465, 466, 467, 440, 434, - 436, 437, 438, 439, 219, 220, 425, 442, 447, 473, - 450, 298, 298, 452, 458, 468, 469, 470, 471, 298, - 363, 472, 219, 220, 476, 361, 474, 477, 298, 478, - 479, 367, 490, 204, 480, 481, 492, 486, 493, 494, - 482, 204, 204, 204, 483, 381, 382, 204, 484, 485, - 491, 499, 500, 459, 506, 298, 501, 502, 508, 503, - 507, 510, 511, 161, 162, 163, 96, 164, 56, 404, - 103, 403, 202, 204, 273, 111, 27, 64, 65, 45, - 429, 415, 456, 0, 411, 0, 413, 0, 0, 298, - 417, 0, 0, 0, 20, 0, 21, 0, 256, 421, - 422, 423, 298, 0, 0, 0, 0, 0, 0, 298, - 257, 258, 0, 298, 298, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 443, 444, 0, 0, 0, 0, 0, 0, 451, 0, - 0, 0, 0, 0, 0, 0, 0, 457, 0, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 0, 0, 0, 0, 0, 259, 0, - 260, 261, 153, 154, 475, 262, 263, 264, 0, 0, - 0, 0, 0, 0, 0, 265, 0, 0, 266, 0, - 267, 0, 0, 268, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 505, 0, 0, 0, 0, 0, 0, 509, 0, - 0, 0, 512, 513, 64, 65, 0, 115, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 20, 0, 21, 64, 65, 0, 115, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 78, - 79, 20, 0, 21, 0, 0, 0, 80, 0, 0, - 0, 0, -35, 0, 20, 0, 21, 0, 0, 0, - 0, 0, 0, 6, -35, -35, 0, 80, 286, 287, - 64, 65, 288, -35, -35, -35, -35, -35, -35, -35, - 0, 0, -35, 22, 0, 0, 0, 20, 0, 21, - 23, 289, 290, 291, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 292, 293, 0, 0, 0, 0, 81, - 0, 0, 82, 0, 0, 83, 0, 84, 116, 0, - 0, 0, 0, 0, 0, 0, 294, 0, 0, 81, - 0, 0, 82, 0, 0, 83, 0, 84, 341, 0, - 0, 0, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 0, 0, 0, 0, - 0, 259, 0, 260, 261, 153, 154, 0, 262, 263, - 264, 286, 287, 0, 0, 288, 0, 0, 0, 0, - 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 292, 293, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, - 0, 0, 0, 0, 259, 0, 260, 261, 153, 154, - 0, 262, 263, 264, 0, 0, 0, 0, 0, 0, - 0, 0, 64, 65, 295, 115, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 20, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 65, 80, 115, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, - 0, 0, 0, 0, 64, 65, 80, 115, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 78, - 79, 20, 0, 21, 0, 0, 0, 81, 0, 0, - 82, 0, 0, 83, 0, 84, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 64, 65, 80, 115, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 20, 0, 21, 0, 0, 0, 81, 0, - 0, 82, 0, 0, 83, 0, 84, 355, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 65, 80, 115, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 20, 0, 21, 0, 0, 0, 81, - 0, 0, 82, 0, 337, 83, 0, 84, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 65, 80, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 20, 0, 21, 0, 0, 0, - 81, 0, 0, 82, 0, 0, 83, 0, 84, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, - 80, 115, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 20, 0, 21, 0, 0, - 0, 81, 0, 0, 82, 0, 0, 83, 0, 84, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 65, 80, 115, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 78, 79, 20, 0, 21, 0, - 0, 0, 81, 0, 0, 82, 0, 0, 83, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64, 65, 80, 207, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 20, 0, 21, - 0, 0, 0, 81, 0, 0, 82, 0, 0, 83, - 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 0, 0, 82, 0, 0, - 83, 0, 84, 0, 0, 0, 0, 0, 122, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 124, 125, 0, 81, 0, 0, 82, 0, - 0, 83, 0, 84, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 0, 0, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160 -}; -static const short int yycheck[] = -{ - 37, 128, 128, 224, 52, 3, 247, 248, 110, 29, - 23, 15, 129, 109, 109, 52, 84, 30, 15, 266, - 267, 117, 123, 34, 119, 126, 10, 11, 12, 13, - 14, 15, 16, 17, 275, 10, 11, 12, 13, 14, - 15, 16, 17, 41, 471, 0, 57, 148, 295, 166, - 151, 152, 120, 57, 155, 156, 157, 158, 159, 160, - 57, 9, 489, 164, 109, 488, 45, 111, 47, 20, - 107, 108, 109, 21, 119, 498, 120, 109, 64, 65, - 66, 67, 68, 69, 70, 117, 123, 61, 86, 126, - 41, 42, 43, 44, 45, 46, 47, 109, 118, 50, - 115, 109, 22, 115, 24, 120, 119, 115, 23, 146, - 147, 148, 149, 150, 151, 152, 32, 33, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 196, 197, - 198, 115, 117, 55, 56, 120, 108, 194, 94, 95, - 115, 108, 243, 52, 53, 54, 387, 204, 54, 55, - 56, 61, 209, 210, 10, 11, 12, 13, 14, 15, - 16, 17, 4, 200, 221, 27, 28, 3, 4, 226, - 3, 4, 3, 4, 222, 3, 4, 3, 4, 24, - 237, 238, 239, 108, 108, 222, 113, 108, 111, 4, - 411, 4, 413, 241, 0, 4, 4, 111, 59, 24, - 24, 114, 114, 111, 241, 242, 243, 4, 4, 4, - 4, 312, 4, 314, 315, 316, 284, 7, 7, 25, - 7, 322, 109, 112, 109, 31, 109, 113, 109, 331, - 332, 333, 334, 335, 336, 41, 42, 43, 44, 45, - 46, 47, 344, 345, 346, 347, 303, 24, 36, 109, - 109, 109, 309, 24, 109, 109, 62, 109, 109, 109, - 109, 63, 34, 111, 111, 111, 323, 324, 111, 109, - 111, 209, 210, 111, 311, 312, 313, 314, 315, 316, - 317, 318, 280, 221, 111, 322, 109, 24, 226, 111, - 111, 111, 394, 112, 21, 109, 113, 109, 109, 237, - 238, 239, 109, 21, 109, 362, 109, 364, 4, 109, - 111, 368, 111, 24, 4, 36, 353, 418, 419, 420, - 377, 378, 379, 109, 109, 109, 109, 109, 365, 431, - 432, 433, 434, 109, 436, 437, 438, 439, 57, 109, - 109, 109, 109, 109, 471, 471, 383, 109, 109, 450, - 109, 408, 409, 109, 112, 4, 24, 109, 113, 416, - 57, 112, 489, 489, 112, 303, 115, 112, 425, 109, - 112, 309, 36, 410, 109, 109, 478, 21, 480, 481, - 112, 418, 419, 420, 112, 323, 324, 424, 112, 112, - 115, 21, 112, 430, 21, 452, 112, 112, 75, 109, - 109, 21, 21, 96, 96, 96, 41, 96, 25, 354, - 51, 353, 120, 450, 194, 60, 3, 5, 6, 19, - 388, 365, 424, -1, 362, -1, 364, -1, -1, 486, - 368, -1, -1, -1, 22, -1, 24, -1, 26, 377, - 378, 379, 499, -1, -1, -1, -1, -1, -1, 506, - 38, 39, -1, 510, 511, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 408, 409, -1, -1, -1, -1, -1, -1, 416, -1, - -1, -1, -1, -1, -1, -1, -1, 425, -1, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, -1, -1, -1, -1, -1, 96, -1, - 98, 99, 100, 101, 452, 103, 104, 105, -1, -1, - -1, -1, -1, -1, -1, 113, -1, -1, 116, -1, - 118, -1, -1, 121, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 486, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 499, -1, -1, -1, -1, -1, -1, 506, -1, - -1, -1, 510, 511, 5, 6, -1, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, -1, 24, 5, 6, -1, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, -1, 24, -1, -1, -1, 48, -1, -1, - -1, -1, 20, -1, 22, -1, 24, -1, -1, -1, - -1, -1, -1, 31, 32, 33, -1, 48, 3, 4, - 5, 6, 7, 41, 42, 43, 44, 45, 46, 47, - -1, -1, 50, 51, -1, -1, -1, 22, -1, 24, - 58, 26, 27, 28, 62, -1, -1, -1, -1, -1, - -1, -1, -1, 38, 39, -1, -1, -1, -1, 110, - -1, -1, 113, -1, -1, 116, -1, 118, 119, -1, - -1, -1, -1, -1, -1, -1, 61, -1, -1, 110, - -1, -1, 113, -1, -1, 116, -1, 118, 119, -1, - -1, -1, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, -1, 98, 99, 100, 101, -1, 103, 104, - 105, 3, 4, -1, -1, 7, -1, -1, -1, -1, - -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 26, 27, 28, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 38, 39, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, -1, - -1, -1, -1, -1, 96, -1, 98, 99, 100, 101, - -1, 103, 104, 105, -1, -1, -1, -1, -1, -1, - -1, -1, 5, 6, 116, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, - -1, -1, -1, 5, 6, 48, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, -1, -1, -1, 5, 6, 48, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, -1, 24, -1, -1, -1, 110, -1, -1, - 113, -1, -1, 116, -1, 118, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 5, 6, 48, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, 110, -1, - -1, 113, -1, -1, 116, -1, 118, 37, -1, -1, - -1, -1, -1, -1, -1, -1, 5, 6, 48, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, 110, - -1, -1, 113, -1, 115, 116, -1, 118, 37, -1, - -1, -1, -1, -1, -1, -1, -1, 5, 6, 48, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, - 110, -1, -1, 113, -1, -1, 116, -1, 118, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, - 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, - -1, 110, -1, -1, 113, -1, -1, 116, -1, 118, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, - 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, - -1, -1, 110, -1, -1, 113, -1, -1, 116, -1, - 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 5, 6, 48, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, -1, 110, -1, -1, 113, -1, -1, 116, - -1, 118, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 110, -1, -1, 113, -1, -1, - 116, -1, 118, -1, -1, -1, -1, -1, 35, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, 60, -1, 110, -1, -1, 113, -1, - -1, 116, -1, 118, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, -1, -1, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107 +static const short yytable[] = { 86, + 217, 218, 305, 102, 37, 24, 91, 193, 327, 328, + 360, 40, 338, 340, 86, 115, 382, 362, 18, 486, + 19, 203, 207, 220, 206, 209, 210, 211, 212, 213, + 214, 215, 216, 196, 208, 392, 346, 496, 494, 383, + 27, 356, 24, 197, 348, 395, 223, 119, 502, 227, + 228, 115, 361, 229, 230, 231, 232, 233, 234, 361, + 239, 242, 238, 347, 44, 45, 46, 243, 119, 175, + 176, 177, 209, 210, 211, 212, 213, 214, 215, 216, + -64, 37, 392, 392, 56, 202, 57, 117, 202, 119, + 394, 405, 392, 103, 104, 92, 169, 170, 393, 48, + 41, 28, 29, 30, 31, 32, 33, 34, 221, 222, + 202, 224, 225, 202, 202, 240, 241, 202, 202, 202, + 202, 202, 202, 235, 236, 237, 202, 274, 275, 276, + 485, 106, 107, 108, 50, 49, 272, 247, 248, -24, + -24, 323, -23, -23, -22, -22, 296, 59, 426, -21, + -21, 296, 296, 249, 250, 5, 6, 7, 8, 51, + 10, 52, 278, 296, 53, 55, 61, 96, 296, 99, + 110, -65, 97, 301, 98, 111, 112, 495, 118, 296, + 296, 296, 168, 172, 86, 173, 194, 195, 198, 446, + 204, 447, 321, -126, 209, 210, 211, 212, 213, 214, + 215, 216, -28, 86, 322, 202, -27, -26, -25, 252, + 368, 282, 370, 371, 372, 276, -31, -32, 3, 253, + 378, 283, 302, 309, 4, 304, 308, 310, 386, 387, + 388, 389, 390, 391, 5, 6, 7, 8, 9, 10, + 11, 396, 397, 398, 399, 296, 307, 311, 324, 312, + 341, 296, 313, 314, 315, 12, 316, 320, 325, 354, + 404, 382, 329, 330, 331, 296, 296, 332, 333, 351, + 298, 299, 357, 367, 202, 369, 202, 202, 202, 373, + 374, 349, 300, 366, 202, 334, 342, 306, 343, 344, + 406, 433, 345, 407, 352, 358, 408, 363, 317, 318, + 319, 375, 410, 376, 296, 424, 296, 425, 377, 381, + 296, 428, 422, 438, 466, 278, 451, 452, 453, 296, + 296, 296, 414, 416, 417, 418, 429, 202, 458, 459, + 460, 461, 430, 462, 463, 464, 465, 431, 432, 434, + 435, 436, 437, 217, 218, 423, 440, 445, 471, 448, + 296, 296, 450, 456, 467, 468, 361, 469, 296, 470, + 472, 217, 218, 474, 359, 475, 476, 296, 484, 478, + 365, 477, 202, 479, 480, 490, 488, 491, 492, 481, + 202, 202, 202, 482, 379, 380, 202, 497, 483, 489, + 498, 499, 457, 501, 296, 500, 504, 505, 506, 508, + 509, 513, 514, 159, 94, 160, 161, 162, 54, 200, + 271, 101, 202, 109, 25, 43, 62, 63, 413, 454, + 402, 401, 427, 409, 0, 411, 0, 0, 296, 415, + 0, 0, 0, 18, 0, 19, 0, 254, 419, 420, + 421, 296, 0, 0, 0, 0, 0, 0, 296, 255, + 256, 0, 296, 296, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, + 442, 0, 0, 0, 0, 0, 0, 449, 0, 0, + 0, 0, 0, 0, 0, 0, 455, 0, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 0, 0, 0, 0, 0, 257, 0, 258, + 259, 151, 152, 473, 260, 261, 262, 0, 0, 0, + 0, 0, 0, 0, 263, 0, 0, 264, 0, 265, + 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 503, 0, 0, 0, 0, 0, 0, 507, 0, 0, + 0, 510, 511, 62, 63, 0, 113, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 18, 0, 19, 62, 63, 0, 113, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 76, 77, + 18, 0, 19, 0, 0, 0, 78, 0, 0, 0, + 0, -34, 0, 18, 0, 19, 0, 0, 0, 0, + 0, 0, 4, -34, -34, 0, 78, 284, 285, 62, + 63, 286, -34, -34, -34, -34, -34, -34, -34, 0, + 0, -34, 20, 0, 0, 0, 18, 0, 19, 21, + 287, 288, 289, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 290, 291, 0, 0, 0, 0, 79, 0, + 0, 80, 0, 0, 81, 0, 82, 114, 0, 0, + 0, 0, 0, 0, 0, 292, 0, 0, 79, 0, + 0, 80, 0, 0, 81, 0, 82, 339, 0, 0, + 0, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 257, 0, 258, 259, 151, 152, 0, 260, 261, 262, + 284, 285, 0, 0, 286, 0, 0, 0, 0, 0, + 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 288, 289, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 290, 291, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 0, 0, + 0, 0, 0, 257, 0, 258, 259, 151, 152, 0, + 260, 261, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 62, 63, 293, 113, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 18, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, + 0, 0, 62, 63, 78, 113, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 18, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, + 0, 0, 0, 62, 63, 78, 113, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 76, 77, + 18, 0, 19, 0, 0, 0, 79, 0, 0, 80, + 0, 0, 81, 0, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 63, 78, 113, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 18, 0, 19, 0, 0, 0, 79, 0, 0, + 80, 0, 0, 81, 0, 82, 353, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 63, 78, 113, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 18, 0, 19, 0, 0, 0, 79, 0, + 0, 80, 0, 335, 81, 0, 82, 400, 0, 0, + 0, 0, 0, 0, 0, 0, 62, 63, 78, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 18, 0, 19, 0, 0, 0, 79, + 0, 0, 80, 0, 0, 81, 0, 82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 63, 78, + 113, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 18, 0, 19, 0, 0, 0, + 79, 0, 0, 80, 0, 0, 81, 0, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, + 78, 113, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 76, 77, 18, 0, 19, 0, 0, + 0, 79, 0, 0, 80, 0, 0, 81, 0, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 63, 78, 205, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 18, 0, 19, 0, + 0, 0, 79, 0, 0, 80, 0, 0, 81, 0, + 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 79, 0, 0, 80, 0, 0, 81, + 0, 82, 0, 0, 0, 0, 0, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 122, 123, 0, 79, 0, 0, 80, 0, 0, + 81, 0, 82, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 0, 0, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const unsigned char yystos[] = -{ - 0, 153, 154, 155, 0, 25, 31, 41, 42, 43, - 44, 45, 46, 47, 62, 134, 172, 174, 176, 183, - 22, 24, 51, 58, 62, 133, 165, 176, 177, 61, - 64, 65, 66, 67, 68, 69, 70, 135, 170, 23, - 184, 185, 30, 119, 173, 184, 52, 53, 54, 162, - 108, 61, 20, 45, 47, 50, 134, 108, 45, 47, - 175, 24, 160, 4, 5, 6, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 48, 110, 113, 116, 118, 123, 142, 143, 144, 145, - 146, 165, 180, 29, 118, 171, 133, 188, 108, 108, - 108, 113, 163, 160, 142, 32, 33, 152, 152, 152, - 152, 170, 4, 4, 4, 8, 119, 146, 147, 165, - 111, 120, 35, 49, 59, 60, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 125, 126, 127, 128, 186, 192, 193, 195, 196, - 24, 55, 56, 161, 4, 24, 164, 144, 144, 144, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 129, 130, 132, 144, 149, 114, 114, 109, 119, - 111, 37, 147, 148, 144, 182, 59, 8, 182, 9, - 21, 10, 11, 12, 13, 14, 15, 16, 17, 129, - 130, 131, 135, 144, 144, 182, 144, 144, 189, 182, - 182, 182, 182, 182, 182, 182, 182, 144, 144, 144, - 182, 135, 94, 95, 109, 115, 158, 159, 157, 27, - 28, 3, 4, 124, 4, 7, 26, 38, 39, 96, - 98, 99, 103, 104, 105, 113, 116, 118, 121, 125, - 126, 127, 128, 150, 180, 156, 146, 146, 146, 37, - 144, 167, 168, 169, 109, 112, 3, 4, 7, 26, - 27, 28, 38, 39, 61, 116, 150, 179, 180, 181, - 181, 181, 181, 142, 109, 137, 109, 137, 181, 113, - 109, 36, 109, 109, 109, 109, 109, 109, 109, 181, - 181, 181, 109, 142, 144, 182, 24, 109, 140, 140, - 140, 111, 111, 111, 111, 111, 111, 115, 149, 151, - 151, 119, 151, 24, 111, 111, 111, 111, 140, 115, - 117, 165, 166, 109, 112, 37, 63, 178, 151, 109, - 109, 181, 15, 57, 15, 109, 194, 181, 113, 144, - 182, 144, 182, 182, 182, 144, 144, 109, 109, 109, - 182, 181, 181, 109, 34, 57, 138, 141, 149, 149, - 149, 149, 149, 149, 109, 115, 117, 119, 149, 149, - 149, 149, 37, 167, 138, 139, 24, 117, 21, 21, - 111, 181, 4, 181, 182, 190, 109, 181, 109, 109, - 109, 181, 181, 181, 111, 144, 24, 4, 140, 194, - 36, 109, 109, 109, 109, 149, 109, 109, 109, 109, - 57, 136, 109, 181, 181, 190, 191, 109, 137, 137, - 109, 181, 109, 182, 182, 182, 191, 181, 112, 144, - 149, 149, 149, 149, 149, 149, 149, 149, 4, 24, - 109, 113, 112, 182, 115, 181, 112, 112, 109, 112, - 109, 109, 112, 112, 112, 112, 21, 115, 131, 187, - 36, 115, 149, 149, 149, 181, 179, 115, 131, 21, - 112, 112, 112, 109, 179, 181, 21, 109, 75, 181, - 21, 21, 181, 181 +static const short yycheck[] = { 35, + 126, 126, 222, 50, 23, 2, 29, 108, 245, 246, + 15, 30, 264, 265, 50, 82, 34, 15, 22, 469, + 24, 121, 9, 127, 124, 10, 11, 12, 13, 14, + 15, 16, 17, 109, 21, 109, 273, 487, 486, 57, + 61, 293, 39, 119, 117, 119, 146, 120, 496, 149, + 150, 118, 57, 153, 154, 155, 156, 157, 158, 57, + 164, 109, 162, 115, 52, 53, 54, 115, 120, 105, + 106, 107, 10, 11, 12, 13, 14, 15, 16, 17, + 111, 23, 109, 109, 45, 121, 47, 84, 124, 120, + 117, 117, 109, 32, 33, 118, 55, 56, 115, 108, + 119, 64, 65, 66, 67, 68, 69, 70, 144, 145, + 146, 147, 148, 149, 150, 94, 95, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 194, 195, 196, + 115, 52, 53, 54, 20, 61, 192, 27, 28, 3, + 4, 241, 3, 4, 3, 4, 202, 24, 385, 3, + 4, 207, 208, 3, 4, 41, 42, 43, 44, 45, + 46, 47, 198, 219, 50, 108, 4, 108, 224, 113, + 4, 111, 108, 220, 108, 4, 4, 115, 111, 235, + 236, 237, 24, 4, 220, 24, 114, 114, 111, 409, + 59, 411, 239, 0, 10, 11, 12, 13, 14, 15, + 16, 17, 4, 239, 240, 241, 4, 4, 4, 4, + 310, 109, 312, 313, 314, 282, 7, 7, 25, 7, + 320, 112, 109, 36, 31, 109, 109, 109, 329, 330, + 331, 332, 333, 334, 41, 42, 43, 44, 45, 46, + 47, 342, 343, 344, 345, 301, 113, 109, 24, 109, + 24, 307, 109, 109, 109, 62, 109, 109, 109, 63, + 24, 34, 111, 111, 111, 321, 322, 111, 111, 109, + 207, 208, 109, 309, 310, 311, 312, 313, 314, 315, + 316, 278, 219, 113, 320, 111, 111, 224, 111, 111, + 21, 392, 111, 21, 112, 109, 111, 109, 235, 236, + 237, 109, 4, 109, 360, 24, 362, 4, 109, 109, + 366, 36, 111, 57, 4, 351, 416, 417, 418, 375, + 376, 377, 109, 109, 109, 109, 109, 363, 429, 430, + 431, 432, 109, 434, 435, 436, 437, 109, 109, 109, + 109, 109, 109, 469, 469, 381, 109, 109, 448, 109, + 406, 407, 109, 112, 24, 109, 57, 113, 414, 112, + 115, 487, 487, 112, 301, 112, 109, 423, 21, 109, + 307, 112, 408, 109, 112, 476, 36, 478, 479, 112, + 416, 417, 418, 112, 321, 322, 422, 21, 112, 115, + 112, 112, 428, 109, 450, 112, 21, 109, 75, 21, + 21, 0, 0, 94, 39, 94, 94, 94, 23, 118, + 192, 49, 448, 58, 2, 17, 5, 6, 363, 422, + 352, 351, 386, 360, -1, 362, -1, -1, 484, 366, + -1, -1, -1, 22, -1, 24, -1, 26, 375, 376, + 377, 497, -1, -1, -1, -1, -1, -1, 504, 38, + 39, -1, 508, 509, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 406, + 407, -1, -1, -1, -1, -1, -1, 414, -1, -1, + -1, -1, -1, -1, -1, -1, 423, -1, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, -1, -1, -1, -1, -1, 96, -1, 98, + 99, 100, 101, 450, 103, 104, 105, -1, -1, -1, + -1, -1, -1, -1, 113, -1, -1, 116, -1, 118, + -1, -1, 121, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 484, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 497, -1, -1, -1, -1, -1, -1, 504, -1, -1, + -1, 508, 509, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, 48, -1, -1, -1, + -1, 20, -1, 22, -1, 24, -1, -1, -1, -1, + -1, -1, 31, 32, 33, -1, 48, 3, 4, 5, + 6, 7, 41, 42, 43, 44, 45, 46, 47, -1, + -1, 50, 51, -1, -1, -1, 22, -1, 24, 58, + 26, 27, 28, 62, -1, -1, -1, -1, -1, -1, + -1, -1, 38, 39, -1, -1, -1, -1, 110, -1, + -1, 113, -1, -1, 116, -1, 118, 119, -1, -1, + -1, -1, -1, -1, -1, 61, -1, -1, 110, -1, + -1, 113, -1, -1, 116, -1, 118, 119, -1, -1, + -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, + 96, -1, 98, 99, 100, 101, -1, 103, 104, 105, + 3, 4, -1, -1, 7, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 27, 28, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, -1, 98, 99, 100, 101, -1, + 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, + -1, 5, 6, 116, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, + 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, + -1, -1, 5, 6, 48, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, -1, 5, 6, 48, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, 110, -1, -1, 113, + -1, -1, 116, -1, 118, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5, 6, 48, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, 110, -1, -1, + 113, -1, -1, 116, -1, 118, 37, -1, -1, -1, + -1, -1, -1, -1, -1, 5, 6, 48, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, -1, 24, -1, -1, -1, 110, -1, + -1, 113, -1, 115, 116, -1, 118, 37, -1, -1, + -1, -1, -1, -1, -1, -1, 5, 6, 48, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, 110, + -1, -1, 113, -1, -1, 116, -1, 118, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5, 6, 48, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + 110, -1, -1, 113, -1, -1, 116, -1, 118, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, + 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + -1, 110, -1, -1, 113, -1, -1, 116, -1, 118, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, + 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, + -1, -1, 110, -1, -1, 113, -1, -1, 116, -1, + 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 110, -1, -1, 113, -1, -1, 116, + -1, 118, -1, -1, -1, -1, -1, 35, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 59, 60, -1, 110, -1, -1, 113, -1, -1, + 116, -1, 118, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, -1, -1, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107 }; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) +#define YYEMPTY -2 #define YYEOF 0 - #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ - #define YYFAIL goto yyerrlab - #define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ +#define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) - #define YYTERROR 1 #define YYERRCODE 256 - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (0) +#ifndef YYPURE +#define YYLEX yylex() #endif - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) #endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - +#else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) +#define YYLEX yylex(&yylval, YYLEX_PARAM) #else -# define YYLEX yylex () +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ #endif -/* Enable debugging if requested. */ -#if YYDEBUG +/* If nonreentrant, generate the variables here */ -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yysymprint (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) +#ifndef YYPURE -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ -#if defined (__STDC__) || defined (__cplusplus) -static void -yy_stack_print (short int *bottom, short int *top) -#else -static void -yy_stack_print (bottom, top) - short int *bottom; - short int *top; +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ #endif -{ - YYFPRINTF (stderr, "Stack now"); - for (/* Nothing. */; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if defined (__STDC__) || defined (__cplusplus) -static void -yy_reduce_print (int yyrule) -#else -static void -yy_reduce_print (yyrule) - int yyrule; +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ #endif -{ - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", - yyrule - 1, yylno); - /* Print the symbols being reduced, and their result. */ - for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) - YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); - YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); -} -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (Rule); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ +/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -# define YYINITDEPTH 200 +#define YYINITDEPTH 200 #endif -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif #ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 +#define YYMAXDEPTH 10000 #endif - +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined (__GLIBC__) && defined (_STRING_H) -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -# if defined (__STDC__) || defined (__cplusplus) -yystrlen (const char *yystr) -# else -yystrlen (yystr) - const char *yystr; -# endif -{ - const char *yys = yystr; - - while (*yys++ != '\0') - continue; - - return yys - yystr - 1; -} -# endif -# endif - -# ifndef yystpcpy -# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -# if defined (__STDC__) || defined (__cplusplus) -yystpcpy (char *yydest, const char *yysrc) -# else -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -# endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; { - if (*yystr == '"') - { - size_t yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } + register char *f = from; + register char *t = to; + register int i = count; - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; + while (i-- > 0) + *t++ = *f++; } -# endif - -#endif /* YYERROR_VERBOSE */ - - -#if YYDEBUG -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +#else /* __cplusplus */ -#if defined (__STDC__) || defined (__cplusplus) -static void -yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) -#else +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -yysymprint (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE *yyvaluep; -#endif +__yy_memcpy (char *to, char *from, unsigned int count) { - /* Pacify ``unused variable'' warnings. */ - (void) yyvaluep; + register char *t = to; + register char *f = from; + register int i = count; - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - switch (yytype) - { - default: - break; - } - YYFPRINTF (yyoutput, ")"); + while (i-- > 0) + *t++ = *f++; } -#endif /* ! YYDEBUG */ -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -#if defined (__STDC__) || defined (__cplusplus) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; #endif -{ - /* Pacify ``unused variable'' warnings. */ - (void) yyvaluep; - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} +#endif +#line 217 "/usr/share/bison.simple" -/* Prevent warnings from -Wmissing-prototypes. */ +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ #ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -int yyparse (void *YYPARSE_PARAM); -# else -int yyparse (); -# endif -#else /* ! YYPARSE_PARAM */ -#if defined (__STDC__) || defined (__cplusplus) -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - - -/* The look-ahead symbol. */ -int yychar; - -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*----------. -| yyparse. | -`----------*/ +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ #ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -int yyparse (void *YYPARSE_PARAM) -# else -int yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -# endif -#else /* ! YYPARSE_PARAM */ -#if defined (__STDC__) || defined (__cplusplus) -int -yyparse (void) +int yyparse (void *); #else -int -yyparse () - +int yyparse (void); #endif #endif -{ - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - short int yyssa[YYINITDEPTH]; - short int *yyss = yyssa; - short int *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; - +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else #define YYPOPSTACK (yyvsp--, yyssp--) +#endif - YYSIZE_T yystacksize = YYINITDEPTH; + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ - /* When reducing, the number of symbols on the RHS of the reduced - rule. */ int yylen; - YYDPRINTF ((stderr, "Starting parse\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif yystate = 0; yyerrstatus = 0; @@ -2764,747 +2119,742 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss; + yyssp = yyss - 1; yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. - */ - yyssp++; - - yysetstate: - *yyssp = yystate; +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif - if (yyss + yystacksize - 1 <= yyssp) - { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + int size = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - short int *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif - yyss = yyss1; - yyvs = yyvs1; - } + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif #else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) + if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; - - { - short int *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif - if (yyss + yystacksize - 1 <= yyssp) + if (yyssp >= yyss + yystacksize - 1) YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: + yybackup: /* Do appropriate processing given the current state. */ -/* Read a look-ahead token if we need one and don't already have one. */ +/* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to look-ahead token. */ + /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yyn == YYFLAG) goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif yychar = YYLEX; } - if (yychar <= YYEOF) + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif } else { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif } - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; + yyn = yytable[yyn]; - if (yyn <= 0) + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) + if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } + else if (yyn == 0) + goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ +/* Do the default action for the current state. */ yydefault: + yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; - goto yyreduce; - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ +/* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: - /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 3: -#line 1097 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX) // Outside of my range! + switch (yyn) { + +case 2: +#line 1097 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! GEN_ERROR("Value too large for type!"); - (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal); + yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; CHECK_FOR_ERROR -;} - break; - - case 5: -#line 1106 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX) // Outside of my range! +; + break;} +case 4: +#line 1106 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! GEN_ERROR("Value too large for type!"); - (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val); + yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; CHECK_FOR_ERROR -;} - break; - - case 34: -#line 1130 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.StrVal) = (yyvsp[-1].StrVal); +; + break;} +case 33: +#line 1130 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.StrVal = yyvsp[-1].StrVal; CHECK_FOR_ERROR - ;} - break; - - case 35: -#line 1134 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.StrVal) = 0; + ; + break;} +case 34: +#line 1134 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.StrVal = 0; CHECK_FOR_ERROR - ;} - break; - - case 36: -#line 1139 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} - break; - - case 37: -#line 1140 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} - break; - - case 38: -#line 1141 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} - break; - - case 39: -#line 1142 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} - break; - - case 40: -#line 1143 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} - break; - - case 41: -#line 1144 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} - break; - - case 42: -#line 1145 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} - break; - - case 43: -#line 1146 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} - break; - - case 44: -#line 1148 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::C; ;} - break; - - case 45: -#line 1149 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::C; ;} - break; - - case 46: -#line 1150 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::CSRet; ;} - break; - - case 47: -#line 1151 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::Fast; ;} - break; - - case 48: -#line 1152 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::Cold; ;} - break; - - case 49: -#line 1153 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::X86_StdCall; ;} - break; - - case 50: -#line 1154 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = CallingConv::X86_FastCall; ;} - break; - - case 51: -#line 1155 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) + ; + break;} +case 35: +#line 1139 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::InternalLinkage; ; + break;} +case 36: +#line 1140 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; + break;} +case 37: +#line 1141 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::WeakLinkage; ; + break;} +case 38: +#line 1142 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::AppendingLinkage; ; + break;} +case 39: +#line 1143 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::DLLImportLinkage; ; + break;} +case 40: +#line 1144 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::DLLExportLinkage; ; + break;} +case 41: +#line 1145 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::ExternalWeakLinkage; ; + break;} +case 42: +#line 1146 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Linkage = GlobalValue::ExternalLinkage; ; + break;} +case 43: +#line 1148 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::C; ; + break;} +case 44: +#line 1149 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::C; ; + break;} +case 45: +#line 1150 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::CSRet; ; + break;} +case 46: +#line 1151 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::Fast; ; + break;} +case 47: +#line 1152 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::Cold; ; + break;} +case 48: +#line 1153 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::X86_StdCall; ; + break;} +case 49: +#line 1154 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = CallingConv::X86_FastCall; ; + break;} +case 50: +#line 1155 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) GEN_ERROR("Calling conv too large!"); - (yyval.UIntVal) = (yyvsp[0].UInt64Val); + yyval.UIntVal = yyvsp[0].UInt64Val; CHECK_FOR_ERROR - ;} - break; - - case 52: -#line 1164 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = 0; ;} - break; - - case 53: -#line 1165 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.UIntVal) = (yyvsp[0].UInt64Val); - if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) + ; + break;} +case 51: +#line 1164 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = 0; ; + break;} +case 52: +#line 1165 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR -;} - break; - - case 54: -#line 1171 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.UIntVal) = 0; ;} - break; - - case 55: -#line 1172 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.UIntVal) = (yyvsp[0].UInt64Val); - if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) +; + break;} +case 53: +#line 1171 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.UIntVal = 0; ; + break;} +case 54: +#line 1172 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR -;} - break; - - case 56: -#line 1180 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i) - if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') +; + break;} +case 55: +#line 1180 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) + if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') GEN_ERROR("Invalid character in section name!"); - (yyval.StrVal) = (yyvsp[0].StrVal); + yyval.StrVal = yyvsp[0].StrVal; CHECK_FOR_ERROR -;} - break; - - case 57: -#line 1188 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.StrVal) = 0; ;} - break; - - case 58: -#line 1189 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.StrVal) = (yyvsp[0].StrVal); ;} - break; - - case 59: -#line 1194 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - {;} - break; - - case 60: -#line 1195 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - {;} - break; - - case 61: -#line 1196 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurGV->setSection((yyvsp[0].StrVal)); - free((yyvsp[0].StrVal)); +; + break;} +case 56: +#line 1188 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.StrVal = 0; ; + break;} +case 57: +#line 1189 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.StrVal = yyvsp[0].StrVal; ; + break;} +case 58: +#line 1194 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{; + break;} +case 59: +#line 1195 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{; + break;} +case 60: +#line 1196 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurGV->setSection(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); CHECK_FOR_ERROR - ;} - break; - - case 62: -#line 1201 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) + ; + break;} +case 61: +#line 1201 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) GEN_ERROR("Alignment must be a power of two!"); - CurGV->setAlignment((yyvsp[0].UInt64Val)); + CurGV->setAlignment(yyvsp[0].UInt64Val); CHECK_FOR_ERROR - ;} - break; - - case 64: -#line 1215 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} - break; - - case 66: -#line 1216 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} - break; - - case 67: -#line 1218 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 63: +#line 1215 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; + break;} +case 65: +#line 1216 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; + break;} +case 66: +#line 1218 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); - (yyval.TypeVal) = (yyvsp[0].TypeVal); + GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); + yyval.TypeVal = yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 81: -#line 1230 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TypeVal) = new PATypeHolder(OpaqueType::get()); + ; + break;} +case 80: +#line 1230 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TypeVal = new PATypeHolder(OpaqueType::get()); CHECK_FOR_ERROR - ;} - break; - - case 82: -#line 1234 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); + ; + break;} +case 81: +#line 1234 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); CHECK_FOR_ERROR - ;} - break; - - case 83: -#line 1238 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Named types are also simple types... - const Type* tmp = getTypeVal((yyvsp[0].ValIDVal)); + ; + break;} +case 82: +#line 1238 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Named types are also simple types... + const Type* tmp = getTypeVal(yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.TypeVal) = new PATypeHolder(tmp); -;} - break; - - case 84: -#line 1246 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Type UpReference - if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + yyval.TypeVal = new PATypeHolder(tmp); +; + break;} +case 83: +#line 1246 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Type UpReference + if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder - UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector... - (yyval.TypeVal) = new PATypeHolder(OT); + UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... + yyval.TypeVal = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); CHECK_FOR_ERROR - ;} - break; - - case 85: -#line 1254 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Function derived type? + ; + break;} +case 84: +#line 1254 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Function derived type? std::vector Params; - for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), - E = (yyvsp[-1].TypeList)->end(); I != E; ++I) + for (std::list::iterator I = yyvsp[-1].TypeList->begin(), + E = yyvsp[-1].TypeList->end(); I != E; ++I) Params.push_back(*I); bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FunctionType::get(*(yyvsp[-3].TypeVal),Params,isVarArg))); - delete (yyvsp[-1].TypeList); // Delete the argument list - delete (yyvsp[-3].TypeVal); // Delete the return type handle - CHECK_FOR_ERROR - ;} - break; - - case 86: -#line 1267 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Sized array type? - (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); - delete (yyvsp[-1].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 87: -#line 1272 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Packed array type? - const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get(); - if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) + yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); + delete yyvsp[-1].TypeList; // Delete the argument list + delete yyvsp[-3].TypeVal; // Delete the return type handle + CHECK_FOR_ERROR + ; + break;} +case 85: +#line 1267 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Sized array type? + yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); + delete yyvsp[-1].TypeVal; + CHECK_FOR_ERROR + ; + break;} +case 86: +#line 1272 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Packed array type? + const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); + if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) GEN_ERROR("Unsigned result not equal to signed result"); if (!ElemTy->isPrimitiveType()) GEN_ERROR("Elemental type of a PackedType must be primitive"); - if (!isPowerOf2_32((yyvsp[-3].UInt64Val))) + if (!isPowerOf2_32(yyvsp[-3].UInt64Val)) GEN_ERROR("Vector length should be a power of 2!"); - (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); - delete (yyvsp[-1].TypeVal); + yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 88: -#line 1284 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Structure type? + ; + break;} +case 87: +#line 1284 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Structure type? std::vector Elements; - for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), - E = (yyvsp[-1].TypeList)->end(); I != E; ++I) + for (std::list::iterator I = yyvsp[-1].TypeList->begin(), + E = yyvsp[-1].TypeList->end(); I != E; ++I) Elements.push_back(*I); - (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); - delete (yyvsp[-1].TypeList); - CHECK_FOR_ERROR - ;} - break; - - case 89: -#line 1294 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Empty structure type? - (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector())); + yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + delete yyvsp[-1].TypeList; CHECK_FOR_ERROR - ;} - break; - - case 90: -#line 1298 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Pointer type? - (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal)))); - delete (yyvsp[-1].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 91: -#line 1307 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TypeList) = new std::list(); - (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); + ; + break;} +case 88: +#line 1294 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Empty structure type? + yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); + CHECK_FOR_ERROR + ; + break;} +case 89: +#line 1298 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Pointer type? + if (*yyvsp[-1].TypeVal == Type::LabelTy) + GEN_ERROR("Cannot form a pointer to a basic block"); + yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); + delete yyvsp[-1].TypeVal; + CHECK_FOR_ERROR + ; + break;} +case 90: +#line 1309 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TypeList = new std::list(); + yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 92: -#line 1312 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); + ; + break;} +case 91: +#line 1314 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 94: -#line 1319 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(Type::VoidTy); + ; + break;} +case 93: +#line 1321 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); CHECK_FOR_ERROR - ;} - break; - - case 95: -#line 1323 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - ((yyval.TypeList) = new std::list())->push_back(Type::VoidTy); + ; + break;} +case 94: +#line 1325 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + (yyval.TypeList = new std::list())->push_back(Type::VoidTy); CHECK_FOR_ERROR - ;} - break; - - case 96: -#line 1327 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TypeList) = new std::list(); + ; + break;} +case 95: +#line 1329 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TypeList = new std::list(); CHECK_FOR_ERROR - ;} - break; - - case 97: -#line 1338 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Nonempty unsized arr - const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal)->get()); + ; + break;} +case 96: +#line 1340 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Nonempty unsized arr + const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) + if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + - utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + + utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { - if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); } - (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector)); - delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); + yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; CHECK_FOR_ERROR - ;} - break; - - case 98: -#line 1364 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); + ; + break;} +case 97: +#line 1366 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +"!"); - (yyval.ConstVal) = ConstantArray::get(ATy, std::vector()); - delete (yyvsp[-2].TypeVal); + yyval.ConstVal = ConstantArray::get(ATy, std::vector()); + delete yyvsp[-2].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 99: -#line 1378 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); + ; + break;} +case 98: +#line 1380 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); - char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); - if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal))) + char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); + if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal)) GEN_ERROR("Can't build string constant of size " + - itostr((int)(EndStr-(yyvsp[0].StrVal))) + + itostr((int)(EndStr-yyvsp[0].StrVal)) + " when array has size " + itostr(NumElements) + "!"); std::vector Vals; if (ETy == Type::SByteTy) { - for (signed char *C = (signed char *)(yyvsp[0].StrVal); C != (signed char *)EndStr; ++C) + for (signed char *C = (signed char *)yyvsp[0].StrVal; C != (signed char *)EndStr; ++C) Vals.push_back(ConstantSInt::get(ETy, *C)); } else if (ETy == Type::UByteTy) { - for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); + for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; C != (unsigned char*)EndStr; ++C) Vals.push_back(ConstantUInt::get(ETy, *C)); } else { - free((yyvsp[0].StrVal)); + free(yyvsp[0].StrVal); GEN_ERROR("Cannot build string arrays of non byte sized elements!"); } - free((yyvsp[0].StrVal)); - (yyval.ConstVal) = ConstantArray::get(ATy, Vals); - delete (yyvsp[-2].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 100: -#line 1408 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Nonempty unsized arr - const PackedType *PTy = dyn_cast((yyvsp[-3].TypeVal)->get()); + free(yyvsp[0].StrVal); + yyval.ConstVal = ConstantArray::get(ATy, Vals); + delete yyvsp[-2].TypeVal; + CHECK_FOR_ERROR + ; + break;} +case 99: +#line 1410 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Nonempty unsized arr + const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); const Type *ETy = PTy->getElementType(); int NumElements = PTy->getNumElements(); // Verify that we have the correct size... - if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size()) + if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + - utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + + utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { - if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); } - (yyval.ConstVal) = ConstantPacked::get(PTy, *(yyvsp[-1].ConstVector)); - delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); + yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; CHECK_FOR_ERROR - ;} - break; - - case 101: -#line 1434 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); + ; + break;} +case 100: +#line 1436 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); - if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes()) + if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes()) GEN_ERROR("Illegal number of initializers for structure type!"); // Check to ensure that constants are compatible with the type initializer! - for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) - if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i)) + for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) + if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i)) GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + " of structure initializer!"); - (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector)); - delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); + yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; CHECK_FOR_ERROR - ;} - break; - - case 102: -#line 1455 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const StructType *STy = dyn_cast((yyvsp[-2].TypeVal)->get()); + ; + break;} +case 101: +#line 1457 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); if (STy->getNumContainedTypes() != 0) GEN_ERROR("Illegal number of initializers for structure type!"); - (yyval.ConstVal) = ConstantStruct::get(STy, std::vector()); - delete (yyvsp[-2].TypeVal); + yyval.ConstVal = ConstantStruct::get(STy, std::vector()); + delete yyvsp[-2].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 103: -#line 1468 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal)->get()); + ; + break;} +case 102: +#line 1470 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*(yyvsp[-1].TypeVal))->getDescription() + "'!"); + (*yyvsp[-1].TypeVal)->getDescription() + "'!"); - (yyval.ConstVal) = ConstantPointerNull::get(PTy); - delete (yyvsp[-1].TypeVal); + yyval.ConstVal = ConstantPointerNull::get(PTy); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 104: -#line 1478 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get()); - delete (yyvsp[-1].TypeVal); + ; + break;} +case 103: +#line 1480 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 105: -#line 1483 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal)->get()); + ; + break;} +case 104: +#line 1485 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); if (Ty == 0) GEN_ERROR("Global const reference must be a pointer type!"); @@ -3518,7 +2868,7 @@ Function *SavedCurFn = CurFun.CurrentFunction; CurFun.CurrentFunction = 0; - Value *V = getValNonImprovising(Ty, (yyvsp[0].ValIDVal)); + Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal); CHECK_FOR_ERROR CurFun.CurrentFunction = SavedCurFn; @@ -3533,14 +2883,14 @@ // First check to see if the forward references value is already created! PerModuleInfo::GlobalRefsType::iterator I = - CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal))); + CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal)); if (I != CurModule.GlobalRefs.end()) { V = I->second; // Placeholder already exists, use it... - (yyvsp[0].ValIDVal).destroy(); + yyvsp[0].ValIDVal.destroy(); } else { std::string Name; - if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name; + if (yyvsp[0].ValIDVal.Type == ValID::NameVal) Name = yyvsp[0].ValIDVal.Name; // Create the forward referenced global. GlobalValue *GV; @@ -3555,160 +2905,149 @@ } // Keep track of the fact that we have a forward ref to recycle it - CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV)); + CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV)); V = GV; } } - (yyval.ConstVal) = cast(V); - delete (yyvsp[-1].TypeVal); // Free the type handle + yyval.ConstVal = cast(V); + delete yyvsp[-1].TypeVal; // Free the type handle CHECK_FOR_ERROR - ;} - break; - - case 106: -#line 1544 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType()) + ; + break;} +case 105: +#line 1546 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) GEN_ERROR("Mismatched types for constant expression!"); - (yyval.ConstVal) = (yyvsp[0].ConstVal); - delete (yyvsp[-1].TypeVal); + yyval.ConstVal = yyvsp[0].ConstVal; + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 107: -#line 1551 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const Type *Ty = (yyvsp[-1].TypeVal)->get(); + ; + break;} +case 106: +#line 1553 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const Type *Ty = yyvsp[-1].TypeVal->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) GEN_ERROR("Cannot create a null initialized value of this type!"); - (yyval.ConstVal) = Constant::getNullValue(Ty); - delete (yyvsp[-1].TypeVal); + yyval.ConstVal = Constant::getNullValue(Ty); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 108: -#line 1560 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // integral constants - if (!ConstantSInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) + ; + break;} +case 107: +#line 1562 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // integral constants + if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) GEN_ERROR("Constant value doesn't fit in type!"); - (yyval.ConstVal) = ConstantSInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)); + yyval.ConstVal = ConstantSInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); CHECK_FOR_ERROR - ;} - break; - - case 109: -#line 1566 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // integral constants - if (!ConstantUInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) + ; + break;} +case 108: +#line 1568 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // integral constants + if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) GEN_ERROR("Constant value doesn't fit in type!"); - (yyval.ConstVal) = ConstantUInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)); - CHECK_FOR_ERROR - ;} - break; - - case 110: -#line 1572 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Boolean constants - (yyval.ConstVal) = ConstantBool::getTrue(); - CHECK_FOR_ERROR - ;} - break; - - case 111: -#line 1576 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Boolean constants - (yyval.ConstVal) = ConstantBool::getFalse(); + yyval.ConstVal = ConstantUInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); CHECK_FOR_ERROR - ;} - break; - - case 112: -#line 1580 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Float & Double constants - if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) + ; + break;} +case 109: +#line 1574 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Boolean constants + yyval.ConstVal = ConstantBool::getTrue(); + CHECK_FOR_ERROR + ; + break;} +case 110: +#line 1578 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Boolean constants + yyval.ConstVal = ConstantBool::getFalse(); + CHECK_FOR_ERROR + ; + break;} +case 111: +#line 1582 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Float & Double constants + if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) GEN_ERROR("Floating point constant invalid for type!!"); - (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal)); + yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); CHECK_FOR_ERROR - ;} - break; - - case 113: -#line 1588 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!(yyvsp[-3].ConstVal)->getType()->isFirstClassType()) + ; + break;} +case 112: +#line 1590 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) GEN_ERROR("cast constant expression from a non-primitive type: '" + - (yyvsp[-3].ConstVal)->getType()->getDescription() + "'!"); - if (!(yyvsp[-1].TypeVal)->get()->isFirstClassType()) + yyvsp[-3].ConstVal->getType()->getDescription() + "'!"); + if (!yyvsp[-1].TypeVal->get()->isFirstClassType()) GEN_ERROR("cast constant expression to a non-primitive type: '" + - (yyvsp[-1].TypeVal)->get()->getDescription() + "'!"); - (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-3].ConstVal), (yyvsp[-1].TypeVal)->get()); - delete (yyvsp[-1].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 114: -#line 1599 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!isa((yyvsp[-2].ConstVal)->getType())) + yyvsp[-1].TypeVal->get()->getDescription() + "'!"); + yyval.ConstVal = ConstantExpr::getCast(yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); + delete yyvsp[-1].TypeVal; + CHECK_FOR_ERROR + ; + break;} +case 113: +#line 1601 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!isa(yyvsp[-2].ConstVal->getType())) GEN_ERROR("GetElementPtr requires a pointer operand!"); // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct // indices to uint struct indices for compatibility. generic_gep_type_iterator::iterator> - GTI = gep_type_begin((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end()), - GTE = gep_type_end((yyvsp[-2].ConstVal)->getType(), (yyvsp[-1].ValueList)->begin(), (yyvsp[-1].ValueList)->end()); - for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI) + GTI = gep_type_begin(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()), + GTE = gep_type_end(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()); + for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) if (isa(*GTI)) // Only change struct indices - if (ConstantUInt *CUI = dyn_cast((*(yyvsp[-1].ValueList))[i])) + if (ConstantUInt *CUI = dyn_cast((*yyvsp[-1].ValueList)[i])) if (CUI->getType() == Type::UByteTy) - (*(yyvsp[-1].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + (*yyvsp[-1].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); const Type *IdxTy = - GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true); + GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), *yyvsp[-1].ValueList, true); if (!IdxTy) GEN_ERROR("Index list invalid for constant getelementptr!"); std::vector IdxVec; - for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i) - if (Constant *C = dyn_cast((*(yyvsp[-1].ValueList))[i])) + for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i) + if (Constant *C = dyn_cast((*yyvsp[-1].ValueList)[i])) IdxVec.push_back(C); else GEN_ERROR("Indices to constant getelementptr must be constants!"); - delete (yyvsp[-1].ValueList); + delete yyvsp[-1].ValueList; - (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), IdxVec); + yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); CHECK_FOR_ERROR - ;} - break; - - case 115: -#line 1631 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-5].ConstVal)->getType() != Type::BoolTy) + ; + break;} +case 114: +#line 1633 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) GEN_ERROR("Select condition must be of boolean type!"); - if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) GEN_ERROR("Select operand types must match!"); - (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 116: -#line 1639 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) + ; + break;} +case 115: +#line 1641 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) GEN_ERROR("Binary operator types must match!"); // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. // To retain backward compatibility with these early compilers, we emit a // cast to the appropriate integer type automatically if we are in the // broken case. See PR424 for more information. - if (!isa((yyvsp[-3].ConstVal)->getType())) { - (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + if (!isa(yyvsp[-3].ConstVal->getType())) { + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); } else { const Type *IntPtrTy = 0; switch (CurModule.CurrentModule->getPointerSize()) { @@ -3716,154 +3055,138 @@ case Module::Pointer64: IntPtrTy = Type::LongTy; break; default: GEN_ERROR("invalid pointer binary constant expr!"); } - (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), ConstantExpr::getCast((yyvsp[-3].ConstVal), IntPtrTy), - ConstantExpr::getCast((yyvsp[-1].ConstVal), IntPtrTy)); - (yyval.ConstVal) = ConstantExpr::getCast((yyval.ConstVal), (yyvsp[-3].ConstVal)->getType()); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, ConstantExpr::getCast(yyvsp[-3].ConstVal, IntPtrTy), + ConstantExpr::getCast(yyvsp[-1].ConstVal, IntPtrTy)); + yyval.ConstVal = ConstantExpr::getCast(yyval.ConstVal, yyvsp[-3].ConstVal->getType()); } CHECK_FOR_ERROR - ;} - break; - - case 117: -#line 1661 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) + ; + break;} +case 116: +#line 1663 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) GEN_ERROR("Logical operator types must match!"); - if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) { - if (!isa((yyvsp[-3].ConstVal)->getType()) || - !cast((yyvsp[-3].ConstVal)->getType())->getElementType()->isIntegral()) + if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { + if (!isa(yyvsp[-3].ConstVal->getType()) || + !cast(yyvsp[-3].ConstVal->getType())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 118: -#line 1672 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) + ; + break;} +case 117: +#line 1674 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) GEN_ERROR("setcc operand types must match!"); - (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 119: -#line 1678 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-1].ConstVal)->getType() != Type::UByteTy) + ; + break;} +case 118: +#line 1680 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) GEN_ERROR("Shift count for shift constant must be unsigned byte!"); - if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) + if (!yyvsp[-3].ConstVal->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); - (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 120: -#line 1686 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) + ; + break;} +case 119: +#line 1688 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) GEN_ERROR("Invalid extractelement operands!"); - (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 121: -#line 1692 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) + ; + break;} +case 120: +#line 1694 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) GEN_ERROR("Invalid insertelement operands!"); - (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 122: -#line 1698 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) + ; + break;} +case 121: +#line 1700 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) GEN_ERROR("Invalid shufflevector operands!"); - (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); + yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 123: -#line 1707 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); + ; + break;} +case 122: +#line 1709 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 124: -#line 1711 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ConstVector) = new std::vector(); - (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); + ; + break;} +case 123: +#line 1713 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ConstVector = new std::vector(); + yyval.ConstVector->push_back(yyvsp[0].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 125: -#line 1719 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.BoolVal) = false; ;} - break; - - case 126: -#line 1719 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.BoolVal) = true; ;} - break; - - case 127: -#line 1729 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal); + ; + break;} +case 124: +#line 1721 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.BoolVal = false; ; + break;} +case 125: +#line 1721 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.BoolVal = true; ; + break;} +case 126: +#line 1731 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; CurModule.ModuleDone(); CHECK_FOR_ERROR; -;} - break; - - case 128: -#line 1737 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); +; + break;} +case 127: +#line 1739 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); CHECK_FOR_ERROR - ;} - break; - - case 129: -#line 1742 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); + ; + break;} +case 128: +#line 1744 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = yyvsp[-1].ModuleVal; CHECK_FOR_ERROR - ;} - break; - - case 130: -#line 1746 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); + ; + break;} +case 129: +#line 1748 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = yyvsp[-3].ModuleVal; CHECK_FOR_ERROR - ;} - break; - - case 131: -#line 1750 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); + ; + break;} +case 130: +#line 1752 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = yyvsp[-1].ModuleVal; CHECK_FOR_ERROR - ;} - break; - - case 132: -#line 1754 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ModuleVal) = CurModule.CurrentModule; + ; + break;} +case 131: +#line 1756 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ModuleVal = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { const ValID &DID = CurModule.LateResolveTypes.begin()->first; @@ -3874,12 +3197,11 @@ } } CHECK_FOR_ERROR - ;} - break; - - case 133: -#line 1769 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 132: +#line 1771 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: // @@ -3889,297 +3211,266 @@ // If types are not resolved eagerly, then the two types will not be // determined to be the same type! // - ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal)); + ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal); - if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) { + if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { CHECK_FOR_ERROR // If this is a named type that is not a redefinition, add it to the slot // table. - CurModule.Types.push_back(*(yyvsp[0].TypeVal)); + CurModule.Types.push_back(*yyvsp[0].TypeVal); } - delete (yyvsp[0].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 134: -#line 1791 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Function prototypes can be in const pool + delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 135: -#line 1794 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Asm blocks can be in the const pool - CHECK_FOR_ERROR - ;} - break; - - case 136: -#line 1797 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].ConstVal) == 0) + ; + break;} +case 133: +#line 1793 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Function prototypes can be in const pool + CHECK_FOR_ERROR + ; + break;} +case 134: +#line 1796 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Asm blocks can be in the const pool + CHECK_FOR_ERROR + ; + break;} +case 135: +#line 1799 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].ConstVal == 0) GEN_ERROR("Global value initializer is not a constant!"); - CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); + CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 137: -#line 1802 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 136: +#line 1804 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurGV = 0; - ;} - break; - - case 138: -#line 1805 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); + ; + break;} +case 137: +#line 1807 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); CHECK_FOR_ERROR - delete (yyvsp[0].TypeVal); - ;} - break; - - case 139: -#line 1809 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + delete yyvsp[0].TypeVal; + ; + break;} +case 138: +#line 1811 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurGV = 0; CHECK_FOR_ERROR - ;} - break; - - case 140: -#line 1813 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); + ; + break;} +case 139: +#line 1815 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::DLLImportLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); CHECK_FOR_ERROR - delete (yyvsp[0].TypeVal); - ;} - break; - - case 141: -#line 1817 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + delete yyvsp[0].TypeVal; + ; + break;} +case 140: +#line 1819 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurGV = 0; CHECK_FOR_ERROR - ;} - break; - - case 142: -#line 1821 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 141: +#line 1823 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurGV = - ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); + ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalWeakLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); CHECK_FOR_ERROR - delete (yyvsp[0].TypeVal); - ;} - break; - - case 143: -#line 1826 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + delete yyvsp[0].TypeVal; + ; + break;} +case 142: +#line 1828 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurGV = 0; CHECK_FOR_ERROR - ;} - break; - - case 144: -#line 1830 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CHECK_FOR_ERROR - ;} - break; - - case 145: -#line 1833 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 143: +#line 1832 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CHECK_FOR_ERROR + ; + break;} +case 144: +#line 1835 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CHECK_FOR_ERROR - ;} - break; - - case 146: -#line 1836 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - ;} - break; - - case 147: -#line 1840 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 145: +#line 1838 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + ; + break;} +case 146: +#line 1842 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm(); - char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); - std::string NewAsm((yyvsp[0].StrVal), EndStr); - free((yyvsp[0].StrVal)); + char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); + std::string NewAsm(yyvsp[0].StrVal, EndStr); + free(yyvsp[0].StrVal); if (AsmSoFar.empty()) CurModule.CurrentModule->setModuleInlineAsm(NewAsm); else CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm); CHECK_FOR_ERROR -;} - break; - - case 148: -#line 1853 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Endianness) = Module::BigEndian; ;} - break; - - case 149: -#line 1854 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.Endianness) = Module::LittleEndian; ;} - break; - - case 150: -#line 1856 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurModule.CurrentModule->setEndianness((yyvsp[0].Endianness)); +; + break;} +case 147: +#line 1855 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Endianness = Module::BigEndian; ; + break;} +case 148: +#line 1856 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.Endianness = Module::LittleEndian; ; + break;} +case 149: +#line 1858 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); CHECK_FOR_ERROR - ;} - break; - - case 151: -#line 1860 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].UInt64Val) == 32) + ; + break;} +case 150: +#line 1862 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].UInt64Val == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); - else if ((yyvsp[0].UInt64Val) == 64) + else if (yyvsp[0].UInt64Val == 64) CurModule.CurrentModule->setPointerSize(Module::Pointer64); else - GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'!"); + GEN_ERROR("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); CHECK_FOR_ERROR - ;} - break; - - case 152: -#line 1869 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); - free((yyvsp[0].StrVal)); + ; + break;} +case 151: +#line 1871 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); CHECK_FOR_ERROR - ;} - break; - - case 154: -#line 1877 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); - free((yyvsp[0].StrVal)); + ; + break;} +case 153: +#line 1879 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); CHECK_FOR_ERROR - ;} - break; - - case 155: -#line 1882 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); - free((yyvsp[0].StrVal)); + ; + break;} +case 154: +#line 1884 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); CHECK_FOR_ERROR - ;} - break; - - case 156: -#line 1887 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 155: +#line 1889 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CHECK_FOR_ERROR - ;} - break; - - case 160: -#line 1897 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.StrVal) = 0; ;} - break; - - case 161: -#line 1899 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (*(yyvsp[-1].TypeVal) == Type::VoidTy) + ; + break;} +case 159: +#line 1899 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.StrVal = 0; ; + break;} +case 160: +#line 1901 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (*yyvsp[-1].TypeVal == Type::VoidTy) GEN_ERROR("void typed arguments are invalid!"); - (yyval.ArgVal) = new std::pair((yyvsp[-1].TypeVal), (yyvsp[0].StrVal)); + yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); CHECK_FOR_ERROR -;} - break; - - case 162: -#line 1906 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = (yyvsp[-2].ArgList); - (yyvsp[-2].ArgList)->push_back(*(yyvsp[0].ArgVal)); - delete (yyvsp[0].ArgVal); - CHECK_FOR_ERROR - ;} - break; - - case 163: -#line 1912 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = new std::vector >(); - (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); - delete (yyvsp[0].ArgVal); - CHECK_FOR_ERROR - ;} - break; - - case 164: -#line 1919 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = (yyvsp[0].ArgList); +; + break;} +case 161: +#line 1908 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ArgList = yyvsp[-2].ArgList; + yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); + delete yyvsp[0].ArgVal; + CHECK_FOR_ERROR + ; + break;} +case 162: +#line 1914 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ArgList = new std::vector >(); + yyval.ArgList->push_back(*yyvsp[0].ArgVal); + delete yyvsp[0].ArgVal; + CHECK_FOR_ERROR + ; + break;} +case 163: +#line 1921 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ArgList = yyvsp[0].ArgList; CHECK_FOR_ERROR - ;} - break; - - case 165: -#line 1923 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = (yyvsp[-2].ArgList); - (yyval.ArgList)->push_back(std::pairpush_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); CHECK_FOR_ERROR - ;} - break; - - case 166: -#line 1929 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = new std::vector >(); - (yyval.ArgList)->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); + ; + break;} +case 165: +#line 1931 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ArgList = new std::vector >(); + yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); CHECK_FOR_ERROR - ;} - break; - - case 167: -#line 1934 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ArgList) = 0; + ; + break;} +case 166: +#line 1936 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ArgList = 0; CHECK_FOR_ERROR - ;} - break; - - case 168: -#line 1940 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - UnEscapeLexed((yyvsp[-5].StrVal)); - std::string FunctionName((yyvsp[-5].StrVal)); - free((yyvsp[-5].StrVal)); // Free strdup'd memory! + ; + break;} +case 167: +#line 1942 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + UnEscapeLexed(yyvsp[-5].StrVal); + std::string FunctionName(yyvsp[-5].StrVal); + free(yyvsp[-5].StrVal); // Free strdup'd memory! - if (!(*(yyvsp[-6].TypeVal))->isFirstClassType() && *(yyvsp[-6].TypeVal) != Type::VoidTy) + if (!(*yyvsp[-6].TypeVal)->isFirstClassType() && *yyvsp[-6].TypeVal != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); std::vector ParamTypeList; - if ((yyvsp[-3].ArgList)) { // If there are arguments... - for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); - I != (yyvsp[-3].ArgList)->end(); ++I) + if (yyvsp[-3].ArgList) { // If there are arguments... + for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); + I != yyvsp[-3].ArgList->end(); ++I) ParamTypeList.push_back(I->first->get()); } bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; if (isVarArg) ParamTypeList.pop_back(); - const FunctionType *FT = FunctionType::get(*(yyvsp[-6].TypeVal), ParamTypeList, isVarArg); + const FunctionType *FT = FunctionType::get(*yyvsp[-6].TypeVal, ParamTypeList, isVarArg); const PointerType *PFT = PointerType::get(FT); - delete (yyvsp[-6].TypeVal); + delete yyvsp[-6].TypeVal; ValID ID; if (!FunctionName.empty()) { @@ -4223,24 +3514,24 @@ // another function. Fn->setLinkage(CurFun.Linkage); } - Fn->setCallingConv((yyvsp[-7].UIntVal)); - Fn->setAlignment((yyvsp[0].UIntVal)); - if ((yyvsp[-1].StrVal)) { - Fn->setSection((yyvsp[-1].StrVal)); - free((yyvsp[-1].StrVal)); + Fn->setCallingConv(yyvsp[-7].UIntVal); + Fn->setAlignment(yyvsp[0].UIntVal); + if (yyvsp[-1].StrVal) { + Fn->setSection(yyvsp[-1].StrVal); + free(yyvsp[-1].StrVal); } // Add all of the arguments we parsed to the function... - if ((yyvsp[-3].ArgList)) { // Is null if empty... + if (yyvsp[-3].ArgList) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert((yyvsp[-3].ArgList)->back().first->get() == Type::VoidTy && (yyvsp[-3].ArgList)->back().second == 0&& + assert(yyvsp[-3].ArgList->back().first->get() == Type::VoidTy && yyvsp[-3].ArgList->back().second == 0&& "Not a varargs marker!"); - delete (yyvsp[-3].ArgList)->back().first; - (yyvsp[-3].ArgList)->pop_back(); // Delete the last entry + delete yyvsp[-3].ArgList->back().first; + yyvsp[-3].ArgList->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); - I != (yyvsp[-3].ArgList)->end(); ++I, ++ArgIt) { + for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); + I != yyvsp[-3].ArgList->end(); ++I, ++ArgIt) { delete I->first; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... @@ -4248,140 +3539,123 @@ InsertValue(ArgIt); } - delete (yyvsp[-3].ArgList); // We're now done with the argument list + delete yyvsp[-3].ArgList; // We're now done with the argument list } CHECK_FOR_ERROR -;} - break; - - case 171: -#line 2036 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.FunctionVal) = CurFun.CurrentFunction; +; + break;} +case 170: +#line 2038 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.FunctionVal = CurFun.CurrentFunction; // Make sure that we keep track of the linkage type even if there was a // previous "declare". - (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage)); -;} - break; - - case 174: -#line 2046 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + yyval.FunctionVal->setLinkage(yyvsp[-2].Linkage); +; + break;} +case 173: +#line 2048 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.FunctionVal = yyvsp[-1].FunctionVal; CHECK_FOR_ERROR -;} - break; - - case 176: -#line 2052 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { CurFun.Linkage = GlobalValue::DLLImportLinkage ;} - break; - - case 177: -#line 2053 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { CurFun.Linkage = GlobalValue::DLLImportLinkage ;} - break; - - case 178: -#line 2055 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { CurFun.isDeclare = true; ;} - break; - - case 179: -#line 2055 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.FunctionVal) = CurFun.CurrentFunction; +; + break;} +case 175: +#line 2054 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurFun.Linkage = GlobalValue::DLLImportLinkage ; + break;} +case 176: +#line 2055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurFun.Linkage = GlobalValue::DLLImportLinkage ; + break;} +case 177: +#line 2057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ CurFun.isDeclare = true; ; + break;} +case 178: +#line 2057 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.FunctionVal = CurFun.CurrentFunction; CurFun.FunctionDone(); CHECK_FOR_ERROR - ;} - break; - - case 180: -#line 2065 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = false; - CHECK_FOR_ERROR - ;} - break; - - case 181: -#line 2069 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = true; - CHECK_FOR_ERROR - ;} - break; - - case 182: -#line 2074 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // A reference to a direct constant - (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); - CHECK_FOR_ERROR - ;} - break; - - case 183: -#line 2078 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); + ; + break;} +case 179: +#line 2067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = false; CHECK_FOR_ERROR - ;} - break; - - case 184: -#line 2082 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Perhaps it's an FP constant? - (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); + ; + break;} +case 180: +#line 2071 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = true; CHECK_FOR_ERROR - ;} - break; - - case 185: -#line 2086 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::create(ConstantBool::getTrue()); + ; + break;} +case 181: +#line 2076 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // A reference to a direct constant + yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); + CHECK_FOR_ERROR + ; + break;} +case 182: +#line 2080 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); CHECK_FOR_ERROR - ;} - break; - - case 186: -#line 2090 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::create(ConstantBool::getFalse()); + ; + break;} +case 183: +#line 2084 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Perhaps it's an FP constant? + yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); + CHECK_FOR_ERROR + ; + break;} +case 184: +#line 2088 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::create(ConstantBool::getTrue()); CHECK_FOR_ERROR - ;} - break; - - case 187: -#line 2094 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::createNull(); + ; + break;} +case 185: +#line 2092 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::create(ConstantBool::getFalse()); CHECK_FOR_ERROR - ;} - break; - - case 188: -#line 2098 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::createUndef(); + ; + break;} +case 186: +#line 2096 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::createNull(); CHECK_FOR_ERROR - ;} - break; - - case 189: -#line 2102 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // A vector zero constant. - (yyval.ValIDVal) = ValID::createZeroInit(); + ; + break;} +case 187: +#line 2100 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::createUndef(); CHECK_FOR_ERROR - ;} - break; - - case 190: -#line 2106 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Nonempty unsized packed vector - const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType(); - int NumElements = (yyvsp[-1].ConstVector)->size(); + ; + break;} +case 188: +#line 2104 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // A vector zero constant. + yyval.ValIDVal = ValID::createZeroInit(); + CHECK_FOR_ERROR + ; + break;} +case 189: +#line 2108 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Nonempty unsized packed vector + const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); + int NumElements = yyvsp[-1].ConstVector->size(); PackedType* pt = PackedType::get(ETy, NumElements); PATypeHolder* PTy = new PATypeHolder( @@ -4393,108 +3667,98 @@ ); // Verify all elements are correct type! - for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { - if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '" + - (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); } - (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, *(yyvsp[-1].ConstVector))); - delete PTy; delete (yyvsp[-1].ConstVector); - CHECK_FOR_ERROR - ;} - break; - - case 191: -#line 2131 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal)); - CHECK_FOR_ERROR - ;} - break; - - case 192: -#line 2135 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - char *End = UnEscapeLexed((yyvsp[-2].StrVal), true); - std::string AsmStr = std::string((yyvsp[-2].StrVal), End); - End = UnEscapeLexed((yyvsp[0].StrVal), true); - std::string Constraints = std::string((yyvsp[0].StrVal), End); - (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal)); - free((yyvsp[-2].StrVal)); - free((yyvsp[0].StrVal)); + yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); + delete PTy; delete yyvsp[-1].ConstVector; CHECK_FOR_ERROR - ;} - break; - - case 193: -#line 2149 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Is it an integer reference...? - (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); - CHECK_FOR_ERROR - ;} - break; - - case 194: -#line 2153 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Is it a named reference...? - (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); - CHECK_FOR_ERROR - ;} - break; - - case 197: -#line 2165 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); delete (yyvsp[-1].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 198: -#line 2170 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); - CHECK_FOR_ERROR - ;} - break; - - case 199: -#line 2174 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Do not allow functions with 0 basic blocks - (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); + ; + break;} +case 190: +#line 2133 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); CHECK_FOR_ERROR - ;} - break; - - case 200: -#line 2183 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); + ; + break;} +case 191: +#line 2137 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + char *End = UnEscapeLexed(yyvsp[-2].StrVal, true); + std::string AsmStr = std::string(yyvsp[-2].StrVal, End); + End = UnEscapeLexed(yyvsp[0].StrVal, true); + std::string Constraints = std::string(yyvsp[0].StrVal, End); + yyval.ValIDVal = ValID::createInlineAsm(AsmStr, Constraints, yyvsp[-3].BoolVal); + free(yyvsp[-2].StrVal); + free(yyvsp[0].StrVal); + CHECK_FOR_ERROR + ; + break;} +case 192: +#line 2151 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Is it an integer reference...? + yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); + CHECK_FOR_ERROR + ; + break;} +case 193: +#line 2155 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Is it a named reference...? + yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); + CHECK_FOR_ERROR + ; + break;} +case 196: +#line 2167 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - InsertValue((yyvsp[0].TermInstVal)); - - (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal)); - InsertValue((yyvsp[-2].BasicBlockVal)); - (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal); + ; + break;} +case 197: +#line 2172 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.FunctionVal = yyvsp[-1].FunctionVal; CHECK_FOR_ERROR - ;} - break; - - case 201: -#line 2194 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal)); - (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal); + ; + break;} +case 198: +#line 2176 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Do not allow functions with 0 basic blocks + yyval.FunctionVal = yyvsp[-1].FunctionVal; + CHECK_FOR_ERROR + ; + break;} +case 199: +#line 2185 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); CHECK_FOR_ERROR - ;} - break; + InsertValue(yyvsp[0].TermInstVal); - case 202: -#line 2199 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); + yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); + InsertValue(yyvsp[-2].BasicBlockVal); + yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; + CHECK_FOR_ERROR + ; + break;} +case 200: +#line 2196 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); + yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; + CHECK_FOR_ERROR + ; + break;} +case 201: +#line 2201 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4502,15 +3766,14 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); + BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); CHECK_FOR_ERROR - ;} - break; - - case 203: -#line 2211 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true); + ; + break;} +case 202: +#line 2213 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4518,97 +3781,90 @@ // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); - CHECK_FOR_ERROR - ;} - break; - - case 204: -#line 2224 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Return with a result... - (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal)); - CHECK_FOR_ERROR - ;} - break; - - case 205: -#line 2228 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Return with no result... - (yyval.TermInstVal) = new ReturnInst(); - CHECK_FOR_ERROR - ;} - break; - - case 206: -#line 2232 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Unconditional Branch... - BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); - CHECK_FOR_ERROR - (yyval.TermInstVal) = new BranchInst(tmpBB); - ;} - break; - - case 207: -#line 2237 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); - CHECK_FOR_ERROR - BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); + BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); CHECK_FOR_ERROR - Value* tmpVal = getVal(Type::BoolTy, (yyvsp[-6].ValIDVal)); - CHECK_FOR_ERROR - (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal); - ;} - break; - - case 208: -#line 2246 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal)); + ; + break;} +case 203: +#line 2226 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Return with a result... + yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); + CHECK_FOR_ERROR + ; + break;} +case 204: +#line 2230 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Return with no result... + yyval.TermInstVal = new ReturnInst(); + CHECK_FOR_ERROR + ; + break;} +case 205: +#line 2234 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Unconditional Branch... + BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + CHECK_FOR_ERROR + yyval.TermInstVal = new BranchInst(tmpBB); + ; + break;} +case 206: +#line 2239 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal); + CHECK_FOR_ERROR + BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal); + CHECK_FOR_ERROR + Value* tmpVal = getVal(Type::BoolTy, yyvsp[-6].ValIDVal); + CHECK_FOR_ERROR + yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal); + ; + break;} +case 207: +#line 2248 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); + BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal); CHECK_FOR_ERROR - SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size()); - (yyval.TermInstVal) = S; + SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size()); + yyval.TermInstVal = S; - std::vector >::iterator I = (yyvsp[-1].JumpTable)->begin(), - E = (yyvsp[-1].JumpTable)->end(); + std::vector >::iterator I = yyvsp[-1].JumpTable->begin(), + E = yyvsp[-1].JumpTable->end(); for (; I != E; ++I) { if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else GEN_ERROR("Switch case is constant, but not a simple integer!"); } - delete (yyvsp[-1].JumpTable); + delete yyvsp[-1].JumpTable; CHECK_FOR_ERROR - ;} - break; - - case 209: -#line 2265 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal)); + ; + break;} +case 208: +#line 2267 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); + BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal); CHECK_FOR_ERROR SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0); - (yyval.TermInstVal) = S; + yyval.TermInstVal = S; CHECK_FOR_ERROR - ;} - break; - - case 210: -#line 2275 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 209: +#line 2277 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast((yyvsp[-10].TypeVal)->get())) || + if (!(PFTy = dyn_cast(yyvsp[-10].TypeVal->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if ((yyvsp[-7].ValueList)) { - for (std::vector::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end(); + if (yyvsp[-7].ValueList) { + for (std::vector::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -4616,27 +3872,27 @@ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - Ty = FunctionType::get((yyvsp[-10].TypeVal)->get(), ParamTypes, isVarArg); + Ty = FunctionType::get(yyvsp[-10].TypeVal->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal)); // Get the function we're calling... + Value *V = getVal(PFTy, yyvsp[-9].ValIDVal); // Get the function we're calling... CHECK_FOR_ERROR - BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal)); + BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal); CHECK_FOR_ERROR - BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal)); + BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal); CHECK_FOR_ERROR // Create the call node... - if (!(yyvsp[-7].ValueList)) { // Has no arguments? - (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector()); + if (!yyvsp[-7].ValueList) { // Has no arguments? + yyval.TermInstVal = new InvokeInst(V, Normal, Except, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end(); + std::vector::iterator ArgI = yyvsp[-7].ValueList->begin(), ArgE = yyvsp[-7].ValueList->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -4646,263 +3902,242 @@ if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[-7].ValueList)); + yyval.TermInstVal = new InvokeInst(V, Normal, Except, *yyvsp[-7].ValueList); } - cast((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal)); + cast(yyval.TermInstVal)->setCallingConv(yyvsp[-11].UIntVal); - delete (yyvsp[-10].TypeVal); - delete (yyvsp[-7].ValueList); + delete yyvsp[-10].TypeVal; + delete yyvsp[-7].ValueList; CHECK_FOR_ERROR - ;} - break; - - case 211: -#line 2330 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TermInstVal) = new UnwindInst(); + ; + break;} +case 210: +#line 2332 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TermInstVal = new UnwindInst(); CHECK_FOR_ERROR - ;} - break; - - case 212: -#line 2334 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.TermInstVal) = new UnreachableInst(); + ; + break;} +case 211: +#line 2336 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.TermInstVal = new UnreachableInst(); CHECK_FOR_ERROR - ;} - break; - - case 213: -#line 2341 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.JumpTable) = (yyvsp[-5].JumpTable); - Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); + ; + break;} +case 212: +#line 2343 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.JumpTable = yyvsp[-5].JumpTable; + Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); + BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); - ;} - break; - - case 214: -#line 2352 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.JumpTable) = new std::vector >(); - Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); + yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); + ; + break;} +case 213: +#line 2354 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.JumpTable = new std::vector >(); + Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); + BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); - ;} - break; - - case 215: -#line 2365 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); + ; + break;} +case 214: +#line 2367 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Is this definition named?? if so, assign the name... - setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); + setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); CHECK_FOR_ERROR - InsertValue((yyvsp[0].InstVal)); - (yyval.InstVal) = (yyvsp[0].InstVal); + InsertValue(yyvsp[0].InstVal); + yyval.InstVal = yyvsp[0].InstVal; CHECK_FOR_ERROR -;} - break; - - case 216: -#line 2374 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Used for PHI nodes - (yyval.PHIList) = new std::list >(); - Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal)); - CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); - CHECK_FOR_ERROR - (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); - delete (yyvsp[-5].TypeVal); - ;} - break; - - case 217: -#line 2383 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.PHIList) = (yyvsp[-6].PHIList); - Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal)); +; + break;} +case 215: +#line 2376 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Used for PHI nodes + yyval.PHIList = new std::list >(); + Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal); + CHECK_FOR_ERROR + BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); + CHECK_FOR_ERROR + yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB)); + delete yyvsp[-5].TypeVal; + ; + break;} +case 216: +#line 2385 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.PHIList = yyvsp[-6].PHIList; + Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); + BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); CHECK_FOR_ERROR - (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); - ;} - break; - - case 218: -#line 2393 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { // Used for call statements, and memory insts... - (yyval.ValueList) = new std::vector(); - (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); - ;} - break; - - case 219: -#line 2397 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValueList) = (yyvsp[-2].ValueList); - (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal)); + yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB)); + ; + break;} +case 217: +#line 2395 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // Used for call statements, and memory insts... + yyval.ValueList = new std::vector(); + yyval.ValueList->push_back(yyvsp[0].ValueVal); + ; + break;} +case 218: +#line 2399 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValueList = yyvsp[-2].ValueList; + yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 221: -#line 2404 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.ValueList) = 0; ;} - break; - - case 222: -#line 2406 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = true; + ; + break;} +case 220: +#line 2406 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ yyval.ValueList = 0; ; + break;} +case 221: +#line 2408 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = true; CHECK_FOR_ERROR - ;} - break; - - case 223: -#line 2410 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = false; + ; + break;} +case 222: +#line 2412 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = false; CHECK_FOR_ERROR - ;} - break; - - case 224: -#line 2415 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && - !isa((*(yyvsp[-3].TypeVal)).get())) + ; + break;} +case 223: +#line 2417 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && + !isa((*yyvsp[-3].TypeVal).get())) GEN_ERROR( "Arithmetic operator requires integer, FP, or packed operands!"); - if (isa((*(yyvsp[-3].TypeVal)).get()) && (yyvsp[-4].BinaryOpVal) == Instruction::Rem) + if (isa((*yyvsp[-3].TypeVal).get()) && yyvsp[-4].BinaryOpVal == Instruction::Rem) GEN_ERROR("Rem not supported on packed types!"); - Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); + Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); CHECK_FOR_ERROR - Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); + Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2); - if ((yyval.InstVal) == 0) + yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2); + if (yyval.InstVal == 0) GEN_ERROR("binary operator returned null!"); - delete (yyvsp[-3].TypeVal); - ;} - break; - - case 225: -#line 2431 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!(*(yyvsp[-3].TypeVal))->isIntegral()) { - if (!isa((yyvsp[-3].TypeVal)->get()) || - !cast((yyvsp[-3].TypeVal)->get())->getElementType()->isIntegral()) + delete yyvsp[-3].TypeVal; + ; + break;} +case 224: +#line 2433 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!(*yyvsp[-3].TypeVal)->isIntegral()) { + if (!isa(yyvsp[-3].TypeVal->get()) || + !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); + Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); + Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); - if ((yyval.InstVal) == 0) + yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); + if (yyval.InstVal == 0) GEN_ERROR("binary operator returned null!"); - delete (yyvsp[-3].TypeVal); - ;} - break; - - case 226: -#line 2446 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if(isa((*(yyvsp[-3].TypeVal)).get())) { + delete yyvsp[-3].TypeVal; + ; + break;} +case 225: +#line 2448 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if(isa((*yyvsp[-3].TypeVal).get())) { GEN_ERROR( "PackedTypes currently not supported in setcc instructions!"); } - Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); + Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); + Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new SetCondInst((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); - if ((yyval.InstVal) == 0) + yyval.InstVal = new SetCondInst(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); + if (yyval.InstVal == 0) GEN_ERROR("binary operator returned null!"); - delete (yyvsp[-3].TypeVal); - ;} - break; - - case 227: -#line 2460 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + delete yyvsp[-3].TypeVal; + ; + break;} +case 226: +#line 2462 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; - Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[0].ValueVal)->getType()); + Value *Ones = ConstantIntegral::getAllOnesValue(yyvsp[0].ValueVal->getType()); if (Ones == 0) GEN_ERROR("Expected integral type for not instruction!"); - (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal), Ones); - if ((yyval.InstVal) == 0) + yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); + if (yyval.InstVal == 0) GEN_ERROR("Could not create a xor instruction!"); CHECK_FOR_ERROR - ;} - break; - - case 228: -#line 2473 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[0].ValueVal)->getType() != Type::UByteTy) + ; + break;} +case 227: +#line 2475 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[0].ValueVal->getType() != Type::UByteTy) GEN_ERROR("Shift amount must be ubyte!"); - if (!(yyvsp[-2].ValueVal)->getType()->isInteger()) + if (!yyvsp[-2].ValueVal->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); - (yyval.InstVal) = new ShiftInst((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); + yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 229: -#line 2481 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!(yyvsp[0].TypeVal)->get()->isFirstClassType()) + ; + break;} +case 228: +#line 2483 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!yyvsp[0].TypeVal->get()->isFirstClassType()) GEN_ERROR("cast instruction to a non-primitive type: '" + - (yyvsp[0].TypeVal)->get()->getDescription() + "'!"); - (yyval.InstVal) = new CastInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); - delete (yyvsp[0].TypeVal); - CHECK_FOR_ERROR - ;} - break; - - case 230: -#line 2489 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if ((yyvsp[-4].ValueVal)->getType() != Type::BoolTy) + yyvsp[0].TypeVal->get()->getDescription() + "'!"); + yyval.InstVal = new CastInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + CHECK_FOR_ERROR + ; + break;} +case 229: +#line 2491 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) GEN_ERROR("select condition must be boolean!"); - if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType()) + if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) GEN_ERROR("select value types should match!"); - (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); + yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 231: -#line 2497 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 230: +#line 2499 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ NewVarArgs = true; - (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); - delete (yyvsp[0].TypeVal); + yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 232: -#line 2503 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 231: +#line 2505 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ ObsoleteVarArgs = true; - const Type* ArgTy = (yyvsp[-2].ValueVal)->getType(); + const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0); @@ -4913,20 +4148,19 @@ //b = vaarg foo, t AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix"); CurBB->getInstList().push_back(foo); - CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal)); + CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); CurBB->getInstList().push_back(bar); CurBB->getInstList().push_back(new StoreInst(bar, foo)); - (yyval.InstVal) = new VAArgInst(foo, *(yyvsp[0].TypeVal)); - delete (yyvsp[0].TypeVal); + yyval.InstVal = new VAArgInst(foo, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 233: -#line 2523 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 232: +#line 2525 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ ObsoleteVarArgs = true; - const Type* ArgTy = (yyvsp[-2].ValueVal)->getType(); + const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0); @@ -4938,78 +4172,73 @@ //b = load foo AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix"); CurBB->getInstList().push_back(foo); - CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal)); + CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); CurBB->getInstList().push_back(bar); CurBB->getInstList().push_back(new StoreInst(bar, foo)); - Instruction* tmp = new VAArgInst(foo, *(yyvsp[0].TypeVal)); + Instruction* tmp = new VAArgInst(foo, *yyvsp[0].TypeVal); CurBB->getInstList().push_back(tmp); - (yyval.InstVal) = new LoadInst(foo); - delete (yyvsp[0].TypeVal); + yyval.InstVal = new LoadInst(foo); + delete yyvsp[0].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 234: -#line 2546 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) + ; + break;} +case 233: +#line 2548 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) GEN_ERROR("Invalid extractelement operands!"); - (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); + yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 235: -#line 2552 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) + ; + break;} +case 234: +#line 2554 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) GEN_ERROR("Invalid insertelement operands!"); - (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); + yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 236: -#line 2558 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) + ; + break;} +case 235: +#line 2560 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) GEN_ERROR("Invalid shufflevector operands!"); - (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); + yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 237: -#line 2564 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); + ; + break;} +case 236: +#line 2566 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const Type *Ty = yyvsp[0].PHIList->front().first->getType(); if (!Ty->isFirstClassType()) GEN_ERROR("PHI node operands must be of first class type!"); - (yyval.InstVal) = new PHINode(Ty); - ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size()); - while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) { - if ((yyvsp[0].PHIList)->front().first->getType() != Ty) + yyval.InstVal = new PHINode(Ty); + ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size()); + while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) { + if (yyvsp[0].PHIList->front().first->getType() != Ty) GEN_ERROR("All elements of a PHI node must be of the same type!"); - cast((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second); - (yyvsp[0].PHIList)->pop_front(); + cast(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second); + yyvsp[0].PHIList->pop_front(); } - delete (yyvsp[0].PHIList); // Free the list... + delete yyvsp[0].PHIList; // Free the list... CHECK_FOR_ERROR - ;} - break; - - case 238: -#line 2579 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { + ; + break;} +case 237: +#line 2581 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast((yyvsp[-4].TypeVal)->get())) || + if (!(PFTy = dyn_cast(yyvsp[-4].TypeVal->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if ((yyvsp[-1].ValueList)) { - for (std::vector::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end(); + if (yyvsp[-1].ValueList) { + for (std::vector::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -5017,31 +4246,31 @@ bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - if (!(*(yyvsp[-4].TypeVal))->isFirstClassType() && *(yyvsp[-4].TypeVal) != Type::VoidTy) + if (!(*yyvsp[-4].TypeVal)->isFirstClassType() && *yyvsp[-4].TypeVal != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); - Ty = FunctionType::get((yyvsp[-4].TypeVal)->get(), ParamTypes, isVarArg); + Ty = FunctionType::get(yyvsp[-4].TypeVal->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal)); // Get the function we're calling... + Value *V = getVal(PFTy, yyvsp[-3].ValIDVal); // Get the function we're calling... CHECK_FOR_ERROR // Create the call node... - if (!(yyvsp[-1].ValueList)) { // Has no arguments? + if (!yyvsp[-1].ValueList) { // Has no arguments? // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " "expects arguments!"); - (yyval.InstVal) = new CallInst(V, std::vector()); + yyval.InstVal = new CallInst(V, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end(); + std::vector::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -5051,442 +4280,377 @@ if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - (yyval.InstVal) = new CallInst(V, *(yyvsp[-1].ValueList)); + yyval.InstVal = new CallInst(V, *yyvsp[-1].ValueList); } - cast((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal)); - cast((yyval.InstVal))->setCallingConv((yyvsp[-5].UIntVal)); - delete (yyvsp[-4].TypeVal); - delete (yyvsp[-1].ValueList); - CHECK_FOR_ERROR - ;} - break; - - case 239: -#line 2638 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.InstVal) = (yyvsp[0].InstVal); - CHECK_FOR_ERROR - ;} - break; - - case 240: -#line 2645 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValueList) = (yyvsp[0].ValueList); - CHECK_FOR_ERROR - ;} - break; - - case 241: -#line 2648 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.ValueList) = new std::vector(); + cast(yyval.InstVal)->setTailCall(yyvsp[-6].BoolVal); + cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); + delete yyvsp[-4].TypeVal; + delete yyvsp[-1].ValueList; + CHECK_FOR_ERROR + ; + break;} +case 238: +#line 2640 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.InstVal = yyvsp[0].InstVal; CHECK_FOR_ERROR - ;} - break; - - case 242: -#line 2653 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = true; + ; + break;} +case 239: +#line 2647 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValueList = yyvsp[0].ValueList; + CHECK_FOR_ERROR + ; + break;} +case 240: +#line 2650 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.ValueList = new std::vector(); + CHECK_FOR_ERROR + ; + break;} +case 241: +#line 2655 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = true; CHECK_FOR_ERROR - ;} - break; - - case 243: -#line 2657 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.BoolVal) = false; + ; + break;} +case 242: +#line 2659 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.BoolVal = false; CHECK_FOR_ERROR - ;} - break; - - case 244: -#line 2664 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); - delete (yyvsp[-1].TypeVal); + ; + break;} +case 243: +#line 2666 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 245: -#line 2669 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); + ; + break;} +case 244: +#line 2671 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); - delete (yyvsp[-4].TypeVal); - ;} - break; - - case 246: -#line 2675 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); - delete (yyvsp[-1].TypeVal); + yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); + delete yyvsp[-4].TypeVal; + ; + break;} +case 245: +#line 2677 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); + delete yyvsp[-1].TypeVal; CHECK_FOR_ERROR - ;} - break; - - case 247: -#line 2680 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); + ; + break;} +case 246: +#line 2682 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); - delete (yyvsp[-4].TypeVal); - ;} - break; - - case 248: -#line 2686 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!isa((yyvsp[0].ValueVal)->getType())) + yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); + delete yyvsp[-4].TypeVal; + ; + break;} +case 247: +#line 2688 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!isa(yyvsp[0].ValueVal->getType())) GEN_ERROR("Trying to free nonpointer type " + - (yyvsp[0].ValueVal)->getType()->getDescription() + "!"); - (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal)); + yyvsp[0].ValueVal->getType()->getDescription() + "!"); + yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); CHECK_FOR_ERROR - ;} - break; - - case 249: -#line 2694 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!isa((yyvsp[-1].TypeVal)->get())) + ; + break;} +case 248: +#line 2696 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!isa(yyvsp[-1].TypeVal->get())) GEN_ERROR("Can't load from nonpointer type: " + - (*(yyvsp[-1].TypeVal))->getDescription()); - if (!cast((yyvsp[-1].TypeVal)->get())->getElementType()->isFirstClassType()) + (*yyvsp[-1].TypeVal)->getDescription()); + if (!cast(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType()) GEN_ERROR("Can't load from pointer of non-first-class type: " + - (*(yyvsp[-1].TypeVal))->getDescription()); - Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); + (*yyvsp[-1].TypeVal)->getDescription()); + Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal)); - delete (yyvsp[-1].TypeVal); - ;} - break; - - case 250: -#line 2706 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - const PointerType *PT = dyn_cast((yyvsp[-1].TypeVal)->get()); + yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal); + delete yyvsp[-1].TypeVal; + ; + break;} +case 249: +#line 2708 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); if (!PT) GEN_ERROR("Can't store to a nonpointer type: " + - (*(yyvsp[-1].TypeVal))->getDescription()); + (*yyvsp[-1].TypeVal)->getDescription()); const Type *ElTy = PT->getElementType(); - if (ElTy != (yyvsp[-3].ValueVal)->getType()) - GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() + + if (ElTy != yyvsp[-3].ValueVal->getType()) + GEN_ERROR("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() + "' into space of type '" + ElTy->getDescription() + "'!"); - Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); + Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new StoreInst((yyvsp[-3].ValueVal), tmpVal, (yyvsp[-5].BoolVal)); - delete (yyvsp[-1].TypeVal); - ;} - break; - - case 251: -#line 2721 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" - { - if (!isa((yyvsp[-2].TypeVal)->get())) + yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, tmpVal, yyvsp[-5].BoolVal); + delete yyvsp[-1].TypeVal; + ; + break;} +case 250: +#line 2723 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ + if (!isa(yyvsp[-2].TypeVal->get())) GEN_ERROR("getelementptr insn requires pointer operand!"); // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct // indices to uint struct indices for compatibility. generic_gep_type_iterator::iterator> - GTI = gep_type_begin((yyvsp[-2].TypeVal)->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end()), - GTE = gep_type_end((yyvsp[-2].TypeVal)->get(), (yyvsp[0].ValueList)->begin(), (yyvsp[0].ValueList)->end()); - for (unsigned i = 0, e = (yyvsp[0].ValueList)->size(); i != e && GTI != GTE; ++i, ++GTI) + GTI = gep_type_begin(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()), + GTE = gep_type_end(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()); + for (unsigned i = 0, e = yyvsp[0].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) if (isa(*GTI)) // Only change struct indices - if (ConstantUInt *CUI = dyn_cast((*(yyvsp[0].ValueList))[i])) + if (ConstantUInt *CUI = dyn_cast((*yyvsp[0].ValueList)[i])) if (CUI->getType() == Type::UByteTy) - (*(yyvsp[0].ValueList))[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + (*yyvsp[0].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); - if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), *(yyvsp[0].ValueList), true)) + if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, *yyvsp[0].ValueList, true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*(yyvsp[-2].TypeVal))->getDescription()+ "'!"); - Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal)); + (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); + Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal); CHECK_FOR_ERROR - (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[0].ValueList)); - delete (yyvsp[-2].TypeVal); - delete (yyvsp[0].ValueList); - ;} - break; - - - default: break; - } - -/* Line 1126 of yacc.c. */ -#line 5222 "llvmAsmParser.tab.c" + yyval.InstVal = new GetElementPtrInst(tmpVal, *yyvsp[0].ValueList); + delete yyvsp[-2].TypeVal; + delete yyvsp[0].ValueList; + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif - - YY_STACK_PRINT (yyss, yyssp); +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif *++yyvsp = yyval; +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTOKENS]; + yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; +yyerrlab: /* here on detecting error */ -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ { ++yynerrs; -#if YYERROR_VERBOSE + +#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; - if (YYPACT_NINF < yyn && yyn < YYLAST) + if (yyn > YYFLAG && yyn < YYLAST) { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - char *yymsg = 0; -# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -#if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -#endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= yysize1 < yysize; - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= yysize1 < yysize; - yysize = yysize1; - - if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg) + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yymsg; - int yyi = 0; - while ((*yyp = *yyf)) + strcpy(msg, "parse error"); + + if (count < 5) { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } } - yyerror (yymsg); - YYSTACK_FREE (yymsg); + yyerror(msg); + free(msg); } else - { - yyerror (YY_("syntax error")); - goto yyexhaustedlab; - } + yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ - yyerror (YY_("syntax error")); + yyerror("parse error"); } - + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + /* if just tried and failed to reuse lookahead token after an error, discard it. */ - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", yytoken, &yylval); - yychar = YYEMPTY; - } + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; } - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; + /* Else will try to reuse lookahead token + after shifting the error token. */ + yyerrstatus = 3; /* Each real token shifted decrements this */ -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (0) - goto yyerrorlab; + goto yyerrhandle; -yyvsp -= yylen; - yyssp -= yylen; - yystate = *yyssp; - goto yyerrlab1; +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif +yyerrpop: /* pop the current state because it cannot handle the error token */ -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif - for (;;) +#if YYDEBUG != 0 + if (yydebug) { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; - yydestruct ("Error: popping", yystos[yystate], yyvsp); - YYPOPSTACK; - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; } + else if (yyn == 0) + goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; - *++yyvsp = yylval; - +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif yystate = yyn; goto yynewstate; + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 0; -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK; - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif - return yyresult; + } + return 1; } - - -#line 2747 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2749 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" void llvm::GenerateError(const std::string &message, int LineNo) { @@ -5509,4 +4673,3 @@ GenerateError(errMsg); return 0; } - Index: llvm/lib/AsmParser/llvmAsmParser.h.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.11 llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.12 --- llvm/lib/AsmParser/llvmAsmParser.h.cvs:1.11 Mon Oct 9 12:36:59 2006 +++ llvm/lib/AsmParser/llvmAsmParser.h.cvs Sun Oct 15 18:27:25 2006 @@ -1,254 +1,4 @@ -/* A Bison parser, made by GNU Bison 2.1. */ - -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - ESINT64VAL = 258, - EUINT64VAL = 259, - SINTVAL = 260, - UINTVAL = 261, - FPVAL = 262, - VOID = 263, - BOOL = 264, - SBYTE = 265, - UBYTE = 266, - SHORT = 267, - USHORT = 268, - INT = 269, - UINT = 270, - LONG = 271, - ULONG = 272, - FLOAT = 273, - DOUBLE = 274, - TYPE = 275, - LABEL = 276, - VAR_ID = 277, - LABELSTR = 278, - STRINGCONSTANT = 279, - IMPLEMENTATION = 280, - ZEROINITIALIZER = 281, - TRUETOK = 282, - FALSETOK = 283, - BEGINTOK = 284, - ENDTOK = 285, - DECLARE = 286, - GLOBAL = 287, - CONSTANT = 288, - SECTION = 289, - VOLATILE = 290, - TO = 291, - DOTDOTDOT = 292, - NULL_TOK = 293, - UNDEF = 294, - CONST = 295, - INTERNAL = 296, - LINKONCE = 297, - WEAK = 298, - APPENDING = 299, - DLLIMPORT = 300, - DLLEXPORT = 301, - EXTERN_WEAK = 302, - OPAQUE = 303, - NOT = 304, - EXTERNAL = 305, - TARGET = 306, - TRIPLE = 307, - ENDIAN = 308, - POINTERSIZE = 309, - LITTLE = 310, - BIG = 311, - ALIGN = 312, - DEPLIBS = 313, - CALL = 314, - TAIL = 315, - ASM_TOK = 316, - MODULE = 317, - SIDEEFFECT = 318, - CC_TOK = 319, - CCC_TOK = 320, - CSRETCC_TOK = 321, - FASTCC_TOK = 322, - COLDCC_TOK = 323, - X86_STDCALLCC_TOK = 324, - X86_FASTCALLCC_TOK = 325, - RET = 326, - BR = 327, - SWITCH = 328, - INVOKE = 329, - UNWIND = 330, - UNREACHABLE = 331, - ADD = 332, - SUB = 333, - MUL = 334, - DIV = 335, - REM = 336, - AND = 337, - OR = 338, - XOR = 339, - SETLE = 340, - SETGE = 341, - SETLT = 342, - SETGT = 343, - SETEQ = 344, - SETNE = 345, - MALLOC = 346, - ALLOCA = 347, - FREE = 348, - LOAD = 349, - STORE = 350, - GETELEMENTPTR = 351, - PHI_TOK = 352, - CAST = 353, - SELECT = 354, - SHL = 355, - SHR = 356, - VAARG = 357, - EXTRACTELEMENT = 358, - INSERTELEMENT = 359, - SHUFFLEVECTOR = 360, - VAARG_old = 361, - VANEXT_old = 362 - }; -#endif -/* Tokens. */ -#define ESINT64VAL 258 -#define EUINT64VAL 259 -#define SINTVAL 260 -#define UINTVAL 261 -#define FPVAL 262 -#define VOID 263 -#define BOOL 264 -#define SBYTE 265 -#define UBYTE 266 -#define SHORT 267 -#define USHORT 268 -#define INT 269 -#define UINT 270 -#define LONG 271 -#define ULONG 272 -#define FLOAT 273 -#define DOUBLE 274 -#define TYPE 275 -#define LABEL 276 -#define VAR_ID 277 -#define LABELSTR 278 -#define STRINGCONSTANT 279 -#define IMPLEMENTATION 280 -#define ZEROINITIALIZER 281 -#define TRUETOK 282 -#define FALSETOK 283 -#define BEGINTOK 284 -#define ENDTOK 285 -#define DECLARE 286 -#define GLOBAL 287 -#define CONSTANT 288 -#define SECTION 289 -#define VOLATILE 290 -#define TO 291 -#define DOTDOTDOT 292 -#define NULL_TOK 293 -#define UNDEF 294 -#define CONST 295 -#define INTERNAL 296 -#define LINKONCE 297 -#define WEAK 298 -#define APPENDING 299 -#define DLLIMPORT 300 -#define DLLEXPORT 301 -#define EXTERN_WEAK 302 -#define OPAQUE 303 -#define NOT 304 -#define EXTERNAL 305 -#define TARGET 306 -#define TRIPLE 307 -#define ENDIAN 308 -#define POINTERSIZE 309 -#define LITTLE 310 -#define BIG 311 -#define ALIGN 312 -#define DEPLIBS 313 -#define CALL 314 -#define TAIL 315 -#define ASM_TOK 316 -#define MODULE 317 -#define SIDEEFFECT 318 -#define CC_TOK 319 -#define CCC_TOK 320 -#define CSRETCC_TOK 321 -#define FASTCC_TOK 322 -#define COLDCC_TOK 323 -#define X86_STDCALLCC_TOK 324 -#define X86_FASTCALLCC_TOK 325 -#define RET 326 -#define BR 327 -#define SWITCH 328 -#define INVOKE 329 -#define UNWIND 330 -#define UNREACHABLE 331 -#define ADD 332 -#define SUB 333 -#define MUL 334 -#define DIV 335 -#define REM 336 -#define AND 337 -#define OR 338 -#define XOR 339 -#define SETLE 340 -#define SETGE 341 -#define SETLT 342 -#define SETGT 343 -#define SETEQ 344 -#define SETNE 345 -#define MALLOC 346 -#define ALLOCA 347 -#define FREE 348 -#define LOAD 349 -#define STORE 350 -#define GETELEMENTPTR 351 -#define PHI_TOK 352 -#define CAST 353 -#define SELECT 354 -#define SHL 355 -#define SHR 356 -#define VAARG 357 -#define EXTRACTELEMENT 358 -#define INSERTELEMENT 359 -#define SHUFFLEVECTOR 360 -#define VAARG_old 361 -#define VANEXT_old 362 - - - - -#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 974 "/proj/llvm/llvm/lib/AsmParser/llvmAsmParser.y" -typedef union YYSTYPE { +typedef union { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -287,14 +37,111 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -/* Line 1447 of yacc.c. */ -#line 292 "llvmAsmParser.tab.h" -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -extern YYSTYPE llvmAsmlval; - +#define ESINT64VAL 257 +#define EUINT64VAL 258 +#define SINTVAL 259 +#define UINTVAL 260 +#define FPVAL 261 +#define VOID 262 +#define BOOL 263 +#define SBYTE 264 +#define UBYTE 265 +#define SHORT 266 +#define USHORT 267 +#define INT 268 +#define UINT 269 +#define LONG 270 +#define ULONG 271 +#define FLOAT 272 +#define DOUBLE 273 +#define TYPE 274 +#define LABEL 275 +#define VAR_ID 276 +#define LABELSTR 277 +#define STRINGCONSTANT 278 +#define IMPLEMENTATION 279 +#define ZEROINITIALIZER 280 +#define TRUETOK 281 +#define FALSETOK 282 +#define BEGINTOK 283 +#define ENDTOK 284 +#define DECLARE 285 +#define GLOBAL 286 +#define CONSTANT 287 +#define SECTION 288 +#define VOLATILE 289 +#define TO 290 +#define DOTDOTDOT 291 +#define NULL_TOK 292 +#define UNDEF 293 +#define CONST 294 +#define INTERNAL 295 +#define LINKONCE 296 +#define WEAK 297 +#define APPENDING 298 +#define DLLIMPORT 299 +#define DLLEXPORT 300 +#define EXTERN_WEAK 301 +#define OPAQUE 302 +#define NOT 303 +#define EXTERNAL 304 +#define TARGET 305 +#define TRIPLE 306 +#define ENDIAN 307 +#define POINTERSIZE 308 +#define LITTLE 309 +#define BIG 310 +#define ALIGN 311 +#define DEPLIBS 312 +#define CALL 313 +#define TAIL 314 +#define ASM_TOK 315 +#define MODULE 316 +#define SIDEEFFECT 317 +#define CC_TOK 318 +#define CCC_TOK 319 +#define CSRETCC_TOK 320 +#define FASTCC_TOK 321 +#define COLDCC_TOK 322 +#define X86_STDCALLCC_TOK 323 +#define X86_FASTCALLCC_TOK 324 +#define RET 325 +#define BR 326 +#define SWITCH 327 +#define INVOKE 328 +#define UNWIND 329 +#define UNREACHABLE 330 +#define ADD 331 +#define SUB 332 +#define MUL 333 +#define DIV 334 +#define REM 335 +#define AND 336 +#define OR 337 +#define XOR 338 +#define SETLE 339 +#define SETGE 340 +#define SETLT 341 +#define SETGT 342 +#define SETEQ 343 +#define SETNE 344 +#define MALLOC 345 +#define ALLOCA 346 +#define FREE 347 +#define LOAD 348 +#define STORE 349 +#define GETELEMENTPTR 350 +#define PHI_TOK 351 +#define CAST 352 +#define SELECT 353 +#define SHL 354 +#define SHR 355 +#define VAARG 356 +#define EXTRACTELEMENT 357 +#define INSERTELEMENT 358 +#define SHUFFLEVECTOR 359 +#define VAARG_old 360 +#define VANEXT_old 361 +extern YYSTYPE llvmAsmlval; Index: llvm/lib/AsmParser/llvmAsmParser.y.cvs diff -u llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.16 llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.17 --- llvm/lib/AsmParser/llvmAsmParser.y.cvs:1.16 Mon Oct 9 12:36:59 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y.cvs Sun Oct 15 18:27:25 2006 @@ -1296,6 +1296,8 @@ CHECK_FOR_ERROR } | UpRTypes '*' { // Pointer type? + if (*$1 == Type::LabelTy) + GEN_ERROR("Cannot form a pointer to a basic block"); $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1))); delete $1; CHECK_FOR_ERROR