From b3d2acb6dce9a25f433c2d5d5bae48e9d2b4149a Mon Sep 17 00:00:00 2001
From: Richard Sandiford <richard.sandiford@arm.com>
Date: Thu, 26 May 2016 15:49:22 +0000
Subject: [PATCH] Fix ivopts estimates for internal functions

tree-ssa-loop-ivopts.c:loop_body_includes_call was treating internal
calls such as IFN_SQRT as clobbering all caller-saved registers, which
I don't think is appropriate for any current internal function.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.

gcc/
	* tree-ssa-loop-ivopts.c (loop_body_includes_call): Don't assume
	that internal functions will clobber all caller-saved registers.

From-SVN: r236780
---
 gcc/ChangeLog              | 5 +++++
 gcc/tree-ssa-loop-ivopts.c | 1 +
 2 files changed, 6 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8fe8a26f394b..d31de13336fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-26  Richard Sandiford  <richard.sandiford@arm.com>
+
+	* tree-ssa-loop-ivopts.c (loop_body_includes_call): Don't assume
+	that internal functions will clobber all caller-saved registers.
+
 2016-05-26  Wilco Dijkstra  <wdijkstr@arm.com>
 
 	* config/aarch64/aarch64.c (aarch64_case_values_threshold):
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 9ce6b6495197..23c988620c35 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -7643,6 +7643,7 @@ loop_body_includes_call (basic_block *body, unsigned num_nodes)
       {
 	gimple *stmt = gsi_stmt (gsi);
 	if (is_gimple_call (stmt)
+	    && !gimple_call_internal_p (stmt)
 	    && !is_inexpensive_builtin (gimple_call_fndecl (stmt)))
 	  return true;
       }
-- 
GitLab