rs6000: Fix for and_operand oversight (PR68332, PR67677)
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 24 Nov 2015 14:04:11 +0000 (15:04 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 24 Nov 2015 14:04:11 +0000 (15:04 +0100)
Calling rs6000_is_valid_and_mask on a reg instead of on a const_int is
not a good idea, as PR68332 and PR67677 as well as testing with
--enable-checking=yes,rtl show.  Fix this.

PR target/66217
PR target/67677
PR target/68332
* config/rs6000/predicates.md (and_operand): Check that the operand
is a const_int before calling rs6000_is_valid_and_mask.

From-SVN: r230811

gcc/ChangeLog
gcc/config/rs6000/predicates.md

index ada1e3094c861f214a833f266d76e0a0a81107f3..5203b2865d376e56a880388a6a96b9eb846d9199 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-24  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR target/66217
+       PR target/67677
+       PR target/68332
+       * config/rs6000/predicates.md (and_operand): Check that the operand
+       is a const_int before calling rs6000_is_valid_and_mask.
+
 2015-11-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/aarch64.md (*condjump): Rename to...
index 3b1a4561fba54a5598ab758b1bf94205b0b5f88b..362188f1d16383375aa94de3e374245f37d3b73b 100644 (file)
 ;; Return 1 if the operand is either a non-special register or a
 ;; constant that can be used as the operand of a logical AND.
 (define_predicate "and_operand"
-  (ior (match_test "rs6000_is_valid_and_mask (op, mode)")
+  (ior (and (match_code "const_int")
+           (match_test "rs6000_is_valid_and_mask (op, mode)"))
        (if_then_else (match_test "fixed_regs[CR0_REGNO]")
         (match_operand 0 "gpc_reg_operand")
         (match_operand 0 "logical_operand"))))