The Java front end is not consistent in setting attributes for builtin functions. We rely on TREE_SIDE_EFFECTS and the ECF_* flags to determine whether a function call will clobber all call-clobbered variables. Applying the following patch to the operand scanner, will trigger several aborts in libjava because of this. It seems to me that neither TREE_SIDE_EFFECTS nor ECF_* flags are correct out of the Java front end. I am not familiar enough with the language to determine when it would be safe to set these attributes. Some seem obvious, but I'd rather leave this to someone in Java land. Index: tree-ssa-operands.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-ssa-operands.c,v retrieving revision 2.29 diff -d -c -p -r2.29 tree-ssa-operands.c *** tree-ssa-operands.c 12 Aug 2004 14:33:59 -0000 2.29 --- tree-ssa-operands.c 12 Aug 2004 16:55:59 -0000 *************** get_call_expr_operands (tree stmt, tree *** 1373,1383 **** /* A 'pure' or a 'const' functions never call clobber anything. A 'noreturn' function might, but since we don't return anyway there is no point in recording that. */ ! if (TREE_SIDE_EFFECTS (expr) ! && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN))) ! add_call_clobber_ops (stmt); else if (!(call_flags & (ECF_CONST | ECF_NORETURN))) ! add_call_read_ops (stmt); } } --- 1373,1397 ---- /* A 'pure' or a 'const' functions never call clobber anything. A 'noreturn' function might, but since we don't return anyway there is no point in recording that. */ ! if (!(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN))) ! { ! #if defined ENABLE_CHECKING ! /* If this is a clobbering call, it should have side-effects. */ ! if (!TREE_SIDE_EFFECTS (expr)) ! abort (); ! #endif ! add_call_clobber_ops (stmt); ! } else if (!(call_flags & (ECF_CONST | ECF_NORETURN))) ! { ! #if defined ENABLE_CHECKING ! /* If this is not a clobbering call, it should not have ! side-effects. */ ! if (TREE_SIDE_EFFECTS (expr)) ! abort (); ! #endif ! add_call_read_ops (stmt); ! } } }
Confirmed.
Diego, I need more information. How can a builtin clobber a variable? I don't get it.
What I want out of the Java FE is to set ECF_* flags accordingly. If a builtin function is not going to have side-effects, not only it should have TREE_SIDE_EFFECTS = 0, but it'd be nice if it also set one of the ECF_* flags, so that we can have the checks suggested in this patch.
Subject: Bug 17007 CVSROOT: /cvs/gcc Module name: gcc Changes by: aph@gcc.gnu.org 2004-09-29 14:13:18 Modified files: gcc/java : ChangeLog decl.c parse.y Log message: 2004-09-29 Andrew Haley <aph@redhat.com> PR java/17007 * parse.y (patch_binop): Don't mess with the TREE_SIDE_EFFECTS of the result of TRUNC_MOD_EXPR. (patch_unaryop): Likewise for CONVERT_EXPR, which may throw. * decl.c (java_init_decl_processing): Mark soft_lookupinterfacemethod_node and soft_instanceof_node pure. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1469&r2=1.1470 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/decl.c.diff?cvsroot=gcc&r1=1.197&r2=1.198 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&r1=1.512&r2=1.513
Fixed.