From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 1C5DC384B0C0 for ; Mon, 27 Apr 2020 07:46:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1C5DC384B0C0 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=richard.sandiford@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B122F31B; Mon, 27 Apr 2020 00:46:22 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3D9943F68F; Mon, 27 Apr 2020 00:46:22 -0700 (PDT) From: Richard Sandiford To: William Tambe via Gcc-help Mail-Followup-To: William Tambe via Gcc-help , William Tambe , richard.sandiford@arm.com Subject: Re: how to use emit_clobber () ? References: Date: Mon, 27 Apr 2020 08:46:21 +0100 In-Reply-To: (William Tambe via Gcc-help's message of "Sat, 25 Apr 2020 15:52:59 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-help@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-help mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Apr 2020 07:46:26 -0000 William Tambe via Gcc-help writes: > Correcting typo in my previous email. > > On Sat, Apr 25, 2020 at 3:21 PM William Tambe wrote: >> >> The following define_expand is used to generate a call to >> __tls_get_addr() when the first operand of movsi is detected as a TLS >> symbol by tls_symbol_operand(). >> >> I am trying to accomplish generating a call to __tls_get_addr() >> passing two arguments in two registers where I would like to clobber >> the first register argument. >> >> However the use of emit_clobber() has no effect. >> >> Any idea, how emit_clobber should be used below ? >> >> (define_expand "movsi" >> [(set (match_operand:SI 0 "nonimmediate_operand" "") >> (match_operand:SI 1 "general_operand" ""))] >> "" >> { >> rtx op0 = operands[0]; >> rtx op1 = operands[1]; >> if (tls_symbolic_operand (op0, VOIDmode)) { >> rtx arg0 = gen_rtx_REG (SImode, ARCH_FIRST_ARG_REGNUM); >> rtx arg1 = gen_rtx_REG (SImode, ARCH_FIRST_ARG_REGNUM+1); >> emit_insn (arg1); >> emit_clobber (gen__movsi (arg0, op0)); > > Above is incorrect; what I am using is below: > emit_clobber (arg1); > emit_insn (gen__movsi (arg0, op0)); > > Question remain the same; any idea how emit_clobber should be used in > order to have an effect ? > >> rtx fn = gen_rtx_MEM (FUNCTION_MODE, gen_arch_tga()); >> rtx_insn *insn = emit_call_insn (gen_call_value (arg0, fn, const0_rtx)); >> RTL_CONST_CALL_P (insn) = 1; >> use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg0); >> use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg1); The last line says that the call uses the current value of arg1, but nothing in the above seems to set arg1 to a real value. What is the clobber of arg1 meant to model? I.e. what actually clobbers arg1? Is it the call itself? If so, is arg1 normally preserved by calls on this target? If arg1 is normally preserved by calls, you can make an exception for this call by adding a CLOBBER (rather than a USE) to the CALL_INSN_FUNCTION_USAGE. If arg1 is normally clobbered by calls, you shouldn't need to do anything special. On most targets, the __tls_get_addr function preserves many more registers than the normal ABI, so it is often better not to represent it as a call_insn. E.g. arm.md has: ;; tls descriptor call (define_insn "tlscall" [(set (reg:SI R0_REGNUM) (unspec:SI [(reg:SI R0_REGNUM) (match_operand:SI 0 "" "X") (match_operand 1 "" "")] UNSPEC_TLS)) (clobber (reg:SI R1_REGNUM)) (clobber (reg:SI LR_REGNUM)) (clobber (reg:SI CC_REGNUM))] "TARGET_GNU2_TLS" { targetm.asm_out.internal_label (asm_out_file, "LPIC", INTVAL (operands[1])); return "bl\\t%c0(tlscall)"; } [(set_attr "conds" "clob") (set_attr "length" "4") (set_attr "type" "branch")] ) which says that only R0, R1, LR and CC are clobbered by the call. Thanks, Richard