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
This commit is contained in:
Jakub Jelinek 2016-11-17 00:22:16 +01:00 committed by Jakub Jelinek
parent 8972f7e90b
commit fb324f0209
4 changed files with 33 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2016-11-16 Jakub Jelinek <jakub@redhat.com>
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 <amodra@gmail.com>
PR rtl-optimization/78325

View File

@ -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. */

View File

@ -1,3 +1,8 @@
2016-11-16 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/78378
* gcc.c-torture/execute/pr78378.c: New test.
2016-11-16 Andrew Burgess <andrew.burgess@embecosm.com>
* gcc.dg/tree-prof/section-attr-1.c: New file.

View File

@ -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;
}