This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]