rs6000: Fix branch_comparison_operator
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 8 Nov 2019 14:53:42 +0000 (15:53 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 8 Nov 2019 14:53:42 +0000 (15:53 +0100)
* config/rs6000/predicates.md (branch_comparison_operator): Allow only
the comparison codes that make sense for the mode used, and only the
codes that can be done with a single branch instruction.

From-SVN: r277976

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

index b61665df3e80de23f6016ec0d7f79ac3239f3e29..c68960c9d8bbaeb5c72dde772927e1a9fe63c24a 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-08  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/predicates.md (branch_comparison_operator): Allow only
+       the comparison codes that make sense for the mode used, and only the
+       codes that can be done with a single branch instruction.
+
 2019-11-08  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        PR tree-optimization/92351
index 51cdd3a129d76236cad06135ea55b1b94754dcb2..d0c3f9a73b5f19599930199079be075515a7f5a1 100644 (file)
 ;; validate_condition_mode is an assertion.
 (define_predicate "branch_comparison_operator"
    (and (match_operand 0 "comparison_operator")
-       (and (match_test "GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC")
-            (match_test "validate_condition_mode (GET_CODE (op),
-                                                  GET_MODE (XEXP (op, 0))),
-                         1"))))
+       (match_test "GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC")
+       (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode
+                                  && !flag_finite_math_only")
+                     (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered")
+                     (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne"))
+       (match_test "validate_condition_mode (GET_CODE (op),
+                                             GET_MODE (XEXP (op, 0))),
+                    1")))
 
 ;; Return 1 if OP is an unsigned comparison operator.
 (define_predicate "unsigned_comparison_operator"