As discussed in the PR, removing the inner 'fix:HF/SD/DF' fixes the
problem, like other targets do.

gcc/ChangeLog:

        PR rtl-optimization/117712
        * config/arm/arm.md (fix_trunchfsi2): Remove inner fix:HF.
        (fix_trunchfdi2): Likewise.
        (fix_truncsfsi2): Remove inner fix:SF.
        (fix_truncdfsi2): Remove inner fix:DF.
        * config/arm/vfp.md (truncsisf2_vfp): remove inner fix:SF.
        (truncsidf2_vfp): Remove inner fix:DF.
        (fixuns_truncsfsi2): Remove inner fix:SF.
        (fixuns_truncdfsi2): Remove inner fix:DF.

gcc/testsuite/ChangeLog:

        PR rtl-optimization/117712
        * gcc.target/arm/pr117712-df.c: New test.
        * gcc.target/arm/pr117712-hf-di.c: New test.
        * gcc.target/arm/pr117712-hf.c: New test.
        * gcc.target/arm/pr117712-sf.c: New test.
---
 gcc/config/arm/arm.md                         |  8 ++++----
 gcc/config/arm/vfp.md                         |  8 ++++----
 gcc/testsuite/gcc.target/arm/pr117712-df.c    | 10 ++++++++++
 gcc/testsuite/gcc.target/arm/pr117712-hf-di.c | 10 ++++++++++
 gcc/testsuite/gcc.target/arm/pr117712-hf.c    | 10 ++++++++++
 gcc/testsuite/gcc.target/arm/pr117712-sf.c    | 10 ++++++++++
 6 files changed, 48 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-df.c
 create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-hf-di.c
 create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-hf.c
 create mode 100644 gcc/testsuite/gcc.target/arm/pr117712-sf.c

diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 442d86b9329..ed0d0da2e63 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -5477,7 +5477,7 @@ (define_expand "floatsidf2"
 
 (define_expand "fix_trunchfsi2"
   [(set (match_operand:SI         0 "general_operand")
-       (fix:SI (fix:HF (match_operand:HF 1 "general_operand"))))]
+       (fix:SI (match_operand:HF 1 "general_operand")))]
   "TARGET_EITHER"
   "
   {
@@ -5489,7 +5489,7 @@ (define_expand "fix_trunchfsi2"
 
 (define_expand "fix_trunchfdi2"
   [(set (match_operand:DI         0 "general_operand")
-       (fix:DI (fix:HF (match_operand:HF 1 "general_operand"))))]
+       (fix:DI (match_operand:HF 1 "general_operand")))]
   "TARGET_EITHER"
   "
   {
@@ -5501,14 +5501,14 @@ (define_expand "fix_trunchfdi2"
 
 (define_expand "fix_truncsfsi2"
   [(set (match_operand:SI         0 "s_register_operand")
-       (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand"))))]
+       (fix:SI (match_operand:SF 1 "s_register_operand")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT"
   "
 ")
 
 (define_expand "fix_truncdfsi2"
   [(set (match_operand:SI         0 "s_register_operand")
-       (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand"))))]
+       (fix:SI (match_operand:DF 1 "s_register_operand")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
   "
 ")
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index 379f5f7b3dc..0ef019b1727 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -1508,7 +1508,7 @@ (define_insn "truncsfhf2"
 
 (define_insn "*truncsisf2_vfp"
   [(set (match_operand:SI                0 "s_register_operand" "=t")
-       (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))]
+       (fix:SI (match_operand:SF 1 "s_register_operand" "t")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT"
   "vcvt%?.s32.f32\\t%0, %1"
   [(set_attr "predicable" "yes")
@@ -1517,7 +1517,7 @@ (define_insn "*truncsisf2_vfp"
 
 (define_insn "*truncsidf2_vfp"
   [(set (match_operand:SI                0 "s_register_operand" "=t")
-       (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))]
+       (fix:SI (match_operand:DF 1 "s_register_operand" "w")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
   "vcvt%?.s32.f64\\t%0, %P1"
   [(set_attr "predicable" "yes")
@@ -1527,7 +1527,7 @@ (define_insn "*truncsidf2_vfp"
 
 (define_insn "fixuns_truncsfsi2"
   [(set (match_operand:SI                0 "s_register_operand" "=t")
-       (unsigned_fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" 
"t"))))]
+       (unsigned_fix:SI (match_operand:SF 1 "s_register_operand" "t")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT"
   "vcvt%?.u32.f32\\t%0, %1"
   [(set_attr "predicable" "yes")
@@ -1536,7 +1536,7 @@ (define_insn "fixuns_truncsfsi2"
 
 (define_insn "fixuns_truncdfsi2"
   [(set (match_operand:SI                0 "s_register_operand" "=t")
-       (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" 
"t"))))]
+       (unsigned_fix:SI (match_operand:DF 1 "s_register_operand" "t")))]
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
   "vcvt%?.u32.f64\\t%0, %P1"
   [(set_attr "predicable" "yes")
diff --git a/gcc/testsuite/gcc.target/arm/pr117712-df.c 
b/gcc/testsuite/gcc.target/arm/pr117712-df.c
new file mode 100644
index 00000000000..534f2e4ed1d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr117712-df.c
@@ -0,0 +1,10 @@
+/* { dg-do assemble } */
+/* { dg-options "-O2 -ffast-math" } */
+
+int bCTUInfo;
+void compressInterCU_rd5_6(int qp) {
+  if (bCTUInfo)
+    qp = 0.96 * qp;
+  for (;;)
+    compressInterCU_rd5_6(qp);
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c 
b/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c
new file mode 100644
index 00000000000..ea5ee0c8342
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr117712-hf-di.c
@@ -0,0 +1,10 @@
+/* { dg-do assemble } */
+/* { dg-options "-O2 -ffast-math -mfp16-format=ieee" } */
+
+long long bCTUInfo;
+void compressInterCU_rd5_6(long long qp) {
+  if (bCTUInfo)
+    qp = 0.96f16 * qp;
+  for (;;)
+    compressInterCU_rd5_6(qp);
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr117712-hf.c 
b/gcc/testsuite/gcc.target/arm/pr117712-hf.c
new file mode 100644
index 00000000000..d11c2cf749c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr117712-hf.c
@@ -0,0 +1,10 @@
+/* { dg-do assemble } */
+/* { dg-options "-O2 -ffast-math -mfp16-format=ieee" } */
+
+int bCTUInfo;
+void compressInterCU_rd5_6(int qp) {
+  if (bCTUInfo)
+    qp = 0.96f16 * qp;
+  for (;;)
+    compressInterCU_rd5_6(qp);
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr117712-sf.c 
b/gcc/testsuite/gcc.target/arm/pr117712-sf.c
new file mode 100644
index 00000000000..744bad5de75
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr117712-sf.c
@@ -0,0 +1,10 @@
+/* { dg-do assemble } */
+/* { dg-options "-O2 -ffast-math" } */
+
+int bCTUInfo;
+void compressInterCU_rd5_6(int qp) {
+  if (bCTUInfo)
+    qp = 0.96f * qp;
+  for (;;)
+    compressInterCU_rd5_6(qp);
+}
-- 
2.34.1

Reply via email to