r231923 has

 ;; Test for a valid operand for a call instruction.
 ;; Allow constant call address operands in Pmode only.
 (define_special_predicate "call_insn_operand"
   (ior (match_test "constant_call_address_operand
                     (op, mode == VOIDmode ? mode : Pmode)")
        (match_operand 0 "call_register_no_elim_operand")
-       (and (not (match_test "TARGET_X32"))
-           (match_operand 0 "memory_operand"))))
+       (ior (and (not (match_test "TARGET_X32"))
+                (match_operand 0 "sibcall_memory_operand"))
                                   ^^^^^^^^^^^^^^^^^^^^^^^ A typo.
+           (and (match_test "TARGET_X32 && Pmode == DImode")
+                (match_operand 0 "GOT_memory_operand")))))

"sibcall_memory_operand" should be "memory_operand".

OK for trunk and 6 branch if there is no regression on x86-64?

H.J.
---
gcc/

        PR target/70750
        * config/i386/predicates.md (call_insn_operand): Replace
        sibcall_memory_operand with memory_operand.

gcc/testsuite/

        PR target/70750
        * gcc.target/i386/pr70750-1.c: New test.
        * gcc.target/i386/pr70750-2.c: Likewise.
---
 gcc/config/i386/predicates.md             |  2 +-
 gcc/testsuite/gcc.target/i386/pr70750-1.c | 11 +++++++++++
 gcc/testsuite/gcc.target/i386/pr70750-2.c | 11 +++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr70750-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr70750-2.c

diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 14e80d9..93dda7b 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -637,7 +637,7 @@
                     (op, mode == VOIDmode ? mode : Pmode)")
        (match_operand 0 "call_register_no_elim_operand")
        (ior (and (not (match_test "TARGET_X32"))
-                (match_operand 0 "sibcall_memory_operand"))
+                (match_operand 0 "memory_operand"))
            (and (match_test "TARGET_X32 && Pmode == DImode")
                 (match_operand 0 "GOT_memory_operand")))))
 
diff --git a/gcc/testsuite/gcc.target/i386/pr70750-1.c 
b/gcc/testsuite/gcc.target/i386/pr70750-1.c
new file mode 100644
index 0000000..9fcab17
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr70750-1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2" } */
+
+int
+f (int (**p) (void))
+{
+  return p[1]();
+}
+
+/* { dg-final { scan-assembler "jmp\[ \t\].*\\(%rdi\\)" { target { lp64 } } } 
} */
+/* { dg-final { scan-assembler "jmp\[ \t\]\\*%rax" { target { x32 } } } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr70750-2.c 
b/gcc/testsuite/gcc.target/i386/pr70750-2.c
new file mode 100644
index 0000000..afbef37
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr70750-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2" } */
+
+int
+f (int (**p) (void))
+{
+  return -p[1]();
+}
+
+/* { dg-final { scan-assembler "call\[ \t\].*\\(%rdi\\)" { target { lp64 } } } 
} */
+/* { dg-final { scan-assembler "call\[ \t\]\\*%rax" { target { x32 } } } } */
-- 
2.5.5

Reply via email to