Fix IFN_MASK_STORE handling of IFN_GOMP_SIMD_LANE
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 7 Jan 2019 18:53:44 +0000 (18:53 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 7 Jan 2019 18:53:44 +0000 (18:53 +0000)
The IFN_GOMP_SIMD_LANE handling in vectorizable_store tries to use MEM_REF
offsets to maintain pointer disambiguation info.  This patch makes sure
that we don't try to do the same optimisation for IFN_MASK_STOREs, which
have no similar offset argument.

The patch fixes libgomp.c-c++-common/pr66199-*.c for SVE.  Previously
we had an ncopies==2 store and stored both halves to the same address.

2019-01-07  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-stmts.c (vectorizable_store): Don't use the dataref_offset
optimization for masked stores.

From-SVN: r267654

gcc/ChangeLog
gcc/tree-vect-stmts.c

index c236588..c207457 100644 (file)
@@ -1,5 +1,10 @@
 2019-01-07  Richard Sandiford  <richard.sandiford@arm.com>
 
+       * tree-vect-stmts.c (vectorizable_store): Don't use the dataref_offset
+       optimization for masked stores.
+
+2019-01-07  Richard Sandiford  <richard.sandiford@arm.com>
+
        PR middle-end/88567
        * tree-vect-loop.c (get_initial_defs_for_reduction): Pass the
        output vector directly to duplicate_and_interleave instead of
index 4555092..c0e19dd 100644 (file)
@@ -7059,6 +7059,7 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
          bool simd_lane_access_p
            = STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info);
          if (simd_lane_access_p
+             && !loop_masks
              && TREE_CODE (DR_BASE_ADDRESS (first_dr_info->dr)) == ADDR_EXPR
              && VAR_P (TREE_OPERAND (DR_BASE_ADDRESS (first_dr_info->dr), 0))
              && integer_zerop (DR_OFFSET (first_dr_info->dr))