From: Bill Schmidt Date: Mon, 4 Apr 2016 15:47:51 +0000 (+0000) Subject: re PR middle-end/70457 (ICE (segfault) in gimple_expand_builtin_pow on powerpc64le... X-Git-Tag: releases/gcc-4.9.4~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b741ea5cfa046a5b4e339fcdec99b6210f4dcb4b;p=thirdparty%2Fgcc.git re PR middle-end/70457 (ICE (segfault) in gimple_expand_builtin_pow on powerpc64le-linux-gnu) [gcc] 2016-04-04 Bill Schmidt Jakub Jelinek PR middle-end/70457 * tree-inline.c (estimate_num_insn): Use gimple_call_builtin_p to ensure a call statement is compatible with a built-in's prototype. * tree-ssa-math-opts.c (execute_cse_sincos_1): Likewise. (execute_cse_sincos): Likewise. (execute_optimize_widening_mul): Likewise. [gcc/testsuite] 2016-04-04 Bill Schmidt Jakub Jelinek PR middle-end/70457 * gcc.dg/torture/pr70457.c: New. Co-Authored-By: Jakub Jelinek From-SVN: r234718 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0f3186a4f7c..3f0037211e87 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-04-04 Bill Schmidt + Jakub Jelinek + + PR middle-end/70457 + * tree-inline.c (estimate_num_insn): Use gimple_call_builtin_p + to ensure a call statement is compatible with a built-in's + prototype. + * tree-ssa-math-opts.c (execute_cse_sincos_1): Likewise. + (execute_cse_sincos): Likewise. + (execute_optimize_widening_mul): Likewise. + 2016-03-31 Kyrylo Tkachov * config/arm/sync.md (arm_atomic_loaddi2_ldrd): Fix output template diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52bdf72a3df5..24c86d45b4f9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-04-04 Bill Schmidt + Jakub Jelinek + + PR middle-end/70457 + * gcc.dg/torture/pr70457.c: New. + 2016-03-31 Kyrylo Tkachov * gcc.target/arm/atomic_loaddi_relaxed_cond.c: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr70457.c b/gcc/testsuite/gcc.dg/torture/pr70457.c new file mode 100644 index 000000000000..74daed4d36f6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70457.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +/* This formerly ICEd when trying to expand pow as a built-in with + the wrong number of arguments. */ + +extern double pow (double, double) __attribute__ ((__nothrow__ , __leaf__)); + +typedef struct { + long long data; + int tag; +} Object; + +extern Object Make_Flonum (double); +extern Object P_Pow (Object, Object); + +Object General_Function (Object x, Object y, double (*fun)()) { + double d, ret; + + d = 1.0; + + if (y.tag >> 1) + ret = (*fun) (d); + else + ret = (*fun) (d, 0.0); + + return Make_Flonum (ret); +} + +Object P_Pow (Object x, Object y) { return General_Function (x, y, pow); } diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 5fd21fe0f30d..ee3bbad3bc6d 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3850,7 +3850,7 @@ estimate_num_insns (gimple stmt, eni_weights *weights) return 0; else if (is_inexpensive_builtin (decl)) return weights->target_builtin_call_cost; - else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) + else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) { /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so specialize the cheap expansion we do here. diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 0e8d54d34fee..0c40ade04c62 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -746,7 +746,7 @@ execute_cse_sincos_1 (tree name) if (gimple_code (use_stmt) != GIMPLE_CALL || !gimple_call_lhs (use_stmt) || !(fndecl = gimple_call_fndecl (use_stmt)) - || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL) + || !gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL)) continue; switch (DECL_FUNCTION_CODE (fndecl)) @@ -1437,7 +1437,7 @@ execute_cse_sincos (void) if (is_gimple_call (stmt) && gimple_call_lhs (stmt) && (fndecl = gimple_call_fndecl (stmt)) - && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) + && gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) { tree arg, arg0, arg1, result; HOST_WIDE_INT n; @@ -2860,7 +2860,7 @@ execute_optimize_widening_mul (void) { tree fndecl = gimple_call_fndecl (stmt); if (fndecl - && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) + && gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) { switch (DECL_FUNCTION_CODE (fndecl)) {