From e3936f47f63c128d6a667596111865f35869392f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 7 Feb 2013 09:04:58 +0100 Subject: [PATCH] re PR target/56228 (Indirect call fails to assemble) PR target/56228 * config/rs6000/rs6000.md (ptrm): New mode attr. (call_indirect_aix, call_indirect_aix_nor11, call_value_indirect_aix, call_value_indirect_aix_nor11): Use instead of m in constraints. * gcc.dg/pr56228.c: New test. From-SVN: r195840 --- gcc/ChangeLog | 9 +++++++++ gcc/config/rs6000/rs6000.md | 19 +++++++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr56228.c | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr56228.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9634c059c2e..175b85bb264 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-02-07 Jakub Jelinek + + PR target/56228 + * config/rs6000/rs6000.md (ptrm): New mode attr. + (call_indirect_aix, call_indirect_aix_nor11, + call_value_indirect_aix, + call_value_indirect_aix_nor11): Use instead of + m in constraints. + 2013-02-07 Michael Haubenwallner * collect2.c (main): Set aix64_flag for -G and -bsvr4 too, disable diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index b3db6817647..a665fa50abf 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -292,6 +292,9 @@ (define_mode_attr ptrload [(SI "lwz") (DI "ld")]) +(define_mode_attr ptrm [(SI "m") + (DI "Y")]) + (define_mode_attr rreg [(SF "f") (DF "ws") (V4SF "wf") @@ -10662,8 +10665,8 @@ (define_insn "call_indirect_aix" [(call (mem:SI (match_operand:P 0 "register_operand" "c,*l")) (match_operand 1 "" "g,g")) - (use (match_operand:P 2 "memory_operand" "m,m")) - (set (reg:P TOC_REGNUM) (match_operand:P 3 "memory_operand" "m,m")) + (use (match_operand:P 2 "memory_operand" ",")) + (set (reg:P TOC_REGNUM) (match_operand:P 3 "memory_operand" ",")) (use (reg:P STATIC_CHAIN_REGNUM)) (clobber (reg:P LR_REGNO))] "DEFAULT_ABI == ABI_AIX && TARGET_POINTERS_TO_NESTED_FUNCTIONS" @@ -10680,8 +10683,8 @@ (define_insn "call_indirect_aix_nor11" [(call (mem:SI (match_operand:P 0 "register_operand" "c,*l")) (match_operand 1 "" "g,g")) - (use (match_operand:P 2 "memory_operand" "m,m")) - (set (reg:P TOC_REGNUM) (match_operand:P 3 "memory_operand" "m,m")) + (use (match_operand:P 2 "memory_operand" ",")) + (set (reg:P TOC_REGNUM) (match_operand:P 3 "memory_operand" ",")) (clobber (reg:P LR_REGNO))] "DEFAULT_ABI == ABI_AIX && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" " 2,%2\;b%T0l\; 2,%3" @@ -10698,8 +10701,8 @@ [(set (match_operand 0 "" "") (call (mem:SI (match_operand:P 1 "register_operand" "c,*l")) (match_operand 2 "" "g,g"))) - (use (match_operand:P 3 "memory_operand" "m,m")) - (set (reg:P TOC_REGNUM) (match_operand:P 4 "memory_operand" "m,m")) + (use (match_operand:P 3 "memory_operand" ",")) + (set (reg:P TOC_REGNUM) (match_operand:P 4 "memory_operand" ",")) (use (reg:P STATIC_CHAIN_REGNUM)) (clobber (reg:P LR_REGNO))] "DEFAULT_ABI == ABI_AIX && TARGET_POINTERS_TO_NESTED_FUNCTIONS" @@ -10718,8 +10721,8 @@ [(set (match_operand 0 "" "") (call (mem:SI (match_operand:P 1 "register_operand" "c,*l")) (match_operand 2 "" "g,g"))) - (use (match_operand:P 3 "memory_operand" "m,m")) - (set (reg:P TOC_REGNUM) (match_operand:P 4 "memory_operand" "m,m")) + (use (match_operand:P 3 "memory_operand" ",")) + (set (reg:P TOC_REGNUM) (match_operand:P 4 "memory_operand" ",")) (clobber (reg:P LR_REGNO))] "DEFAULT_ABI == ABI_AIX && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" " 2,%3\;b%T1l\; 2,%4" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d3407fdcbf8..49f87f1f4a9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-07 Jakub Jelinek + + PR target/56228 + * gcc.dg/pr56228.c: New test. + 2013-02-07 Alan Modra PR target/54009 diff --git a/gcc/testsuite/gcc.dg/pr56228.c b/gcc/testsuite/gcc.dg/pr56228.c new file mode 100644 index 00000000000..ccdcbe199a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr56228.c @@ -0,0 +1,16 @@ +/* PR target/56228 */ +/* { dg-do assemble } */ +/* { dg-options "-O2" } */ + +short a[14] = { 1, 2 }; +short b[15] = { 3, 4 }; + +int +foo () +{ + void (*fna) (void) = (void (*) (void)) a; + void (*fnb) (void) = (void (*) (void)) b; + fna (); + fnb (); + return a[1] == b[1]; +} -- 2.30.2