Projects
Mega:23.03
gcc
_service:tar_scm:0020-Backport-vect-Fix-an-ICE-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0020-Backport-vect-Fix-an-ICE-in-vect_recog_mask_conversi.patch of Package gcc
From 633dd654347b6146d6e94d6434e7028617019134 Mon Sep 17 00:00:00 2001 From: zhanghaijian <z.zhanghaijian@huawei.com> Date: Mon, 9 Aug 2021 20:18:26 +0800 Subject: [PATCH 20/22] [Backport]vect: Fix an ICE in vect_recog_mask_conversion_pattern Reference:https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=91d80cf4bd2827dd9c40fe6a7c719c909d79083d When processing the cond expression, vect_recog_mask_conversion_pattern doesn't consider the situation that two operands of rhs1 are different vectypes, leading to a vect ICE. This patch adds the identification and handling of the situation to fix the problem. diff --git a/gcc/testsuite/gcc.target/aarch64/pr96757.c b/gcc/testsuite/gcc.target/aarch64/pr96757.c new file mode 100644 index 00000000000..122e39dca0e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr96757.c @@ -0,0 +1,23 @@ +/* PR target/96757 */ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +short +fun1(short i, short j) +{ + return i * j; +} + +int +fun(int a, int b, int c) +{ + int *v, z, k, m; + short f, d; + for (int i=0; i<c; i++) + { + f= 4 <= d; + k= a > m; + z = f > k; + *v += fun1(z,b); + } +} diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 310165084a3..84d7ddb170f 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -4237,6 +4237,8 @@ vect_recog_mask_conversion_pattern (stmt_vec_info stmt_vinfo, tree *type_out) tree vectype1, vectype2; stmt_vec_info pattern_stmt_info; vec_info *vinfo = stmt_vinfo->vinfo; + tree rhs1_op0 = NULL_TREE, rhs1_op1 = NULL_TREE; + tree rhs1_op0_type = NULL_TREE, rhs1_op1_type = NULL_TREE; /* Check for MASK_LOAD ans MASK_STORE calls requiring mask conversion. */ if (is_gimple_call (last_stmt) @@ -4336,9 +4338,37 @@ vect_recog_mask_conversion_pattern (stmt_vec_info stmt_vinfo, tree *type_out) it is better for b1 and b2 to use the mask type associated with int elements rather bool (byte) elements. */ - rhs1_type = integer_type_for_mask (TREE_OPERAND (rhs1, 0), vinfo); - if (!rhs1_type) - rhs1_type = TREE_TYPE (TREE_OPERAND (rhs1, 0)); + rhs1_op0 = TREE_OPERAND (rhs1, 0); + rhs1_op1 = TREE_OPERAND (rhs1, 1); + if (!rhs1_op0 || !rhs1_op1) + return NULL; + rhs1_op0_type = integer_type_for_mask (rhs1_op0, vinfo); + rhs1_op1_type = integer_type_for_mask (rhs1_op1, vinfo); + + if (!rhs1_op0_type) + rhs1_type = TREE_TYPE (rhs1_op0); + else if (!rhs1_op1_type) + rhs1_type = TREE_TYPE (rhs1_op1); + else if (TYPE_PRECISION (rhs1_op0_type) + != TYPE_PRECISION (rhs1_op1_type)) + { + int tmp0 = (int) TYPE_PRECISION (rhs1_op0_type) + - (int) TYPE_PRECISION (TREE_TYPE (lhs)); + int tmp1 = (int) TYPE_PRECISION (rhs1_op1_type) + - (int) TYPE_PRECISION (TREE_TYPE (lhs)); + if ((tmp0 > 0 && tmp1 > 0) || (tmp0 < 0 && tmp1 < 0)) + { + if (abs (tmp0) > abs (tmp1)) + rhs1_type = rhs1_op1_type; + else + rhs1_type = rhs1_op0_type; + } + else + rhs1_type = build_nonstandard_integer_type + (TYPE_PRECISION (TREE_TYPE (lhs)), 1); + } + else + rhs1_type = rhs1_op0_type; } else return NULL; @@ -4356,8 +4386,8 @@ vect_recog_mask_conversion_pattern (stmt_vec_info stmt_vinfo, tree *type_out) name from the outset. */ if (known_eq (TYPE_VECTOR_SUBPARTS (vectype1), TYPE_VECTOR_SUBPARTS (vectype2)) - && (TREE_CODE (rhs1) == SSA_NAME - || rhs1_type == TREE_TYPE (TREE_OPERAND (rhs1, 0)))) + && !rhs1_op0_type + && !rhs1_op1_type) return NULL; /* If rhs1 is invariant and we can promote it leave the COND_EXPR @@ -4390,7 +4420,16 @@ vect_recog_mask_conversion_pattern (stmt_vec_info stmt_vinfo, tree *type_out) if (TREE_CODE (rhs1) != SSA_NAME) { tmp = vect_recog_temp_ssa_var (TREE_TYPE (rhs1), NULL); - pattern_stmt = gimple_build_assign (tmp, rhs1); + if (rhs1_op0_type + && TYPE_PRECISION (rhs1_op0_type) != TYPE_PRECISION (rhs1_type)) + rhs1_op0 = build_mask_conversion (rhs1_op0, + vectype2, stmt_vinfo); + if (rhs1_op1_type + && TYPE_PRECISION (rhs1_op1_type) != TYPE_PRECISION (rhs1_type)) + rhs1_op1 = build_mask_conversion (rhs1_op1, + vectype2, stmt_vinfo); + pattern_stmt = gimple_build_assign (tmp, TREE_CODE (rhs1), + rhs1_op0, rhs1_op1); rhs1 = tmp; append_pattern_def_seq (stmt_vinfo, pattern_stmt, vectype2, rhs1_type); -- 2.21.0.windows.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2