From 99f94ae5018e915d0c1db1b6d4110d68bc4d242e Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 26 Mar 2021 16:08:36 +0000 Subject: [PATCH] aarch64: Cost comparisons embedded in COND_EXPRs So far the costing of COND_EXPRs hasn't distinguished between cases in which the condition is calculated separately or is built into the COND_EXPR itself. This patch adds the cost of any embedded comparison. Like with the previous patches, this one only becomes active if a CPU selects use_new_vector_costs. It should therefore have a very low impact on other CPUs. gcc/ * config/aarch64/aarch64.c (aarch64_embedded_comparison_type): New function. (aarch64_adjust_stmt_cost): Add the costs of embedded scalar and vector comparisons. --- gcc/config/aarch64/aarch64.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index e2d92f0..e97e71b 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -14392,6 +14392,21 @@ aarch64_ld234_st234_vectors (vect_cost_for_stmt kind, stmt_vec_info stmt_info) return 0; } +/* If STMT_INFO is a COND_EXPR that includes an embedded comparison, return the + scalar type of the values being compared. Return null otherwise. */ +static tree +aarch64_embedded_comparison_type (stmt_vec_info stmt_info) +{ + if (auto *assign = dyn_cast (stmt_info->stmt)) + if (gimple_assign_rhs_code (assign) == COND_EXPR) + { + tree cond = gimple_assign_rhs1 (assign); + if (COMPARISON_CLASS_P (cond)) + return TREE_TYPE (TREE_OPERAND (cond, 0)); + } + return NULL_TREE; +} + /* Return true if creating multiple copies of STMT_INFO for Advanced SIMD vectors would produce a series of LDP or STP operations. KIND is the kind of statement that STMT_INFO represents. */ @@ -14685,8 +14700,26 @@ aarch64_adjust_stmt_cost (vect_cost_for_stmt kind, stmt_vec_info stmt_info, stmt_cost += simd_costs->ld4_st4_permute_cost; break; } + + if (kind == vector_stmt || kind == vec_to_scalar) + if (tree cmp_type = aarch64_embedded_comparison_type (stmt_info)) + { + if (FLOAT_TYPE_P (cmp_type)) + stmt_cost += simd_costs->fp_stmt_cost; + else + stmt_cost += simd_costs->int_stmt_cost; + } } + if (kind == scalar_stmt) + if (tree cmp_type = aarch64_embedded_comparison_type (stmt_info)) + { + if (FLOAT_TYPE_P (cmp_type)) + stmt_cost += aarch64_tune_params.vec_costs->scalar_fp_stmt_cost; + else + stmt_cost += aarch64_tune_params.vec_costs->scalar_int_stmt_cost; + } + return stmt_cost; } -- 2.7.4