re PR target/92462 ([arm32] -ftree-pre makes a variable to be wrongly hoisted out)
authorRichard Biener <rguenther@suse.de>
Mon, 18 Nov 2019 09:44:52 +0000 (09:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Nov 2019 09:44:52 +0000 (09:44 +0000)
2019-11-18  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/92462
* alias.c (find_base_term): Restrict the look through ANDs.
(find_base_value): Likewise.

From-SVN: r278391

gcc/ChangeLog
gcc/alias.c

index 6e3fab836864570568e0b77bb012ca22569bcc37..f5d4d770fe1017b6b3124da5d9b6961d0e675295 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-18  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/92462
+       * alias.c (find_base_term): Restrict the look through ANDs.
+       (find_base_value): Likewise.
+
 2019-11-18  Georg-Johann Lay  <avr@gjlay.de>
 
        Add support for AVR devices from the 0-series.
index 34e19fe8ca12198e292bcd186f8442b7ffbb52d7..800b71902d5584f4ff5e3121c0bef8e4448354ea 100644 (file)
@@ -1464,9 +1464,11 @@ find_base_value (rtx src)
       return find_base_value (XEXP (src, 1));
 
     case AND:
-      /* If the second operand is constant set the base
-        address to the first operand.  */
-      if (CONST_INT_P (XEXP (src, 1)) && INTVAL (XEXP (src, 1)) != 0)
+      /* Look through aligning ANDs.  And AND with zero or one with
+         the LSB set isn't one (see for example PR92462).  */
+      if (CONST_INT_P (XEXP (src, 1))
+         && INTVAL (XEXP (src, 1)) != 0
+         && (INTVAL (XEXP (src, 1)) & 1) == 0)
        return find_base_value (XEXP (src, 0));
       return 0;
 
@@ -2024,7 +2026,11 @@ find_base_term (rtx x, vec<std::pair<cselib_val *,
       }
 
     case AND:
-      if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) != 0)
+      /* Look through aligning ANDs.  And AND with zero or one with
+         the LSB set isn't one (see for example PR92462).  */
+      if (CONST_INT_P (XEXP (x, 1))
+         && INTVAL (XEXP (x, 1)) != 0
+         && (INTVAL (XEXP (x, 1)) & 1) == 0)
        return find_base_term (XEXP (x, 0), visited_vals);
       return 0;