Commit 0f784346 by Richard Biener Committed by Richard Biener

re PR middle-end/80262 (address space gets lost in memory access)

2017-04-06  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/80262
	* tree-sra.c (build_ref_for_offset): Preserve address-space
	information.
	* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address):
	Drop useless address-space information on MEM_REF offsets.

	* gcc.target/i386/pr80262.c: New testcase.

From-SVN: r246728
parent 23a429c2
2017-04-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/80262
* tree-sra.c (build_ref_for_offset): Preserve address-space
information.
* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address):
Drop useless address-space information on MEM_REF offsets.
2017-04-05 Andreas Schwab <schwab@linux-m68k.org> 2017-04-05 Andreas Schwab <schwab@linux-m68k.org>
* builtins.def (BUILT_IN_UPDATE_SETJMP_BUF): Fix type. * builtins.def (BUILT_IN_UPDATE_SETJMP_BUF): Fix type.
......
2017-04-06 Richard Biener <rguenther@suse.de> 2017-04-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/80262
* gcc.target/i386/pr80262.c: New testcase.
2017-04-06 Richard Biener <rguenther@suse.de>
PR middle-end/80281 PR middle-end/80281
* gcc.dg/tree-ssa/pr40921.c: Add -fp-contract=off. * gcc.dg/tree-ssa/pr40921.c: Add -fp-contract=off.
......
/* { dg-do compile } */
/* { dg-options "-O2" } */
typedef struct {
int v;
} S1;
S1 clearS1 () { S1 s1 = { 0 }; return s1; }
typedef struct {
S1 s1[4];
} S2;
void clearS2 (__seg_gs S2* p, int n) {
for (int i = 0; i < n; ++i)
p->s1[i] = clearS1 ();
}
typedef struct {
int pad;
S2 s2;
} S3;
long int BASE;
void fn1(int n) {
clearS2 (&(((__seg_gs S3*)(BASE))->s2), n);
}
...@@ -1638,6 +1638,13 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, ...@@ -1638,6 +1638,13 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset,
unsigned HOST_WIDE_INT misalign; unsigned HOST_WIDE_INT misalign;
unsigned int align; unsigned int align;
/* Preserve address-space information. */
addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (base));
if (as != TYPE_ADDR_SPACE (exp_type))
exp_type = build_qualified_type (exp_type,
TYPE_QUALS (exp_type)
| ENCODE_QUAL_ADDR_SPACE (as));
gcc_checking_assert (offset % BITS_PER_UNIT == 0); gcc_checking_assert (offset % BITS_PER_UNIT == 0);
get_object_alignment_1 (base, &align, &misalign); get_object_alignment_1 (base, &align, &misalign);
base = get_addr_base_and_unit_offset (base, &base_offset); base = get_addr_base_and_unit_offset (base, &base_offset);
......
...@@ -1233,8 +1233,8 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, ...@@ -1233,8 +1233,8 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
&& tem[tem.length () - 2].opcode == MEM_REF) && tem[tem.length () - 2].opcode == MEM_REF)
{ {
vn_reference_op_t new_mem_op = &tem[tem.length () - 2]; vn_reference_op_t new_mem_op = &tem[tem.length () - 2];
new_mem_op->op0 = fold_convert (TREE_TYPE (mem_op->op0), new_mem_op->op0 = wide_int_to_tree (TREE_TYPE (mem_op->op0),
new_mem_op->op0); new_mem_op->op0);
} }
else else
gcc_assert (tem.last ().opcode == STRING_CST); gcc_assert (tem.last ().opcode == STRING_CST);
......
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