]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimple-fold: Refine gimple_fold_partial_load_store_mem_ref [PR107412]
authorKewen Lin <linkw@linux.ibm.com>
Mon, 5 Dec 2022 05:27:08 +0000 (23:27 -0600)
committerKewen Lin <linkw@linux.ibm.com>
Mon, 5 Dec 2022 05:27:08 +0000 (23:27 -0600)
Following Richard's review comments, this patch is to use
untruncated type for the length used for IFN_LEN_{LOAD,STORE}
instead of "unsigned int" for better robustness.  It also
avoid to use to_constant and tree arithmetic for subtraction.

Co-authored-by: Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/107412

gcc/ChangeLog:

* gimple-fold.cc (gimple_fold_partial_load_store_mem_ref): Use
untruncated type for the length, and avoid to_constant and tree
arithmetic for subtraction.

gcc/gimple-fold.cc

index c2d9c806aee3fab852b0e7ff75995d0c39defa10..88d14c7adcc764c2ee72f696831bcf0740542acb 100644 (file)
@@ -5387,18 +5387,17 @@ gimple_fold_partial_load_store_mem_ref (gcall *call, tree vectype, bool mask_p)
       tree mask = gimple_call_arg (call, 2);
       if (!integer_all_onesp (mask))
        return NULL_TREE;
-    } else {
+    }
+  else
+    {
       tree basic_len = gimple_call_arg (call, 2);
-      if (!tree_fits_uhwi_p (basic_len))
+      if (!poly_int_tree_p (basic_len))
        return NULL_TREE;
       unsigned int nargs = gimple_call_num_args (call);
       tree bias = gimple_call_arg (call, nargs - 1);
-      gcc_assert (tree_fits_shwi_p (bias));
-      tree biased_len = int_const_binop (MINUS_EXPR, basic_len, bias);
-      unsigned int len = tree_to_uhwi (biased_len);
-      unsigned int vect_len
-       = GET_MODE_SIZE (TYPE_MODE (vectype)).to_constant ();
-      if (vect_len != len)
+      gcc_assert (TREE_CODE (bias) == INTEGER_CST);
+      if (maybe_ne (wi::to_poly_widest (basic_len) - wi::to_widest (bias),
+                   GET_MODE_SIZE (TYPE_MODE (vectype))))
        return NULL_TREE;
     }