This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix DCE REG_LIBCALL note moving from noop move insns (PR rtl-optimization/33644)
Jakub Jelinek wrote:
> On Fri, Oct 19, 2007 at 11:54:52AM -0400, Jakub Jelinek wrote:
>
>> Anyway, just tried (sorry for the delay) removing the libcall stuff, just
>> generate:
>> (call_insn/u 5 4 6 mm2.c:4 (parallel [
>> (set (reg:DI 0 ax)
>> (call:DI (mem:QI (symbol_ref:DI ("__tls_get_addr")) [0 S1 A8])
>> (const_int 0 [0x0])))
>> (unspec:DI [
>> (const_int 0 [0x0])
>> ] 20)
>> ]) -1 (nil)
>> (nil))
>>
>> (insn 6 5 7 mm2.c:4 (set (reg:DI 60)
>> (reg:DI 0 ax)) -1 (nil))
>>
>> but CSE isn't able to merge these. Will still try to add REG_EQUAL note to
>> the pseudo = %rax insn if that helps.
>>
>
> Adding REG_EQUAL note was all that was needed for CSEing it, but dce.c still
> won't delete it, because it punts on all UNSPECs. The UNSPECs are really
> necessary for the __tls_get_addr call, as the call_insn has mandatory insn
> sequence that needs to be output there (to make TLS transitions possible).
> The comment says:
> /* The UNSPEC case was added here because the ia-64 claims that
> USEs do not work after reload and generates UNSPECS rather
> than USEs. Since dce is run after reload we need to avoid
> deleting these even if they are dead. If it turns out that
> USEs really do work after reload, the ia-64 should be
> changed, and the UNSPEC case can be removed. */
> I wonder what kind of UNSPECs and at what places were the reasons to add it,
> I very much doubt not dceing any UNSPECs is desirable, even on ia64.
> Say speculative moves use UNSPEC_LDS{,A}, but they certainly should be dced.
>
>
i think that it may be worthwhile to look into this case.
in ia64.md around line 5983.
;; As USE insns aren't meaningful after reload, this is used instead
;; to prevent deleting instructions setting registers for EH handling
(define_insn "prologue_use"
> --- gcc/config/i386/i386.c.jj 2007-10-19 14:39:55.000000000 +0200
> +++ gcc/config/i386/i386.c 2007-10-19 18:05:57.000000000 +0200
> @@ -7644,7 +7644,7 @@ legitimize_tls_address (rtx x, enum tls_
>
> if (TARGET_64BIT && ! TARGET_GNU2_TLS)
> {
> - rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
> + rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, last;
>
> start_sequence ();
> emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
> @@ -7652,7 +7652,10 @@ legitimize_tls_address (rtx x, enum tls_
> end_sequence ();
>
> CONST_OR_PURE_CALL_P (insns) = 1;
> - emit_libcall_block (insns, dest, rax, x);
> +/* emit_libcall_block (insns, dest, rax, x); */
> + emit_insn (insns);
> + emit_move_insn (dest, rax);
> + last = set_unique_reg_note (last, REG_EQUAL, x);
> }
> else if (TARGET_64BIT && TARGET_GNU2_TLS)
> emit_insn (gen_tls_global_dynamic_64 (dest, x));
> @@ -7673,7 +7676,7 @@ legitimize_tls_address (rtx x, enum tls_
>
> if (TARGET_64BIT && ! TARGET_GNU2_TLS)
> {
> - rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
> + rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note, last;
>
> start_sequence ();
> emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
> @@ -7683,7 +7686,10 @@ legitimize_tls_address (rtx x, enum tls_
> note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
> note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
> CONST_OR_PURE_CALL_P (insns) = 1;
> - emit_libcall_block (insns, base, rax, note);
> +/* emit_libcall_block (insns, base, rax, note); */
> + emit_insn (insns);
> + last = emit_move_insn (base, rax);
> + set_unique_reg_note (last, REG_EQUAL, note);
> }
> else if (TARGET_64BIT && TARGET_GNU2_TLS)
> emit_insn (gen_tls_local_dynamic_base_64 (base));
> --- gcc/dce.c.jj 2007-10-19 14:39:55.000000000 +0200
> +++ gcc/dce.c 2007-10-19 18:01:08.000000000 +0200
> @@ -102,7 +102,8 @@ deletable_insn_p (rtx insn, bool fast)
> rtx body, x;
> int i;
>
> - if (!NONJUMP_INSN_P (insn))
> + if (!NONJUMP_INSN_P (insn)
> + && (!CALL_P (insn) || !CONST_OR_PURE_CALL_P (insn)))
> return false;
>
> body = PATTERN (insn);
>
>
> Jakub
>