rs6000: assign first operand of VEC_COND_EXPR to a SSA_NAME

Message ID a4cad070-02f2-5f65-4abe-a544f609906a@suse.cz
State New
Headers show
Series
  • rs6000: assign first operand of VEC_COND_EXPR to a SSA_NAME
Related show

Commit Message

Martin Liška June 18, 2020, 7:44 a.m.
Hi.

This breaks quite some powerpc.exp tests. Right now VEC_COND_EXPR expects first
argument to be a SSA_NAME (or constant) and so the patch fixes that.

Using the patch, I survive powerpc.exp test-suite.
Ready for master?
Martin

gcc/ChangeLog:

	* config/rs6000/rs6000-call.c (fold_build_vec_cmp):
	Assign first argument of VEC_COND_EXPR to a SSA_NAME.
	(fold_compare_helper): Pass gsi to fold_build_vec_cmp.
---
  gcc/config/rs6000/rs6000-call.c | 12 +++++++-----
  1 file changed, 7 insertions(+), 5 deletions(-)

-- 
2.27.0

Comments

Segher Boessenkool June 18, 2020, 8 a.m. | #1
Hi!

On Thu, Jun 18, 2020 at 09:44:58AM +0200, Martin Liška wrote:
> This breaks quite some powerpc.exp tests. Right now VEC_COND_EXPR expects 

> first

> argument to be a SSA_NAME (or constant) and so the patch fixes that.


What does this mean?  All context is missing here.

Also, is expecting that correct or not?  Was that a change?  Please
explain.

> Using the patch, I survive powerpc.exp test-suite.


So this patch does *not* break quite some tests, it fixes them instead?

Please fix your commit message (and the Subject: even).

> diff --git a/gcc/config/rs6000/rs6000-call.c 

> b/gcc/config/rs6000/rs6000-call.c

> index 817a14c9c0d..f613d372a13 100644

> --- a/gcc/config/rs6000/rs6000-call.c

> +++ b/gcc/config/rs6000/rs6000-call.c

> @@ -10716,14 +10716,16 @@ rs6000_builtin_valid_without_lhs (enum 

> rs6000_builtins fn_code)

>     CODE indicates which comparison is to be made. (EQ, GT, ...).

>     TYPE indicates the type of the result.  */

>  static tree

> -fold_build_vec_cmp (tree_code code, tree type,

> -		    tree arg0, tree arg1)

> +fold_build_vec_cmp (tree_code code, tree type, tree arg0, tree arg1,

> +		    gimple_stmt_iterator *gsi)


The comment needs changing, explaining what the new arg is.


Segher

Patch

diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
index 817a14c9c0d..f613d372a13 100644
--- a/gcc/config/rs6000/rs6000-call.c
+++ b/gcc/config/rs6000/rs6000-call.c
@@ -10716,14 +10716,16 @@  rs6000_builtin_valid_without_lhs (enum rs6000_builtins fn_code)
     CODE indicates which comparison is to be made. (EQ, GT, ...).
     TYPE indicates the type of the result.  */
  static tree
-fold_build_vec_cmp (tree_code code, tree type,
-		    tree arg0, tree arg1)
+fold_build_vec_cmp (tree_code code, tree type, tree arg0, tree arg1,
+		    gimple_stmt_iterator *gsi)
  {
    tree cmp_type = truth_type_for (type);
    tree zero_vec = build_zero_cst (type);
    tree minus_one_vec = build_minus_one_cst (type);
-  tree cmp = fold_build2 (code, cmp_type, arg0, arg1);
-  return fold_build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
+  tree temp = create_tmp_reg_or_ssa_name (cmp_type);
+  gimple *g = gimple_build_assign (temp, code, arg0, arg1);
+  gsi_insert_before (gsi, g, GSI_SAME_STMT);
+  return fold_build3 (VEC_COND_EXPR, type, temp, minus_one_vec, zero_vec);
  }
  
  /* Helper function to handle the in-between steps for the
@@ -10734,7 +10736,7 @@  fold_compare_helper (gimple_stmt_iterator *gsi, tree_code code, gimple *stmt)
    tree arg0 = gimple_call_arg (stmt, 0);
    tree arg1 = gimple_call_arg (stmt, 1);
    tree lhs = gimple_call_lhs (stmt);
-  tree cmp = fold_build_vec_cmp (code, TREE_TYPE (lhs), arg0, arg1);
+  tree cmp = fold_build_vec_cmp (code, TREE_TYPE (lhs), arg0, arg1, gsi);
    gimple *g = gimple_build_assign (lhs, cmp);
    gimple_set_location (g, gimple_location (stmt));
    gsi_replace (gsi, g, true);