From e68cc3a8f8a381e5018de4379546c56d1d456c56 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 18 Jun 2020 09:25:32 +0200 Subject: [PATCH] rs6000: Fix creation of VEC_COND_EXPR gcc/ChangeLog: * config/rs6000/rs6000-call.c (fold_build_vec_cmp): Since 502d63b6d6141597bb18fd23c87736a1b384cf8f, first argument of a VEC_COND_EXPR cannot be tcc_comparison and so that a SSA_NAME needs to be created before we use it for the first argument of the VEC_COND_EXPR. (fold_compare_helper): Pass gsi to fold_build_vec_cmp. --- gcc/config/rs6000/rs6000-call.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c index 817a14c9c0d..cf46fafd353 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -10714,16 +10714,19 @@ rs6000_builtin_valid_without_lhs (enum rs6000_builtins fn_code) operation. This sets up true/false vectors, and uses the VEC_COND_EXPR operation. CODE indicates which comparison is to be made. (EQ, GT, ...). - TYPE indicates the type of the result. */ + TYPE indicates the type of the result. + Code is inserted before GSI. */ 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 +10737,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); -- 2.30.2