aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-math-opts.c
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2007-06-18 10:30:47 +0200
committerUros Bizjak <uros@gcc.gnu.org>2007-06-18 10:30:47 +0200
commitac10986fadc255c27db122daa244f8f71c5462f2 (patch)
treea70a489abddc4e7f99e532e8ae5b8057df6f9b21 /gcc/tree-ssa-math-opts.c
parenta8d8890adb3be434ee6eec4f104f322e6c247c5a (diff)
downloadgcc-ac10986fadc255c27db122daa244f8f71c5462f2.zip
gcc-ac10986fadc255c27db122daa244f8f71c5462f2.tar.gz
gcc-ac10986fadc255c27db122daa244f8f71c5462f2.tar.bz2
re PR tree-optimization/32383 (ICE with reciprocals and -ffast-math)
PR tree-optimization/32383 * targhooks.c (default_builtin_reciprocal): Add new bool argument. * targhooks.h (default_builtin_reciprocal): Update prototype. * target.h (struct gcc_target): Update builtin_reciprocal. * doc/tm.texi (TARGET_BUILTIN_RECIPROCAL): Update description. * tree-ssa-math-opts (execute_cse_reciprocals): Skip statements where arg1 is not SSA_NAME. Pass true to targetm.builtin_reciprocal when fndecl is in BUILT_IN_MD class. (execute_convert_to_rsqrt): Ditto. * config/i386/i386.c (ix86_builtin_reciprocal): Update for new bool argument. Convert IX86_BUILTIN_SQRTPS code only when md_fn is true. Convert BUILT_IN_SQRTF code only when md_fn is false. testsuite/ChangeLog: PR tree-optimization/32383 * testsuite/g++.dg/opt/pr32383.C: New test. From-SVN: r125790
Diffstat (limited to 'gcc/tree-ssa-math-opts.c')
-rw-r--r--gcc/tree-ssa-math-opts.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 0534dcf..0320ac1 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -507,7 +507,12 @@ execute_cse_reciprocals (void)
&& TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == RDIV_EXPR)
{
tree arg1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 1);
- tree stmt1 = SSA_NAME_DEF_STMT (arg1);
+ tree stmt1;
+
+ if (TREE_CODE (arg1) != SSA_NAME)
+ continue;
+
+ stmt1 = SSA_NAME_DEF_STMT (arg1);
if (TREE_CODE (stmt1) == GIMPLE_MODIFY_STMT
&& TREE_CODE (GIMPLE_STMT_OPERAND (stmt1, 1)) == CALL_EXPR
@@ -517,11 +522,14 @@ execute_cse_reciprocals (void)
|| DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD))
{
enum built_in_function code;
+ bool md_code;
tree arg10;
tree tmp;
code = DECL_FUNCTION_CODE (fndecl);
- fndecl = targetm.builtin_reciprocal (code, false);
+ md_code = DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD;
+
+ fndecl = targetm.builtin_reciprocal (code, md_code, false);
if (!fndecl)
continue;
@@ -791,15 +799,22 @@ execute_convert_to_rsqrt (void)
|| DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD))
{
enum built_in_function code;
+ bool md_code;
tree arg1;
tree stmt1;
code = DECL_FUNCTION_CODE (fndecl);
- fndecl = targetm.builtin_reciprocal (code, true);
+ md_code = DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD;
+
+ fndecl = targetm.builtin_reciprocal (code, md_code, true);
if (!fndecl)
continue;
arg1 = CALL_EXPR_ARG (GIMPLE_STMT_OPERAND (stmt, 1), 0);
+
+ if (TREE_CODE (arg1) != SSA_NAME)
+ continue;
+
stmt1 = SSA_NAME_DEF_STMT (arg1);
if (TREE_CODE (stmt1) == GIMPLE_MODIFY_STMT