Another missed piece, exposed by less MEM_REF -> ARRAY_REF folding. Interestingly only for Ada testcases.
Bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2011-08-26 Richard Guenther <rguent...@suse.de> * varasm.c (decode_addr_const): Handle MEM_REF[&X, OFF]. Index: gcc/varasm.c =================================================================== *** gcc/varasm.c (revision 178096) --- gcc/varasm.c (working copy) *************** decode_addr_const (tree exp, struct addr *** 2592,2597 **** --- 2592,2603 ---- * tree_low_cst (TREE_OPERAND (target, 1), 0)); target = TREE_OPERAND (target, 0); } + else if (TREE_CODE (target) == MEM_REF + && TREE_CODE (TREE_OPERAND (target, 0)) == ADDR_EXPR) + { + offset += mem_ref_offset (target).low; + target = TREE_OPERAND (TREE_OPERAND (target, 0), 0); + } else if (TREE_CODE (target) == INDIRECT_REF && TREE_CODE (TREE_OPERAND (target, 0)) == NOP_EXPR && TREE_CODE (TREE_OPERAND (TREE_OPERAND (target, 0), 0))