Commit 7cf57259 by Kazu Hirata Committed by Kazu Hirata

fold-const.c (fold_ternary): Take decomposed arguments of CALL_EXPR.

	* fold-const.c (fold_ternary): Take decomposed arguments of
	CALL_EXPR.
	(fold): Update a call to fold_ternary.

From-SVN: r96880
parent 4c8fa2e5
2005-03-22 Kazu Hirata <kazu@cs.umass.edu>
* fold-const.c (fold_ternary): Take decomposed arguments of
CALL_EXPR.
(fold): Update a call to fold_ternary.
2005-03-22 Jakub Jelinek <jakub@redhat.com> 2005-03-22 Jakub Jelinek <jakub@redhat.com>
PR target/20561 PR target/20561
......
...@@ -9693,28 +9693,20 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) ...@@ -9693,28 +9693,20 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
} /* switch (code) */ } /* switch (code) */
} }
/* Fold a ternary expression EXPR. Return the folded expression if /* Fold a ternary expression of code CODE and type TYPE with operands
folding is successful. Otherwise, return the original OP0, OP1, and OP2. Return the folded expression if folding is
expression. */ successful. Otherwise, return NULL_TREE. */
static tree static tree
fold_ternary (tree expr) fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
{ {
const tree t = expr;
const tree type = TREE_TYPE (expr);
tree tem; tree tem;
tree op0, op1, op2;
tree arg0 = NULL_TREE, arg1 = NULL_TREE; tree arg0 = NULL_TREE, arg1 = NULL_TREE;
enum tree_code code = TREE_CODE (t);
enum tree_code_class kind = TREE_CODE_CLASS (code); enum tree_code_class kind = TREE_CODE_CLASS (code);
gcc_assert (IS_EXPR_CODE_CLASS (kind) gcc_assert (IS_EXPR_CODE_CLASS (kind)
&& TREE_CODE_LENGTH (code) == 3); && TREE_CODE_LENGTH (code) == 3);
op0 = TREE_OPERAND (t, 0);
op1 = TREE_OPERAND (t, 1);
op2 = TREE_OPERAND (t, 2);
/* Strip any conversions that don't change the mode. This is safe /* Strip any conversions that don't change the mode. This is safe
for every expression, except for a comparison expression because for every expression, except for a comparison expression because
its signedness is derived from its operands. So, in the latter its signedness is derived from its operands. So, in the latter
...@@ -9909,8 +9901,8 @@ fold_ternary (tree expr) ...@@ -9909,8 +9901,8 @@ fold_ternary (tree expr)
&& TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
&& DECL_BUILT_IN (TREE_OPERAND (op0, 0))) && DECL_BUILT_IN (TREE_OPERAND (op0, 0)))
{ {
tree fndecl = get_callee_fndecl (t); tree fndecl = TREE_OPERAND (op0, 0);
tree arglist = TREE_OPERAND (t, 1); tree arglist = op1;
tree tmp = fold_builtin (fndecl, arglist, false); tree tmp = fold_builtin (fndecl, arglist, false);
if (tmp) if (tmp)
return tmp; return tmp;
...@@ -9950,7 +9942,7 @@ fold (tree expr) ...@@ -9950,7 +9942,7 @@ fold (tree expr)
if (IS_EXPR_CODE_CLASS (kind)) if (IS_EXPR_CODE_CLASS (kind))
{ {
tree type = TREE_TYPE (t); tree type = TREE_TYPE (t);
tree op0, op1; tree op0, op1, op2;
switch (TREE_CODE_LENGTH (code)) switch (TREE_CODE_LENGTH (code))
{ {
...@@ -9964,7 +9956,10 @@ fold (tree expr) ...@@ -9964,7 +9956,10 @@ fold (tree expr)
tem = fold_binary (code, type, op0, op1); tem = fold_binary (code, type, op0, op1);
return tem ? tem : expr; return tem ? tem : expr;
case 3: case 3:
tem = fold_ternary (expr); op0 = TREE_OPERAND (t, 0);
op1 = TREE_OPERAND (t, 1);
op2 = TREE_OPERAND (t, 2);
tem = fold_ternary (code, type, op0, op1, op2);
return tem ? tem : expr; return tem ? tem : expr;
default: default:
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment