+2011-09-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR middle-end/50266
+ * c-common.c (c_fully_fold_internal) <ADDR_EXPR>: Fold offsetof-like
+ computations.
+
2011-09-05 Richard Guenther <rguenther@suse.de>
* c-common.c (complete_array_type): Use ssize_int (-1) instead
STRIP_TYPE_NOPS (op0);
if (code != ADDR_EXPR && code != REALPART_EXPR && code != IMAGPART_EXPR)
op0 = decl_constant_value_for_optimization (op0);
- if (op0 != orig_op0 || in_init)
+ /* ??? Cope with user tricks that amount to offsetof. The middle-end is
+ not prepared to deal with them if they occur in initializers. */
+ if (op0 != orig_op0
+ && code == ADDR_EXPR
+ && (op1 = get_base_address (op0)) != NULL_TREE
+ && TREE_CODE (op1) == INDIRECT_REF
+ && TREE_CONSTANT (TREE_OPERAND (op1, 0)))
+ {
+ tree offset = fold_offsetof (op0, op1);
+ op1
+ = fold_convert_loc (loc, TREE_TYPE (expr), TREE_OPERAND (op1, 0));
+ ret = fold_build_pointer_plus_loc (loc, op1, offset);
+ }
+ else if (op0 != orig_op0 || in_init)
ret = in_init
? fold_build1_initializer_loc (loc, code, TREE_TYPE (expr), op0)
: fold_build1_loc (loc, code, TREE_TYPE (expr), op0);
+2011-09-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.c-torture/compile/20110906-1.c: New test.
+
2011-09-06 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/builtin-apply-mmx.c: Require ia32 effective target.
--- /dev/null
+/* PR middle-end/50266 */
+/* Testcase by <bero@arklinux.org> */
+
+struct a {
+ unsigned int a;
+ unsigned int b;
+};
+
+struct a *const p = (struct a *)0x4A004100;
+
+void foo(void)
+{
+ unsigned int i = 0;
+ unsigned int *const x[] = {
+ &p->a,
+ &p->b,
+ 0
+ };
+
+ (*(volatile unsigned int *)((x[i]))
+ = (unsigned int)((unsigned int)((*(volatile unsigned int *)(x[i])))));
+}