This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Allow fpmath differences in inlining when callee doesn't use FP math
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: ubizjak at gmail dot com, Jan Hubicka <jh at suse dot de>
- Date: Thu, 24 Aug 2017 13:10:58 +0200 (CEST)
- Subject: [PATCH] Allow fpmath differences in inlining when callee doesn't use FP math
- Authentication-results: sourceware.org; auth=none
This adjusts the x86 backend to allow -mfpmath differences when
deciding whether to allow inlining. -mfpmath doesn't really
matter for functions not containing FP operations.
It appears that the can_inline_p target hook is called from the
C++ FE for multi-versioning, thus the ! ipa_fn_summaries check.
Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for trunk?
Incidentically this fixes the bootstrap issue I have when enabling
free-lang-data without LTO.
It doesn't fully solve the fpmath difference issue we have with
intrinsics but is an optimization.
Thanks,
Richard.
2017-08-24 Richard Biener <rguenther@suse.de>
* config/i386/i386.c: Include symbol-summary.h, ipa-prop.h
and ipa-fnsummary.h.
(ix86_can_inline_p): When ix86_fpmath flags do not match
check whether the callee uses FP math at all.
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c (revision 251307)
+++ gcc/config/i386/i386.c (working copy)
@@ -85,6 +85,9 @@ along with GCC; see the file COPYING3.
#include "print-rtl.h"
#include "intl.h"
#include "ifcvt.h"
+#include "symbol-summary.h"
+#include "ipa-prop.h"
+#include "ipa-fnsummary.h"
/* This file should be included last. */
#include "target-def.h"
@@ -7544,7 +7547,14 @@ ix86_can_inline_p (tree caller, tree cal
else if (caller_opts->tune != callee_opts->tune)
ret = false;
- else if (caller_opts->x_ix86_fpmath != callee_opts->x_ix86_fpmath)
+ else if (caller_opts->x_ix86_fpmath != callee_opts->x_ix86_fpmath
+ /* If the calle doesn't use FP expressions differences in
+ ix86_fpmath can be ignored. We are called from FEs
+ for multi-versioning call optimization, so beware of
+ ipa_fn_summaries not available. */
+ && (! ipa_fn_summaries
+ || ipa_fn_summaries->get
+ (cgraph_node::get (callee))->fp_expressions))
ret = false;
else if (caller_opts->branch_cost != callee_opts->branch_cost)