From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id 1D0D2398B412 for ; Tue, 15 Sep 2020 13:23:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1D0D2398B412 Received: by mail-pj1-x102e.google.com with SMTP id u3so1708340pjr.3 for ; Tue, 15 Sep 2020 06:23:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=VpYlcLIytuRB598e6zF8a4/zNNFWqqwCKNEzmsN6dvE=; b=rnazm/l73f7CXghxl8mIkTqxau8Kd9zJhpIfIISxCOje+ZGGLg4WqsRfX0MJTGQkBE UMKMqCF0z7NINYinpv/n+XjtZNtn4aq4cstd3/wgRgFdkMx4i6oDJHxfrerOKigH+0Pn h92RG0DFw8ouEaM7E2UmtGxd9ZMk9krdrmcZNHWlFLiasp+ZqBy/PAXAjaP1BHiKt5Sd HZfi0Upg3a/aRGTJfXyBNBPhHDvUDELOVej8I742yayMxoW8MkVn7EQsqc7IGLqPtUAs 57rm8STvJxIJI4KHtxd2XrWR3pv1Zl9QSJXckALWdtRfRp/8WaHvdAqXyR+CPAdOKfnS ppaw== X-Gm-Message-State: AOAM531hpkd2ijsPB5ZVgTiDfcpGpuTr+QVJCMt1Z5dZ3/u9EbtG2Gxe GqkdW9zTqBK0mu0zGWNH7/U= X-Google-Smtp-Source: ABdhPJzAF/qnYnRi4fStViFaHF2W5chhpD4/qUytxAn+NUocn3dQzx+agipXMd7GQTe+DMPe0wBF5g== X-Received: by 2002:a17:902:d312:b029:d1:e5e7:be07 with SMTP id b18-20020a170902d312b02900d1e5e7be07mr1704030plc.58.1600176208055; Tue, 15 Sep 2020 06:23:28 -0700 (PDT) Received: from gnu-cfl-2.localdomain (c-69-181-90-243.hsd1.ca.comcast.net. [69.181.90.243]) by smtp.gmail.com with ESMTPSA id x3sm13993835pfo.95.2020.09.15.06.23.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2020 06:23:27 -0700 (PDT) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id BD2FA1A014C; Tue, 15 Sep 2020 06:23:26 -0700 (PDT) From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: [PATCH] LRA: Make fixed eliminable registers live Date: Tue, 15 Sep 2020 06:23:26 -0700 Message-Id: <20200915132326.60695-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Sep 2020 13:23:31 -0000 commit 1bcb4c4faa4bd6b1c917c75b100d618faf9e628c Author: Richard Sandiford Date: Wed Oct 2 07:37:10 2019 +0000 [LRA] Don't make eliminable registers live (PR91957) didn't make eliminable registers live which breaks register void *cur_pro asm("reg"); where "reg" is an eliminable register. Make fixed eliminable registers live to fix it. Tested on Linux/x86-64 as well as csky-linux-gnuabiv2 soft-float and hard-float glibc builds. gcc/ PR middle-end/91957 * lra-lives.c (make_hard_regno_dead): Record conflicts for fixed eliminable registers. (make_hard_regno_live): Likewise, and make them live. gcc/testsuite/ PR middle-end/91957 * g++.target/i386/pr97054.C: New test. --- gcc/lra-lives.c | 5 +- gcc/testsuite/g++.target/i386/pr97054.C | 96 +++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.target/i386/pr97054.C diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c index 917c617903f..226fe6a69f0 100644 --- a/gcc/lra-lives.c +++ b/gcc/lra-lives.c @@ -282,7 +282,8 @@ make_hard_regno_live (int regno) { lra_assert (HARD_REGISTER_NUM_P (regno)); if (TEST_HARD_REG_BIT (hard_regs_live, regno) - || TEST_HARD_REG_BIT (eliminable_regset, regno)) + || (!fixed_regs[regno] + && TEST_HARD_REG_BIT (eliminable_regset, regno))) return; SET_HARD_REG_BIT (hard_regs_live, regno); sparseset_set_bit (start_living, regno); @@ -296,7 +297,7 @@ make_hard_regno_live (int regno) static void make_hard_regno_dead (int regno) { - if (TEST_HARD_REG_BIT (eliminable_regset, regno)) + if (!fixed_regs[regno] && TEST_HARD_REG_BIT (eliminable_regset, regno)) return; lra_assert (HARD_REGISTER_NUM_P (regno)); diff --git a/gcc/testsuite/g++.target/i386/pr97054.C b/gcc/testsuite/g++.target/i386/pr97054.C new file mode 100644 index 00000000000..d0693af2a42 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr97054.C @@ -0,0 +1,96 @@ +// { dg-do run { target { ! ia32 } } } +// { dg-require-effective-target fstack_protector } +// { dg-options "-O2 -fno-strict-aliasing -msse4.2 -mfpmath=sse -fPIC -fstack-protector-strong -O2" } + +struct p2_icode *ipc; +register int pars asm("r13"); +register struct processor *cur_pro asm("rbp"); +register int a asm("rbx"); +register int c asm("r14"); +typedef long lina_t; +typedef long la_t; +typedef processor processor_t; +typedef p2_icode p2_icode_t; +typedef enum { + P2_Return_Action_Next, +} p2_return_action_t; +typedef struct p2_icode { + int ic_Parameters; +} icode_t; +extern "C" icode_t *x86_log_to_icode_exec(processor_t *, la_t); +typedef struct { + icode_t *ipc; +} b; +typedef struct { + char ma_thread_signal; + int event_counter; + b instrumentation; +} d; + +extern "C" lina_t int2linaddr(processor_t *cpu, const p2_icode_t *ic) +{ + return 0; +} + +typedef struct e { + long i64; + char LMA; +} f; + +struct processor { + d common; + e pc_RIP; + f pc_EFER; + p2_icode_t *saved_ipc; +}; +inline la_t code_lin_to_log(processor_t *, long) { return 0; } +void turbo_clear(processor_t *) {} + +p2_return_action_t p2_ep_REBIND_IPC(void) +{ + processor_t *cpu = cur_pro; + la_t vaddr = cpu->pc_RIP.i64; + cur_pro->saved_ipc = (p2_icode_t *) ipc; + cur_pro->common.instrumentation.ipc = ipc; + cur_pro->pc_RIP.i64 = code_lin_to_log(cur_pro, int2linaddr(cur_pro, ipc)); + turbo_clear(cur_pro); + + cpu->saved_ipc = x86_log_to_icode_exec(cur_pro, vaddr); + ipc++; + (cur_pro->common.event_counter -= (1)); + if (__builtin_expect((!((cur_pro->common.event_counter <= 0) + | cur_pro->common.ma_thread_signal)), 1)) + { + ((pars = ((ipc)->ic_Parameters))); + return P2_Return_Action_Next; + } else { + return (p2_return_action_t) 0; + } + return P2_Return_Action_Next; +} + +struct p2_icode fake_ipc = { 0 }; +struct processor fake_proc ={{ 0 } }; + +extern "C" icode_t * +x86_log_to_icode_exec(processor_t *cpu, la_t la) +{ + return 0; +} + +extern "C" void +turbo_threshold_reached(processor_t *c, p2_icode_t *i, int s) +{ +} + +int main() +{ + if (!__builtin_cpu_supports ("sse4.2")) + return 0; + fake_proc.pc_RIP.i64 = 0xbaadc0de; + fake_proc.pc_EFER.LMA = 0xf; + ipc = &fake_ipc; + cur_pro = &fake_proc; + p2_ep_REBIND_IPC(); + return 0; +} -- 2.26.2