https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78633
--- Comment #11 from Kazumoto Kojima <kkojima at gcc dot gnu.org> --- Created attachment 40271 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40271&action=edit reduce testcase With -O1, sh4-linux compiler makes insns (insn 67 150 165 5 (set (reg:SI 239) (and:SI (subreg:SI (reg/v:DI 163 [ high ]) 0) (const_int 1 [0x1]))) "test.c":34 88 {*andsi_compact} (nil)) (insn 165 67 74 5 (set (reg:SI 147 t) (eq:SI (and:SI (subreg:SI (reg/v:DI 163 [ high ]) 0) (const_int 1 [0x1])) (const_int 0 [0]))) "test.c":34 -1 (nil)) and two (subreg:SI (reg/v:DI 163 [ high ]) 0) are shared. emit-rtl.c:verify_rtl_sharing calls verify_insn_sharing for these insns and verify_insn_sharing marks rtxes with verify_rtx_sharing. SUBREG rtx is always marked as used with verify_rtx_sharing. Then the second subreg is reported as erroneous because it's already marked as used. I think that this is a false positive. It seems to me that SUBREG should be handled specially. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 4650540..4fa4773 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2714,6 +2714,9 @@ verify_rtx_sharing (rtx orig, rtx insn) case SCRATCH: /* SCRATCH must be shared because they represent distinct values. */ return; + case SUBREG: + verify_rtx_sharing (SUBREG_REG (x), insn); + return; case CLOBBER: /* Share clobbers of hard registers (like cc0), but do not share pseudo reg clobbers or clobbers of hard registers that originated as pseudos. I could be totally wrong about that, though.