From 7a708f68bfb52c2986e2ef39bfa40a7bb3fbb51e Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Wed, 15 Jul 2015 09:28:33 +0200 Subject: [PATCH] re PR rtl-optimization/66838 (Calling multiple SYSV AMD64 ABI functions from MS x64 ABI one results in clobbered parameters) PR rtl-optimization/66838 * postreload.c (reload_cse_move2add): Also process CALL_INSN_FUNCTION_USAGE when resetting information of call-clobbered registers. testsuite/ChangeLog: PR rtl-optimization/66838 * gcc.target/i386/pr66838.c: New test. From-SVN: r225806 --- gcc/ChangeLog | 13 ++++++--- gcc/postreload.c | 17 ++++++++++++ gcc/testsuite/ChangeLog | 27 +++++++++++-------- gcc/testsuite/gcc.target/i386/pr66838.c | 36 +++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr66838.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e7fbabac88..327564f5883 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-07-15 Uros Bizjak + + PR rtl-optimization/66838 + * postreload.c (reload_cse_move2add): Also process + CALL_INSN_FUNCTION_USAGE when resetting information of + call-clobbered registers. + 2015-07-14 Sandra Loosemore Cesar Philippidis Chung-Lin Tang @@ -21,8 +28,8 @@ (nios2_expand_cache_builtin): New function. (nios2_expand_wrpie_builtin): New function. (nios2_expand_eni_builtin): New function. - (nios2_expand_builtin): Add arch field handling and new builtin - cases. + (nios2_expand_builtin): Add arch field handling and new builtin + cases. * doc/extend.texi (Altera Nios II Built-in Functions): Document new builtins. * doc/md.texi (Machine Constraints): Document U and v constraints. @@ -271,7 +278,7 @@ * omega.h: Don't include config.h, don't include params.h again if omega.h has already been included. * graphite-poly.h: Include sese.h. - * graphite.c: Don't include sese.h, remove needless includes and + * graphite.c: Don't include sese.h, remove needless includes and minimize includes outside #ifdef HAVE_isl block. * graphite-blocking.c: Don't include sese.h, remove needless includes, and wrap entire file in #ifdef HAVE_isl diff --git a/gcc/postreload.c b/gcc/postreload.c index a7eb55f293d..88d5234eef3 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -2127,12 +2127,29 @@ reload_cse_move2add (rtx_insn *first) unknown values. */ if (CALL_P (insn)) { + rtx link; + for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--) { if (call_used_regs[i]) /* Reset the information about this register. */ reg_mode[i] = VOIDmode; } + + for (link = CALL_INSN_FUNCTION_USAGE (insn); link; + link = XEXP (link, 1)) + { + rtx setuse = XEXP (link, 0); + rtx usage_rtx = XEXP (setuse, 0); + if (GET_CODE (setuse) == CLOBBER + && REG_P (usage_rtx)) + { + unsigned int end_regno = END_REGNO (usage_rtx); + for (unsigned int r = REGNO (usage_rtx); r < end_regno; ++r) + /* Reset the information about this register. */ + reg_mode[r] = VOIDmode; + } + } } } return changed; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5a27072e8e..82d8660ce6a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-07-15 Uros Bizjak + + PR rtl-optimization/66838 + * gcc.target/i386/pr66838.c: New test. + 2015-07-14 Patrick Palka PR c++/66850 @@ -356,7 +361,7 @@ * gcc.target/mips/umips-branch-14.c: New file. * gcc.target/mips/umips-branch-15.c: New file. * gcc.target/mips/umips-branch-16.c: New file. - * gcc.target/mips/branch-helper.h (OCCUPY_0x10000): New define. + * gcc.target/mips/branch-helper.h (OCCUPY_0x10000): New define. (OCCUPY_0xfffc): New define. 2015-07-08 Renlin Li @@ -427,10 +432,10 @@ * gcc.target/arm/attr_thumb-static.c: Test for all targets. Fix return value. -2015-05-05 Jakub Jelinek +2015-07-06 Jakub Jelinek - PR target/65956 - * gcc.c-torture/execute/pr65956.c: New test. + PR target/65956 + * gcc.c-torture/execute/pr65956.c: New test. 2015-07-06 Alan Lawrence @@ -616,7 +621,7 @@ * gcc.target/arm/armv8-sync-op-full.c: Likewise. * gcc.target/arm/armv8-sync-op-release.c: Likewise. * gcc.target/arm/armv8-sync-op-acquire.c: Likewise. Also, replace - 'stlex' with 'strex' as the expected output. + 'stlex' with 'strex' as the expected output. 2015-07-01 Paolo Carlini @@ -860,7 +865,7 @@ 2015-06-24 Ramana Radhakrishnan * gcc.target/arm/fixed_float_conversion.c: Skip for inappropriate - multilibs. + multilibs. * gcc.target/arm/memset-inline-10.c: Likewise. * gcc.target/arm/pr58784.c: Likewise. * gcc.target/arm/pr59985.C: Likewise. @@ -898,9 +903,9 @@ 2015-06-24 James Greenhalgh - * lib/c-torture.exp: Don't call check_effective_target_lto + * lib/c-torture.exp: Don't call check_effective_target_lto before setting up environment correctly. - * lib/gcc-dg.exp: Likewise, and protect + * lib/gcc-dg.exp: Likewise, and protect gcc_force_conventional_output. 2015-06-24 Andreas Krebbel @@ -920,7 +925,7 @@ 2015-06-23 Chen Gang - PR target/65803 + PR target/65803 * gcc.c-torture/pr65803.c: New test. 2015-06-23 Patrick Palka @@ -1820,8 +1825,8 @@ 2015-06-01 Alex Velenko - * gcc.target/arm/thumb-ltu.c (foo): Predefined. - (bar): Predefined. + * gcc.target/arm/thumb-ltu.c (foo): Predefined. + (bar): Predefined. 2015-06-01 Richard Biener diff --git a/gcc/testsuite/gcc.target/i386/pr66838.c b/gcc/testsuite/gcc.target/i386/pr66838.c new file mode 100644 index 00000000000..46effedad3b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66838.c @@ -0,0 +1,36 @@ +/* { dg-do run { target lp64 } } */ +/* { dg-options "-O2" } */ + +void abort (void); + +char global; + +__attribute__((sysv_abi, noinline, noclone)) +void sysv_abi_func(char const *desc, void *local) +{ + register int esi asm ("esi"); + register int edi asm ("edi"); + + if (local != &global) + abort (); + + /* Clobber some of the extra SYSV ABI registers. */ + asm volatile ("movl\t%2, %0\n\tmovl\t%2, %1" + : "=r" (esi), "=r" (edi) + : "i" (0xdeadbeef)); +} + +__attribute__((ms_abi, noinline, noclone)) +void ms_abi_func () +{ + sysv_abi_func ("1st call", &global); + sysv_abi_func ("2nd call", &global); + sysv_abi_func ("3rd call", &global); +} + +int +main(void) +{ + ms_abi_func(); + return 0; +}