https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78222

--- Comment #1 from Chen Gang <gang.chen.5i5j at gmail dot com> ---
The root cause is: in tilegx_gen_bundle, gcc will lose prev insn when it
deletes useless insns.

The related insns before tilegx_gen_bbundle (it is correct).

249 (insn:TI 71 68 75 4 (set (mem:DI (reg/f:DI 10 r10 [112]) [3 *rp_19(D)+8 S8
A64])
250         (reg:DI 32 r32 [orig:115 r+8 ] [115])) "test.c":25 4 {*movdi_insn}
251      (expr_list:REG_DEAD (reg:DI 32 r32 [orig:115 r+8 ] [115])
252         (expr_list:REG_DEAD (reg/f:DI 10 r10 [112])
253             (nil))))
254 (insn 75 71 78 4 (unspec_volatile [
255             (const_int 0 [0])
256         ] 201) "test.c":27 162 {blockage}
257      (nil))
258 (insn 78 71 160 4 (unspec_volatile [
259             (const_int 0 [0])
260         ] 201) "test.c":27 162 {blockage}
261      (nil))
262
263
264 (insn:TI 144 160 142 4 (set (reg:DI 28 r28)
265         (plus:DI (reg/f:DI 54 sp)
266             (const_int 120 [0x78]))) "test.c":27 38 {adddi3}
267      (nil))
268 (insn 142 144 79 4 (set (reg:DI 29 r29)
269         (plus:DI (reg/f:DI 54 sp)
270             (const_int 128 [0x80]))) "test.c":27 38 {adddi3}
271      (nil))


The insns after tilegx_gen_bundle (remove 2 useless insns, but forgot to
correct the prev insn)

249 (insn:SI # 0 0 4 (set (mem:DI (reg/f:DI 10 r10 [112]) [ *rp_19(D)+8 S8
A64])
250         (reg:DI 32 r32 [orig:115 r+8 ] [115])) "test.c":25# {*movdi_insn}
251      (expr_list:REG_DEAD (reg:DI 32 r32 [orig:115 r+8 ] [115])
252         (expr_list:REG_DEAD (reg/f:DI 10 r10 [112])
253             (nil))))
254 (insn:SI # 0 0 4 (set (reg:DI 28 r28)
255         (plus:DI (reg/f:DI 54 sp)
256             (const_int 120 [0x78]))) "test.c":27# {adddi3}
257      (nil))
258 (insn:QI # 0 0 4 (set (reg:DI 29 r29)
259         (plus:DI (reg/f:DI 54 sp)
260             (const_int 128 [0x80]))) "test.c":27# {adddi3}
261      (nil))


The correct insns after tilegx_gen_bundle should be:

220 (insn:QI # 0 0 4 (set (mem:DI (reg/f:DI 10 r10 [112]) [ *rp_19(D)+8 S8
A64])
221         (reg:DI 32 r32 [orig:115 r+8 ] [115])) "test.c":25# {*movdi_insn}
222      (expr_list:REG_DEAD (reg:DI 32 r32 [orig:115 r+8 ] [115])
223         (expr_list:REG_DEAD (reg/f:DI 10 r10 [112])
224             (nil))))
225 (note # 0 0 NOTE_INSN_EPILOGUE_BEG)
226 (insn:SI # 0 0 4 (set (reg:DI 28 r28)
227         (plus:DI (reg/f:DI 54 sp)
228             (const_int 120 [0x78]))) "test.c":27# {adddi3}
229      (nil))
230 (insn:QI # 0 0 4 (set (reg:DI 29 r29)
231         (plus:DI (reg/f:DI 54 sp)
232             (const_int 128 [0x80]))) "test.c":27# {adddi3}
233      (nil))
234 (insn # 0 0 4 (use (reg/i:TI 0 r0)) "test.c":27#
235      (nil))


I shall make patch for it next.

Reply via email to