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