From: ghazi Date: Tue, 20 Apr 2010 20:09:17 +0000 (+0000) Subject: * builtins.c (build_complex_cproj, fold_builtin_cproj): New. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=425c2ebd080b37b3dba1259f988c22c2bbd63a67 * builtins.c (build_complex_cproj, fold_builtin_cproj): New. (fold_builtin_1): Fold builtin cproj. * builtins.def (BUILT_IN_CPROJ, BUILT_IN_CPROJF, BUILT_IN_CPROJL): Use ATTR_CONST_NOTHROW_LIST. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158573 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bf80f7e2bfa..aac93680541 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-04-20 Kaveh R. Ghazi + + * builtins.c (build_complex_cproj, fold_builtin_cproj): New. + (fold_builtin_1): Fold builtin cproj. + * builtins.def (BUILT_IN_CPROJ, BUILT_IN_CPROJF, BUILT_IN_CPROJL): + Use ATTR_CONST_NOTHROW_LIST. + 2010-04-20 Uros Bizjak * config/i386/i386.md (ffs2): Macroize expander from ffs_cmove diff --git a/gcc/builtins.c b/gcc/builtins.c index 8541b829801..8c3c8e0f4be 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1322,7 +1322,7 @@ apply_result_size (void) size = 0; for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) - if (targetm.calls.function_value_regno_p (regno)) + if (FUNCTION_VALUE_REGNO_P (regno)) { mode = reg_raw_mode[regno]; @@ -7082,33 +7082,6 @@ fold_builtin_cproj (location_t loc, tree arg, tree type) else return arg; } - else if (TREE_CODE (arg) == COMPLEX_EXPR) - { - tree real = TREE_OPERAND (arg, 0); - tree imag = TREE_OPERAND (arg, 1); - - STRIP_NOPS (real); - STRIP_NOPS (imag); - - /* If the real part is inf and the imag part is known to be - nonnegative, return (inf + 0i). Remember side-effects are - possible in the imag part. */ - if (TREE_CODE (real) == REAL_CST - && real_isinf (TREE_REAL_CST_PTR (real)) - && tree_expr_nonnegative_p (imag)) - return omit_one_operand_loc (loc, type, - build_complex_cproj (type, false), - arg); - - /* If the imag part is inf, return (inf+I*copysign(0,imag)). - Remember side-effects are possible in the real part. */ - if (TREE_CODE (imag) == REAL_CST - && real_isinf (TREE_REAL_CST_PTR (imag))) - return - omit_one_operand_loc (loc, type, - build_complex_cproj (type, TREE_REAL_CST_PTR - (imag)->sign), arg); - } return NULL_TREE; } @@ -9817,6 +9790,7 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore) enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl); switch (fcode) { + case BUILT_IN_CONSTANT_P: { tree val = fold_builtin_constant_p (arg0); @@ -10198,11 +10172,6 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore) case BUILT_IN_VPRINTF: return fold_builtin_printf (loc, fndecl, arg0, NULL_TREE, ignore, fcode); - case BUILT_IN_FREE: - if (integer_zerop (arg0)) - return build_empty_stmt (loc); - break; - default: break; } @@ -10701,8 +10670,9 @@ fold_call_expr (location_t loc, tree exp, bool ignore) if (avoid_folding_inline_builtin (fndecl)) return NULL_TREE; + /* FIXME: Don't use a list in this interface. */ if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD) - return targetm.fold_builtin (fndecl, exp, ignore); + return targetm.fold_builtin (fndecl, CALL_EXPR_ARGS (exp), ignore); else { if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3716d4721b2..35c015fb493 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-20 Kaveh R. Ghazi + + * gcc.dg/torture/builtin-cproj-1.c: New. + * gcc.dg/torture/builtin-cproj-2.c: New. + 2010-04-20 Dodji Seketeli PR c++/43800 diff --git a/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c b/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c index 31cd5874ffb..24540310b66 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c @@ -44,80 +44,7 @@ extern void link_error(int); link_error(__LINE__); \ } while (0) -/* Test that cproj(X + I*INF) -> (ZERO + INF), where ZERO is +-0i. - NEG is either blank or a minus sign when ZERO is negative. */ -#define TEST_IMAG_INF(NEG,ZERO) do { \ - if (CPROJF(f+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJF(f+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ - if (CPROJ(d+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJ(d+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ - if (CPROJL(ld+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJL(ld+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ -} while (0) - -/* Like TEST_IMAG_INF, but check that side effects are honored. */ -#define TEST_IMAG_INF_SIDE_EFFECT(NEG,ZERO) do { \ - int side = 4; \ - if (CPROJF(++side+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJF(++side+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ - if (CPROJ(++side+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJ(++side+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ - if (CPROJL(++side+I*NEG INF) != ZERO+INF \ - || CKSGN_I (CPROJL(++side+I*NEG INF), ZERO+INF)) \ - link_error(__LINE__); \ - if (side != 10) \ - link_error(__LINE__); \ -} while (0) - -/* Test that cproj(INF, POSITIVE) -> INF+0i. NEG is either blank or a - minus sign to test negative INF. */ -#define TEST_REAL_INF(NEG) do { \ - __real cf = NEG INF; \ - __imag cf = (x ? 4 : 5); \ - if (CPROJF(cf) != INF \ - || CKSGN_I (CPROJF(cf), INF)) \ - link_error(__LINE__); \ - __real cd = NEG INF; \ - __imag cd = (x ? 4 : 5); \ - if (CPROJ(cd) != INF \ - || CKSGN_I (CPROJ(cd), INF)) \ - link_error(__LINE__); \ - __real cld = NEG INF; \ - __imag cld = (x ? 4 : 5); \ - if (CPROJL(cld) != INF \ - || CKSGN_I (CPROJL(cld), INF)) \ - link_error(__LINE__); \ -} while (0) - -/* Like TEST_REAL_INF, but check that side effects are honored. */ -#define TEST_REAL_INF_SIDE_EFFECT(NEG) do { \ - int side = -9; \ - __real cf = NEG INF; \ - __imag cf = (x ? 4 : 5); \ - if (CPROJF((++side,cf)) != INF \ - || CKSGN_I (CPROJF((++side,cf)), INF)) \ - link_error(__LINE__); \ - __real cd = NEG INF; \ - __imag cd = (x ? 4 : 5); \ - if (CPROJ((++side,cd)) != INF \ - || CKSGN_I (CPROJ((++side,cd)), INF)) \ - link_error(__LINE__); \ - __real cld = NEG INF; \ - __imag cld = (x ? 4 : 5); \ - if (CPROJL((++side,cld)) != INF \ - || CKSGN_I (CPROJL((++side,cld)), INF)) \ - link_error(__LINE__); \ - if (side != -3) \ - link_error(__LINE__); \ -} while (0) - -void foo (_Complex long double cld, _Complex double cd, _Complex float cf, - long double ld, double d, float f, int x) +void foo (void) { TEST_CST_INF (INF+0I, 0); TEST_CST_INF (INF-0I, -0.FI); @@ -152,20 +79,6 @@ void foo (_Complex long double cld, _Complex double cd, _Complex float cf, TEST_CST (-22+3I); TEST_CST (-22-3I); - TEST_IMAG_INF (,0.FI); - TEST_IMAG_INF (-,-0.FI); - -#ifdef __OPTIMIZE__ - TEST_REAL_INF( ); - TEST_REAL_INF(-); - - TEST_IMAG_INF_SIDE_EFFECT (,0.FI); - TEST_IMAG_INF_SIDE_EFFECT (-,-0.FI); - - TEST_REAL_INF_SIDE_EFFECT( ); - TEST_REAL_INF_SIDE_EFFECT(-); -#endif - return; }