This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Oddity with REG_DEP_TRUE and subregs of multiword registers?
- From: Rask Ingemann Lambertsen <rask at sygehus dot dk>
- Cc: GCC development mailing list <gcc at gcc dot gnu dot org>
- Date: Thu, 13 Apr 2006 19:52:13 +0200
- Subject: Oddity with REG_DEP_TRUE and subregs of multiword registers?
Consider the file xordi.c:
signed long long int xordi (signed long long int a, signed long long int b)
{
return (a ^ b);
}
Compile like this (GCC version 4.1.0 20060304 (Red Hat 4.1.0-3)):
/usr/bin/gcc -march=pentium2 -O3 -fomit-frame-pointer \
/mnt/sysfs/rask/cvssrc/xordi.c -S -o /tmp/xordi.s -fdump-rtl-all
Then, in /tmp/xordi.c.26.life1, I get:
[cut]
;; Start of basic block 0, registers live: 6 [bp] 7 [sp] 16 [argp] 20 [frame]
(note 10 2 6 0 [bb 0] NOTE_INSN_BASIC_BLOCK)
(insn 6 10 7 0 (set (reg/v:DI 59 [ a ])
(mem/c/i:DI (reg/f:SI 16 argp) [2 a+0 S8 A32])) 56 {*movdi_2} (nil)
(nil))
(insn 7 6 8 0 (set (reg/v:DI 60 [ b ])
(mem/c/i:DI (plus:SI (reg/f:SI 16 argp)
(const_int 8 [0x8])) [2 b+0 S8 A32])) 56 {*movdi_2} (nil)
(nil))
(note 8 7 14 0 NOTE_INSN_FUNCTION_BEG)
(insn 14 8 12 0 (clobber (reg:DI 61)) -1 (nil)
(insn_list:REG_LIBCALL 15 (nil)))
(insn 12 14 13 0 (parallel [
(set (subreg:SI (reg:DI 61) 0)
(xor:SI (subreg:SI (reg/v:DI 59 [ a ]) 0)
(subreg:SI (reg/v:DI 60 [ b ]) 0)))
(clobber (reg:CC 17 flags))
]) 235 {*xorsi_1} (insn_list:REG_DEP_TRUE 6 (insn_list:REG_DEP_TRUE 7 (insn_list:REG_DEP_TRUE 14 (nil))))
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_NO_CONFLICT (reg/v:DI 59 [ a ])
(expr_list:REG_NO_CONFLICT (reg/v:DI 60 [ b ])
(nil)))))
(insn 13 12 15 0 (parallel [
(set (subreg:SI (reg:DI 61) 4)
(xor:SI (subreg:SI (reg/v:DI 59 [ a ]) 4)
(subreg:SI (reg/v:DI 60 [ b ]) 4)))
(clobber (reg:CC 17 flags))
]) 235 {*xorsi_1} (insn_list:REG_DEP_TRUE 12 (nil))
(expr_list:REG_DEAD (reg/v:DI 59 [ a ])
(expr_list:REG_DEAD (reg/v:DI 60 [ b ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_NO_CONFLICT (reg/v:DI 59 [ a ])
(expr_list:REG_NO_CONFLICT (reg/v:DI 60 [ b ])
(nil)))))))
[cut]
I don't understand why insn 13 is supposed to have a dependency on insn 12.
There is no overlap between the subregs. I would have thought that insn 13
should have a dependency on insn 6, 7 and possibly 14, like insn 12.
Am I simply misunderstanding the purpose of (undocumented) REG_DEP_TRUE?
--
Rask Ingemann Lambertsen