aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDorit Nuzman <dorit@il.ibm.com>2005-08-21 06:38:27 +0000
committerDorit Nuzman <dorit@gcc.gnu.org>2005-08-21 06:38:27 +0000
commit429268fc04441a4a6e31bc9e3c303a8f355f7c43 (patch)
tree9ef2d640818ab5af249622f39482a2b1d04efbf1 /gcc
parentb0b0f2b89574b6cfad59e4597463c83efc23d60e (diff)
downloadgcc-429268fc04441a4a6e31bc9e3c303a8f355f7c43.zip
gcc-429268fc04441a4a6e31bc9e3c303a8f355f7c43.tar.gz
gcc-429268fc04441a4a6e31bc9e3c303a8f355f7c43.tar.bz2
tree-vect-transform.c (get_initial_def_for_reduction): Set need_epilog_adjust back to false for MIN/MAX case.
* tree-vect-transform.c (get_initial_def_for_reduction): Set need_epilog_adjust back to false for MIN/MAX case. Set *scalar_def to NULL if need_epilog_adjust is false. (vect_create_epilog_for_reduction): Variable adjust_in_epilog removed. Case 3 always peels first itration, not just for PLUS case, and no need to use scalar_initial_def here. Create an epilog adjustment only if scalar_initial_def is not NULL. (vectorizable_reduction): Remove assert. From-SVN: r103314
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/tree-vect-transform.c63
2 files changed, 33 insertions, 42 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 122fa33..29c5316 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2005-08-21 Dorit Nuzman <dorit@il.ibm.com>
+
+ * tree-vect-transform.c (get_initial_def_for_reduction): Set
+ need_epilog_adjust back to false for MIN/MAX case. Set *scalar_def to
+ NULL if need_epilog_adjust is false.
+ (vect_create_epilog_for_reduction): Variable adjust_in_epilog removed.
+ Case 3 always peels first itration, not just for PLUS case, and no need
+ to use scalar_initial_def here. Create an epilog adjustment only if
+ scalar_initial_def is not NULL.
+
+ (vectorizable_reduction): Remove assert.
+
2005-08-20 H.J. Lu <hongjiu.lu@intel.com>
PR target/23485
diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c
index be5b779..7c247b1 100644
--- a/gcc/tree-vect-transform.c
+++ b/gcc/tree-vect-transform.c
@@ -751,7 +751,7 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *scalar_def)
case MAX_EXPR:
def = init_val;
nelements = nunits;
- need_epilog_adjust = true;
+ need_epilog_adjust = false;
break;
default:
@@ -775,13 +775,9 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *scalar_def)
vec = build_constructor_from_list (vectype, t);
if (!need_epilog_adjust)
- {
- if (INTEGRAL_TYPE_P (type))
- init_val = build_int_cst (type, 0);
- else
- init_val = build_real (type, dconst0);
- }
- *scalar_def = init_val;
+ *scalar_def = NULL_TREE;
+ else
+ *scalar_def = init_val;
return vect_init_vector (stmt, vec);
}
@@ -862,7 +858,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
imm_use_iterator imm_iter;
use_operand_p use_p;
bool extract_scalar_result;
- bool adjust_in_epilog;
/*** 1. Create the reduction def-use cycle ***/
@@ -921,7 +916,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
extract_scalar_result = true;
- adjust_in_epilog = true;
}
else
{
@@ -997,13 +991,15 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
}
extract_scalar_result = true;
- adjust_in_epilog = true;
}
else
{
+ tree rhs;
+
/*** Case 3:
- Create: s = init;
- for (offset=0; offset<vector_size; offset+=element_size;)
+ Create:
+ s = extract_field <v_out2, 0>
+ for (offset=element_size; offset<vector_size; offset+=element_size;)
{
Create: s' = extract_field <v_out2, offset>
Create: s = op <s, s'>
@@ -1015,33 +1011,19 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
vec_temp = PHI_RESULT (new_phi);
vec_size_in_bits = tree_low_cst (TYPE_SIZE (vectype), 1);
- /* first iteration is peeled out when possible to minimize
- the number of operations we generate: */
- if (code == PLUS_EXPR
- && (integer_zerop (scalar_initial_def)
- || real_zerop (scalar_initial_def)))
- {
- tree rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize,
- bitsize_zero_node);
+ rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize,
+ bitsize_zero_node);
- BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type);
- epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest,
- rhs);
- new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
- TREE_OPERAND (epilog_stmt, 0) = new_temp;
- bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
- if (vect_print_dump_info (REPORT_DETAILS))
- print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
+ BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type);
+ epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest,
+ rhs);
+ new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
+ TREE_OPERAND (epilog_stmt, 0) = new_temp;
+ bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
+ if (vect_print_dump_info (REPORT_DETAILS))
+ print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
- bit_offset = element_bitsize;
- }
- else
- {
- new_temp = scalar_initial_def;
- bit_offset = 0;
- }
-
- for (;
+ for (bit_offset = element_bitsize;
bit_offset < vec_size_in_bits;
bit_offset += element_bitsize)
{
@@ -1069,7 +1051,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
}
extract_scalar_result = false;
- adjust_in_epilog = false;
}
}
@@ -1110,7 +1091,7 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
Create:
s_out = scalar_expr <s_out, scalar_initial_def> */
- if (adjust_in_epilog)
+ if (scalar_initial_def)
{
epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest,
build2 (code, scalar_type, new_temp, scalar_initial_def));
@@ -1291,8 +1272,6 @@ vectorizable_reduction (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
/* Prepare the operand that is defined inside the loop body */
loop_vec_def = vect_get_vec_def_for_operand (op0, stmt, NULL);
- gcc_assert (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (loop_vec_def))));
-
/* Create the vectorized operation that computes the partial results */
*vec_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,