Commit f22cfd73 by Eric Botcazou Committed by Eric Botcazou

re PR middle-end/51994 (git-1.7.8.3 miscompiled due to negative bitpos from get_inner_reference)

	PR middle-end/51994
	* expr.c (get_inner_reference): If there is an offset, add a negative
	bit position to it (if any).

From-SVN: r183974
parent 13a72c0b
2012-02-07 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/51994
* expr.c (get_inner_reference): If there is an offset, add a negative
bit position to it (if any).
2012-02-07 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/52060
......
......@@ -6716,6 +6716,24 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
/* Otherwise, split it up. */
if (offset)
{
/* Avoid returning a negative bitpos as this may wreak havoc later. */
if (double_int_negative_p (bit_offset))
{
double_int mask
= double_int_mask (BITS_PER_UNIT == 8
? 3 : exact_log2 (BITS_PER_UNIT));
double_int tem = double_int_and_not (bit_offset, mask);
/* TEM is the bitpos rounded to BITS_PER_UNIT towards -Inf.
Subtract it to BIT_OFFSET and add it (scaled) to OFFSET. */
bit_offset = double_int_sub (bit_offset, tem);
tem = double_int_rshift (tem,
BITS_PER_UNIT == 8
? 3 : exact_log2 (BITS_PER_UNIT),
HOST_BITS_PER_DOUBLE_INT, true);
offset = size_binop (PLUS_EXPR, offset,
double_int_to_tree (sizetype, tem));
}
*pbitpos = double_int_to_shwi (bit_offset);
*poffset = offset;
}
......
2012-02-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc.c-torture/execute/20120207-1.c: New test.
2012-02-07 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/52060
......
/* PR middle-end/51994 */
/* Testcase by Uros Bizjak <ubizjak@gmail.com> */
extern char *strcpy (char *, const char *);
extern void abort (void);
char __attribute__((noinline))
test (int a)
{
char buf[16];
char *output = buf;
strcpy (&buf[0], "0123456789");
output += a;
output -= 1;
return output[0];
}
int main ()
{
if (test (2) != '1')
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment