mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
Fix accounting of offsets in unadjusted_ptr_and_unit_offset
unadjusted_ptr_and_unit_offset accidentally throws away the offset computed by get_addr_base_and_unit_offset. Instead of passing extra_offset it passes offset. PR ipa/114207 gcc/ChangeLog: * ipa-prop.cc (unadjusted_ptr_and_unit_offset): Fix accounting of offsets in ADDR_EXPR. gcc/testsuite/ChangeLog: * gcc.c-torture/execute/pr114207.c: New test.
This commit is contained in:
parent
0d19fbc7b0
commit
391f46f10b
@ -1370,9 +1370,9 @@ unadjusted_ptr_and_unit_offset (tree op, tree *ret, poly_int64 *offset_ret)
|
||||
{
|
||||
if (TREE_CODE (op) == ADDR_EXPR)
|
||||
{
|
||||
poly_int64 extra_offset = 0;
|
||||
poly_int64 extra_offset;
|
||||
tree base = get_addr_base_and_unit_offset (TREE_OPERAND (op, 0),
|
||||
&offset);
|
||||
&extra_offset);
|
||||
if (!base)
|
||||
{
|
||||
base = get_base_address (TREE_OPERAND (op, 0));
|
||||
|
23
gcc/testsuite/gcc.c-torture/execute/pr114207.c
Normal file
23
gcc/testsuite/gcc.c-torture/execute/pr114207.c
Normal file
@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct S {
|
||||
int a, b;
|
||||
};
|
||||
|
||||
__attribute__((noinline))
|
||||
void foo (struct S *s) {
|
||||
struct S ss = (struct S) {
|
||||
.a = s->b,
|
||||
.b = s->a
|
||||
};
|
||||
*s = ss;
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct S s = {6, 12};
|
||||
foo(&s);
|
||||
if (s.a != 12 || s.b != 6)
|
||||
__builtin_abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user