diff options
author | liuhongt <hongtao.liu@intel.com> | 2022-02-16 12:15:18 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2022-02-17 18:58:22 +0800 |
commit | 754dce903ca28c4c2f2bc8614a8de5e631655f2e (patch) | |
tree | d433f227d832ec19e1cd87a5c5ed1bba6abadb41 /gcc/tree-vect-patterns.cc | |
parent | 1c2b44b52364cb5661095b346de794bc7ff02866 (diff) | |
download | gcc-754dce903ca28c4c2f2bc8614a8de5e631655f2e.zip gcc-754dce903ca28c4c2f2bc8614a8de5e631655f2e.tar.gz gcc-754dce903ca28c4c2f2bc8614a8de5e631655f2e.tar.bz2 |
Restrict the two sources of vect_recog_cond_expr_convert_pattern to be of the same type when convert is extension.
It's not equal to transform
(cond (cmp @1 @2) (convert@3 @4) (convert@5 @6))
to
(convert (cmp @1 @2) (convert)@4 @6)
when(convert@3 @4) is extension because it's zero_extend vs sign_extend.
gcc/ChangeLog:
PR tree-optimization/104551
PR tree-optimization/103771
* match.pd (cond_expr_convert_p): Add types_match check when
convert is extension.
* tree-vect-patterns.cc
(gimple_cond_expr_convert_p): Adjust comments.
(vect_recog_cond_expr_convert_pattern): Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr104551.c: New test.
Diffstat (limited to 'gcc/tree-vect-patterns.cc')
-rw-r--r-- | gcc/tree-vect-patterns.cc | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index a8f96d5..217bdfd 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -929,8 +929,10 @@ vect_reassociating_reduction_p (vec_info *vinfo, with conditions: 1) @1, @2, c, d, a, b are all integral type. 2) There's single_use for both @1 and @2. - 3) a, c and d have same precision. + 3) a, c have same precision. 4) c and @1 have different precision. + 5) c, d are the same type or they can differ in sign when convert is + truncation. record a and c and d and @3. */ @@ -952,7 +954,7 @@ extern bool gimple_cond_expr_convert_p (tree, tree*, tree (*)(tree)); TYPE_PRECISION (TYPE_E) != TYPE_PRECISION (TYPE_CD); TYPE_PRECISION (TYPE_AB) == TYPE_PRECISION (TYPE_CD); single_use of op_true and op_false. - TYPE_AB could differ in sign. + TYPE_AB could differ in sign when (TYPE_E) A is a truncation. Input: |