Be conservative with arithmetic jmp-function types

2017-11-29  Martin Jambor  <mjambor@suse.cz>

	PR ipa/82808
	* tree.c (expr_type_first_operand_type_p): New function.
	* tree.h (expr_type_first_operand_type_p): Declare it.
	* ipa-cp.c (ipa_get_jf_pass_through_result): Use it.

testsuite/
	* gcc.dg/ipa/pr82808.c: New test.

From-SVN: r255256
This commit is contained in:
Martin Jambor 2017-11-29 23:13:34 +01:00 committed by Martin Jambor
parent 330f2c9882
commit daccaeb998
6 changed files with 97 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2017-11-29 Martin Jambor <mjambor@suse.cz>
PR ipa/82808
* tree.c (expr_type_first_operand_type_p): New function.
* tree.h (expr_type_first_operand_type_p): Declare it.
* ipa-cp.c (ipa_get_jf_pass_through_result): Use it.
2017-11-29 Daniel Cederman <cederman@gaisler.com>
Backport from mainline

View File

@ -1224,20 +1224,20 @@ ipa_get_jf_pass_through_result (struct ipa_jump_func *jfunc, tree input)
if (!is_gimple_ip_invariant (input))
return NULL_TREE;
if (TREE_CODE_CLASS (ipa_get_jf_pass_through_operation (jfunc))
== tcc_unary)
res = fold_unary (ipa_get_jf_pass_through_operation (jfunc),
TREE_TYPE (input), input);
tree_code opcode = ipa_get_jf_pass_through_operation (jfunc);
if (TREE_CODE_CLASS (opcode) == tcc_comparison)
restype = boolean_type_node;
else if (expr_type_first_operand_type_p (opcode))
restype = TREE_TYPE (input);
else
{
if (TREE_CODE_CLASS (ipa_get_jf_pass_through_operation (jfunc))
== tcc_comparison)
restype = boolean_type_node;
else
restype = TREE_TYPE (input);
res = fold_binary (ipa_get_jf_pass_through_operation (jfunc), restype,
input, ipa_get_jf_pass_through_operand (jfunc));
}
return NULL_TREE;
if (TREE_CODE_CLASS (opcode) == tcc_unary)
res = fold_unary (opcode, restype, input);
else
res = fold_binary (opcode, restype, input,
ipa_get_jf_pass_through_operand (jfunc));
if (res && !is_gimple_ip_invariant (res))
return NULL_TREE;

View File

@ -1,3 +1,8 @@
2017-11-29 Martin Jambor <mjambor@suse.cz>
PR ipa/82808
* gcc.dg/ipa/pr82808.c: New test.
2017-11-23 Paul Thomas <pault@gcc.gnu.org>
Backported from trunk

View File

@ -0,0 +1,27 @@
/* { dg-options "-O2" } */
/* { dg-do run } */
static void __attribute__((noinline))
foo (double *a, double x)
{
*a = x;
}
static double __attribute__((noinline))
f_c1 (int m, double *a)
{
foo (a, m);
return *a;
}
int
main (){
double data;
double ret = 0 ;
if ((ret = f_c1 (2, &data)) != 2)
{
__builtin_abort ();
}
return 0;
}

View File

@ -14515,6 +14515,50 @@ get_nonnull_args (const_tree fntype)
return argmap;
}
/* Return true if an expression with CODE has to have the same result type as
its first operand. */
bool
expr_type_first_operand_type_p (tree_code code)
{
switch (code)
{
case NEGATE_EXPR:
case ABS_EXPR:
case BIT_NOT_EXPR:
case PAREN_EXPR:
case CONJ_EXPR:
case PLUS_EXPR:
case MINUS_EXPR:
case MULT_EXPR:
case TRUNC_DIV_EXPR:
case CEIL_DIV_EXPR:
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
case TRUNC_MOD_EXPR:
case CEIL_MOD_EXPR:
case FLOOR_MOD_EXPR:
case ROUND_MOD_EXPR:
case RDIV_EXPR:
case EXACT_DIV_EXPR:
case MIN_EXPR:
case MAX_EXPR:
case BIT_IOR_EXPR:
case BIT_XOR_EXPR:
case BIT_AND_EXPR:
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case LROTATE_EXPR:
case RROTATE_EXPR:
return true;
default:
return false;
}
}
#if CHECKING_P
namespace selftest {

View File

@ -5471,6 +5471,7 @@ extern void gt_pch_nx (tree &, gt_pointer_operator, void *);
extern bool nonnull_arg_p (const_tree);
extern bool is_redundant_typedef (const_tree);
extern bool expr_type_first_operand_type_p (tree_code);
extern location_t
set_source_range (tree expr, location_t start, location_t finish);