[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] Fix value numbering dealing with reverse byte order

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 10:09:36 GMT 2020


https://gcc.gnu.org/g:2db99ef7896914bfbca1adc40f6ac4ba8887f040

commit 2db99ef7896914bfbca1adc40f6ac4ba8887f040
Author: Andrew Pinski <apinski@marvell.com>
Date:   Thu Jan 16 07:54:51 2020 +0000

    Fix value numbering dealing with reverse byte order
    
    Hi,
      While working on bit-field lowering pass, I came across this bug.
    The IR looks like:
      VIEW_CONVERT_EXPR<unsigned long>(var1) = _12;
      _1 = BIT_FIELD_REF <var1, 64, 0>;
    
    Where the BIT_FIELD_REF has REF_REVERSE_STORAGE_ORDER set on it
    and var1's type has TYPE_REVERSE_STORAGE_ORDER set on it.
    PRE/FRE would decided to prop _12 into the BFR statement
    which would produce wrong code.
    And yes _12 has the correct byte order already; bit-field lowering
    removes the implicit byte swaps in the IR and adds the explicity
    to make it easier optimize later on.
    
    This patch adds a check for storage_order_barrier_p on the lhs tree
    which returns true in the case where we had a reverse order with a VCE.
    
    ChangeLog:
    * tree-ssa-sccvn.c(vn_reference_lookup_3): Check lhs for
    !storage_order_barrier_p.

Diff:
---
 gcc/ChangeLog        | 5 +++++
 gcc/tree-ssa-sccvn.c | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bbb7e06c7fb..7baf474abb8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-16  Andrew Pinski  <apinski@marvell.com>
+
+	* tree-ssa-sccvn.c(vn_reference_lookup_3): Check lhs for
+	!storage_order_barrier_p.
+
 2020-01-16  Andrew Pinski  <apinski@marvell.com>
 
 	* sched-int.h (_dep): Add unused bit-field field for the padding.
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 3b27c50ef75..4d1301593d7 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -2593,6 +2593,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
 					 &offset2, &size2, &maxsize2, &reverse);
       if (base2
 	  && !reverse
+	  && !storage_order_barrier_p (lhs)
 	  && known_eq (maxsize2, size2)
 	  && multiple_p (size2, BITS_PER_UNIT)
 	  && multiple_p (offset2, BITS_PER_UNIT)
@@ -2695,6 +2696,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
 					 &offset2, &size2, &maxsize2, &reverse);
       tree def_rhs = gimple_assign_rhs1 (def_stmt);
       if (!reverse
+	  && !storage_order_barrier_p (lhs)
 	  && known_size_p (maxsize2)
 	  && known_eq (maxsize2, size2)
 	  && adjust_offsets_for_equal_base_address (base, &offset,


More information about the Gcc-cvs mailing list