[Bug middle-end/44790] Bootstrap fails after MEM-REF merge

2010-07-03 Thread rguenth at gcc dot gnu dot org


--- Comment #2 from rguenth at gcc dot gnu dot org  2010-07-03 11:17 ---
The code in question is likely expr.c:8830 ff:

address_mode = targetm.addr_space.address_mode (as);
op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, address_mode,
   EXPAND_NORMAL);
if (!integer_zerop (TREE_OPERAND (exp, 1)))
  {
rtx off;
off = immed_double_int_const (mem_ref_offset (exp), address_mode);
op0 = simplify_gen_binary (PLUS, address_mode, op0, off);
  }
op0 = memory_address_addr_space (mode, op0, as);
temp = gen_rtx_MEM (mode, op0);

I see that POINTER_PLUS_EXPR would end up doing

;; ap_2 = ap_1 + 8;

(insn 10 9 11 t.i:8 (set (reg:SI 345)
(plus:SI (subreg/s/v:SI (reg/v/f:DI 339 [ ap+-4 ]) 4)
(const_int 8 [0x8]))) -1 (nil))

(insn 11 10 0 t.i:8 (set (reg/v/f:DI 340 [ ap+-4 ])
(unspec:DI [
(reg:SI 345)
] 24)) -1 (nil))

thus appearantly the pointer mode is DI but offsets are 32bit(?!)

OTOH doing

Index: expr.c
===
--- expr.c  (revision 161771)
+++ expr.c  (working copy)
@@ -8817,14 +8817,12 @@ expand_expr_real_1 (tree exp, rtx target
  }
  }
address_mode = targetm.addr_space.address_mode (as);
-   op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, address_mode,
-  EXPAND_NORMAL);
+   base = TREE_OPERAND (exp, 0);
if (!integer_zerop (TREE_OPERAND (exp, 1)))
- {
-   rtx off;
-   off = immed_double_int_const (mem_ref_offset (exp), address_mode);
-   op0 = simplify_gen_binary (PLUS, address_mode, op0, off);
- }
+ base = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base),
+base, double_int_to_tree (sizetype,
+  mem_ref_offset (exp)));
+   op0 = expand_expr (base, NULL_RTX, address_mode, EXPAND_SUM);
op0 = memory_address_addr_space (mode, op0, as);
temp = gen_rtx_MEM (mode, op0);
set_mem_attributes (temp, exp, 0);

generates

(insn 13 12 14 t.i:8 (set (reg:DI 346)
(reg/v/f:DI 339 [ ap+-4 ])) -1 (nil))

(insn 14 13 15 t.i:8 (set (reg/f:DI 347)
(plus:DI (reg/v/f:DI 339 [ ap+-4 ])
(const_int 4 [0x4]))) -1 (nil))

(insn 15 14 16 t.i:9 (set (reg:SI 348)
(mem:SI (reg/f:DI 347) [0 MEM[(long int *)ap_1 + 4B]+0 S4 A32])) -1
(nil))

which doesn't use an UNSPEC either.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44790



[Bug middle-end/44790] Bootstrap fails after MEM-REF merge

2010-07-02 Thread sje at cup dot hp dot com


--- Comment #1 from sje at cup dot hp dot com  2010-07-02 19:49 ---
This may be related to &x + CST folding.  The bug only happens at -O1 or above.
I think I forgot to mention that in the original bug report.
When I look at the expand dump and the comparision to 123 I see:


(insn 17 16 18 3 x.c:8 (set (reg:DI 348)
(zero_extend:DI (subreg/s/v:SI (reg/v/f:DI 339 [ ap+-4 ]) 4))) -1
(nil))

(insn 18 17 19 3 x.c:8 (set (reg/f:DI 347)
(plus:DI (reg:DI 348)
(const_int 4 [0x4]))) -1 (nil))

(insn 19 18 20 3 x.c:9 (set (reg:SI 349)
(mem:SI (reg/f:DI 347) [0 MEM[(int *)ap_1 + 4B]+0 S4 A32])) -1 (nil))

(insn 20 19 21 3 x.c:9 (set (reg:BI 350)
(eq:BI (reg:SI 349)
(const_int 123 [0x7b]))) -1 (nil))

Instruction 17, where we set r348 to zero_extend of r339 looks wrong.  We
need to do a pointer extend here, I.e. (unspec 24) go generate an addp4.
r349 is not a valid pointer after instruction 17 and this generates the fault.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44790