From fb324f02097cf4175df7834104162199bddc4269 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 17 Nov 2016 00:22:16 +0100 Subject: [PATCH] re PR rtl-optimization/78378 (wrong code when combining shift + mult + zero_extend) PR rtl-optimization/78378 * combine.c (make_extraction): Use force_to_mode for non-{REG,MEM} inner only if pos is 0. Fix up formatting. * gcc.c-torture/execute/pr78378.c: New test. From-SVN: r242526 --- gcc/ChangeLog | 6 ++++++ gcc/combine.c | 8 ++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr78378.c | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr78378.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e5e55c9640..f7121991a1b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-16 Jakub Jelinek + + PR rtl-optimization/78378 + * combine.c (make_extraction): Use force_to_mode for non-{REG,MEM} + inner only if pos is 0. Fix up formatting. + 2016-11-17 Alan Modra PR rtl-optimization/78325 diff --git a/gcc/combine.c b/gcc/combine.c index ca5ddae9c78..5f920c4a55e 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7382,6 +7382,7 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, if (tmode != BLKmode && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0 && !MEM_P (inner) + && (pos == 0 || REG_P (inner)) && (inner_mode == tmode || !REG_P (inner) || TRULY_NOOP_TRUNCATION_MODES_P (tmode, inner_mode) @@ -7458,10 +7459,9 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, } else new_rtx = force_to_mode (inner, tmode, - len >= HOST_BITS_PER_WIDE_INT - ? HOST_WIDE_INT_M1U - : (HOST_WIDE_INT_1U << len) - 1, - 0); + len >= HOST_BITS_PER_WIDE_INT + ? HOST_WIDE_INT_M1U + : (HOST_WIDE_INT_1U << len) - 1, 0); /* If this extraction is going into the destination of a SET, make a STRICT_LOW_PART unless we made a MEM. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8958f86b898..20fcf383322 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-16 Jakub Jelinek + + PR rtl-optimization/78378 + * gcc.c-torture/execute/pr78378.c: New test. + 2016-11-16 Andrew Burgess * gcc.dg/tree-prof/section-attr-1.c: New file. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr78378.c b/gcc/testsuite/gcc.c-torture/execute/pr78378.c new file mode 100644 index 00000000000..05c1f9c771c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr78378.c @@ -0,0 +1,18 @@ +/* PR rtl-optimization/78378 */ + +unsigned long long __attribute__ ((noinline, noclone)) +foo (unsigned long long x) +{ + x <<= 41; + x /= 232; + return 1 + (unsigned short) x; +} + +int +main () +{ + unsigned long long x = foo (1); + if (x != 0x2c24) + __builtin_abort(); + return 0; +} -- 2.30.2