From 966a140df68bf3e2d378fb9b68a8afb7d80b34d6 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 12 Feb 2018 11:32:18 -0700 Subject: [PATCH] cse.c (try_back_substitute_reg): Move any REG_ARGS_SIZE note when successfully back substituting a reg. * cse.c (try_back_substitute_reg): Move any REG_ARGS_SIZE note when successfully back substituting a reg. * gcc.c-torture/compile/reg-args-size.c: New test. From-SVN: r257598 --- gcc/ChangeLog | 5 +++ gcc/cse.c | 9 +++++ gcc/testsuite/ChangeLog | 4 +++ .../gcc.c-torture/compile/regs-arg-size.c | 36 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/regs-arg-size.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a264391268..d5913d0a7db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-02-12 Jeff Law + + * cse.c (try_back_substitute_reg): Move any REG_ARGS_SIZE note when + successfully back substituting a reg. + 2018-02-12 Richard Biener PR tree-optimization/84037 diff --git a/gcc/cse.c b/gcc/cse.c index 825b0bd8989..a73a771041a 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -4256,6 +4256,15 @@ try_back_substitute_reg (rtx set, rtx_insn *insn) && (reg_mentioned_p (dest, XEXP (note, 0)) || rtx_equal_p (src, XEXP (note, 0)))) remove_note (insn, note); + + /* If INSN has a REG_ARGS_SIZE note, move it to PREV. */ + note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX); + if (note != 0) + { + remove_note (insn, note); + gcc_assert (!find_reg_note (prev, REG_ARGS_SIZE, NULL_RTX)); + set_unique_reg_note (prev, REG_ARGS_SIZE, XEXP (note, 0)); + } } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dba0bedb7cf..8f22a65c7bb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-02-12 Jeff Law + + * gcc.c-torture/compile/reg-args-size.c: New test. + 2018-02-12 Carl Love * gcc.target/powerpc/builtins-4-runnable.c (main): Move int128 and diff --git a/gcc/testsuite/gcc.c-torture/compile/regs-arg-size.c b/gcc/testsuite/gcc.c-torture/compile/regs-arg-size.c new file mode 100644 index 00000000000..0ca0b9f034b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/regs-arg-size.c @@ -0,0 +1,36 @@ +int foo; +typedef long unsigned int size_t; +typedef short unsigned int wchar_t; +struct tm +{ + int tm_mday; + int tm_mon; + int tm_year; +}; +size_t +__strftime (wchar_t * s, size_t maxsize, const wchar_t * format, const struct tm *tim_p) +{ + size_t count = 0; + int len = 0; + size_t i, ctloclen; + unsigned long width; + { + if (foo) + { + { + wchar_t *fmt = L"%s%.*d"; + len = swprintf (&s[count], maxsize, fmt, "-", width, 0); + } + if ((count) >= maxsize) + return 0; + } + else + { + len = + swprintf (&s[count], maxsize - count, L"%.2d/%.2d/%.2d", 42, 99, 0); + if ((count) >= maxsize) + return 0; + + } + } +} -- 2.30.2