For floating point multiply, we have nice code in reassoc to reassociate multiplications to almost optimal sequence of as few multiplications as possible (or library call), but for integral types we just give up because there is no __builtin_powi* for those types. As there is no library routine we could use, instead of adding new internal call just to hold it temporarily and then lower to multiplications again, this patch for the integral types calls into the sincos pass routine that expands it into multiplications right away. 2021-01-11 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/95867 * tree-ssa-math-opts.h: New header. * tree-ssa-math-opts.c: Include tree-ssa-math-opts.h. (powi_as_mults): No longer static. Use build_one_cst instead of build_real. Formatting fix. * tree-ssa-reassoc.c: Include tree-ssa-math-opts.h. (attempt_builtin_powi): Handle multiplication reassociation without powi_fndecl using powi_as_mults. (reassociate_bb): For integral types don't require -funsafe-math-optimizations to call attempt_builtin_powi. * gcc.dg/tree-ssa/pr95867.c: New test.
27 lines
943 B
C
27 lines
943 B
C
/* Global, SSA-based optimizations using mathematical identities.
|
|
Copyright (C) 2021 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GCC_TREE_SSA_MATH_OPTS_H
|
|
#define GCC_TREE_SSA_MATH_OPTS_H
|
|
|
|
extern tree powi_as_mults (gimple_stmt_iterator *, location_t,
|
|
tree, HOST_WIDE_INT);
|
|
|
|
#endif /* GCC_TREE_SSA_MATH_OPTS_H */
|