aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2021-03-16 18:29:11 +0000
committerSegher Boessenkool <segher@kernel.crashing.org>2021-03-16 19:21:34 +0000
commita0b5843a9b2b3e93bd119d5aef583f53ad2ef0bc (patch)
tree01e99c1039f3cc3ec2ae3e3c4cf07d1cbe950467
parentd55ce33a34a8e33d17285228b32cf1e564241a70 (diff)
downloadgcc-a0b5843a9b2b3e93bd119d5aef583f53ad2ef0bc.zip
gcc-a0b5843a9b2b3e93bd119d5aef583f53ad2ef0bc.tar.gz
gcc-a0b5843a9b2b3e93bd119d5aef583f53ad2ef0bc.tar.bz2
rs6000: Workaround for PR98092
The bcdinvalid_<mode> RTL instruction uses the "unordered" comparison, which cannot be used if we have -ffinite-math-only. We really need CCMODEs that describe what bits in a CR field are set by other insns than just comparisons, but that is a lot more surgery, and it is stage 4 now. This patch does a simple workaround. 2021-03-16 Segher Boessenkool <segher@kernel.crashing.org> PR target/98092 * config/rs6000/predicates.md (branch_comparison_operator): Allow ordered and unordered for CCFPmode, if flag_finite_math_only. gcc/testsuite/ PR target/98092 * gcc.target/powerpc/pr98092.c: New.
-rw-r--r--gcc/config/rs6000/predicates.md9
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr98092.c7
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 69f3c70..859af75 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -1208,10 +1208,11 @@
(define_predicate "branch_comparison_operator"
(and (match_operand 0 "comparison_operator")
(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"))
+ (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode")
+ (if_then_else (match_test "flag_finite_math_only")
+ (match_code "lt,le,gt,ge,eq,ne,unordered,ordered")
+ (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")))
diff --git a/gcc/testsuite/gcc.target/powerpc/pr98092.c b/gcc/testsuite/gcc.target/powerpc/pr98092.c
new file mode 100644
index 0000000..03eab5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr98092.c
@@ -0,0 +1,7 @@
+/* { dg-options "-mdejagnu-cpu=power9 -ffinite-math-only" } */
+
+int
+h9 (__attribute__ ((altivec (vector__))) char un)
+{
+ return (__builtin_vec_bcdinvalid (un));
+}