From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x133.google.com (mail-lf1-x133.google.com [IPv6:2a00:1450:4864:20::133]) by sourceware.org (Postfix) with ESMTPS id 3F89D3858402 for ; Tue, 23 Apr 2024 10:47:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3F89D3858402 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3F89D3858402 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::133 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713869272; cv=none; b=dSTs2Ee1CMCu1u9LdRBGlP80SMT+/+lJRkYfO0kIWKdj826zBik46+OoWR0Cyc85/xD7yT/EmUHwDHtVbuL7RmCCfTlHI0XfHbt7pX1Ea4gIn37GtNcKpc5MSuvHHvaLagNyHfiAy0SbW8dLJCNF2Qzi3rU7z7e3qcvlosmJ0gI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713869272; c=relaxed/simple; bh=jp/Bp0MT/ucGStoBGJAcGz4W6TXqAnmbmxUBnioiPAU=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=uVoyE5yfXLMVmJZ/us36qx/wmZn9kztX1fSTag8dA0adHyWMBPilxFPb608xXW3g7kmWCDlLYsB/Fqd1vMp558LM62nY2lLl5fIK4VRLwlXUsCyDalxUud6rIgRH+KDvBUtY/nuQuuq+FEeFoeGTqdlQThOvUeUehSpfkYub2co= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x133.google.com with SMTP id 2adb3069b0e04-51b09c3a111so3444633e87.1 for ; Tue, 23 Apr 2024 03:47:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; t=1713869267; x=1714474067; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zCoLFbpQdOONqkjO6uTBKEfMHt8adg88e3f0zO68mNs=; b=aKguOOEr/EBzj2FMTZGOyDExYr0GP9kAqK2+uOd08CVQYBCn5MIRjeW8BmFDYxtFR9 V+focdg+73Hq+aOvYf3tM5D6jlRF1pFeNTogcL7M0XuejZdSCFwu8jIkzUlo6OZfWZAe E/76uRgbJWb/X7di9+BOugKOepSMZjrfljMkU8j+o3dQ4/wRnKiN3oBdnYu4ekcZE1Ck qDd1b7eFp8bsVo9YjwE/zeLc0GddZIL/q0QAlFEWcGGdtep/OtOm296G76QeD4D0ca0H e+gZrjctUoxGC4VI0ogH9k1y02/zJS6XYznZmOO9GijBZb4yeli6oChe9FaO9xdcF0Eh CgBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713869267; x=1714474067; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zCoLFbpQdOONqkjO6uTBKEfMHt8adg88e3f0zO68mNs=; b=igh/RDLhJnhx52ozb/UTAY3RqaWltRiP1uMyrOaqsiPuDMw2I88QjSm31202UklJHk dYEkOmarEQmsf3dG8W+GWDORArhSTYLeWZfrSVDGusBdCaZntDqCOQMADVO8rOYUviSI i69zzmsWTLrZLHZackNZPrzKsz2YU4vhkYouoKskYxSMmJJTX1Ac3shju9UVhDd0cL0W UlYhJpeF+RED1OWTD6o+H+ps5INdt4P/e84VaYph5PXG5C2A6wxnZvz14mJ/8TmEmtuS 68OFhC/7x1E+FarnD8IrNwWIBM0p2sfYqIHNXBrTzobhN7yaMtEy4HfYocasQAJUH7vd 9/rw== X-Gm-Message-State: AOJu0YyKN5NVLHn054MfrpsZvNaB6E+plsaQZMCrhfbyIh0poMMWg/i9 wPqFsviSBz8tQUlzWQU36lNh/r+7SKcDDYWgO4/b5Zvfe2bcb+Va3V2U+/d5psmQe0mapALX58e 5dmg= X-Google-Smtp-Source: AGHT+IGdcYaDqN+v8RiCbia1MECAng0pg2EEB2XBXNj79uGh9lgxQTBO7SM0625Pwv2TqF7CuV/mbQ== X-Received: by 2002:a19:7516:0:b0:51a:c21b:73fb with SMTP id y22-20020a197516000000b0051ac21b73fbmr7167487lfe.44.1713869267342; Tue, 23 Apr 2024 03:47:47 -0700 (PDT) Received: from helsinki-03.engr ([2a01:4f9:6b:2a47::2]) by smtp.gmail.com with ESMTPSA id cf14-20020a056512280e00b00515cb94af43sm1995785lfb.16.2024.04.23.03.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Apr 2024 03:47:46 -0700 (PDT) From: Manolis Tsamis To: gcc-patches@gcc.gnu.org Cc: Robin Dapp , Jiangning Liu , Philipp Tomsich , Richard Sandiford , Jakub Jelinek , Manolis Tsamis Subject: [PATCH v4 2/3] [RFC] ifcvt: Allow more operations in multiple set if conversion Date: Tue, 23 Apr 2024 12:47:39 +0200 Message-Id: <20240423104740.4027243-3-manolis.tsamis@vrull.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240423104740.4027243-1-manolis.tsamis@vrull.eu> References: <20240423104740.4027243-1-manolis.tsamis@vrull.eu> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Currently the operations allowed for if conversion of a basic block with multiple sets are few, namely REG, SUBREG and CONST_INT (as controlled by bb_ok_for_noce_convert_multiple_sets). This commit allows more operations (arithmetic, compare, etc) to participate in if conversion. The target's profitability hook and ifcvt's costing is expected to reject sequences that are unprofitable. This is especially useful for targets which provide a rich selection of conditional instructions (like aarch64 which has cinc, csneg, csinv, ccmp, ...) which are currently not used in basic blocks with more than a single set. gcc/ChangeLog: * ifcvt.cc (try_emit_cmove_seq): Modify comments. (noce_convert_multiple_sets_1): Modify comments. (bb_ok_for_noce_convert_multiple_sets): Allow more operations. gcc/testsuite/ChangeLog: * gcc.target/aarch64/ifcvt_multiple_sets_arithm.c: New test. Signed-off-by: Manolis Tsamis --- Changes in v4: - Remove unnecessary hardcoded list of allowed ops in bb_ok_for_noce_convert_multiple_sets. - Set need_cmov based on BB live_out instead of REG_DEAD notes. - Fix preexisting issues and improve the code that sets read_comparison. gcc/ifcvt.cc | 34 +++----- .../aarch64/ifcvt_multiple_sets_arithm.c | 79 +++++++++++++++++++ 2 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_arithm.c diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc index 763a25f816e..dc00042be81 100644 --- a/gcc/ifcvt.cc +++ b/gcc/ifcvt.cc @@ -3432,13 +3432,13 @@ try_emit_cmove_seq (struct noce_if_info *if_info, rtx temp, /* We have something like: if (x > y) - { i = a; j = b; k = c; } + { i = EXPR_A; j = EXPR_B; k = EXPR_C; } Make it: - tmp_i = (x > y) ? a : i; - tmp_j = (x > y) ? b : j; - tmp_k = (x > y) ? c : k; + tmp_i = (x > y) ? EXPR_A : i; + tmp_j = (x > y) ? EXPR_B : j; + tmp_k = (x > y) ? EXPR_C : k; i = tmp_i; j = tmp_j; k = tmp_k; @@ -3839,11 +3839,10 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info, -/* Return true iff basic block TEST_BB is comprised of only - (SET (REG) (REG)) insns suitable for conversion to a series - of conditional moves. Also check that we have more than one set - (other routines can handle a single set better than we would), and - fewer than PARAM_MAX_RTL_IF_CONVERSION_INSNS sets. While going +/* Return true iff basic block TEST_BB is suitable for conversion to a + series of conditional moves. Also check that we have more than one + set (other routines can handle a single set better than we would), + and fewer than PARAM_MAX_RTL_IF_CONVERSION_INSNS sets. While going through the insns store the sum of their potential costs in COST. */ static bool @@ -3869,20 +3868,13 @@ bb_ok_for_noce_convert_multiple_sets (basic_block test_bb, unsigned *cost) rtx dest = SET_DEST (set); rtx src = SET_SRC (set); - /* We can possibly relax this, but for now only handle REG to REG - (including subreg) moves. This avoids any issues that might come - from introducing loads/stores that might violate data-race-freedom - guarantees. */ - if (!REG_P (dest)) - return false; - - if (!((REG_P (src) || CONSTANT_P (src)) - || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src)) - && subreg_lowpart_p (src)))) + /* Do not handle anything involving memory loads/stores since it might + violate data-race-freedom guarantees. */ + if (!REG_P (dest) || contains_mem_rtx_p (src)) return false; - /* Destination must be appropriate for a conditional write. */ - if (!noce_operand_ok (dest)) + /* Destination and source must be appropriate. */ + if (!noce_operand_ok (dest) || !noce_operand_ok (src)) return false; /* We must be able to conditionally move in this mode. */ diff --git a/gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_arithm.c b/gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_arithm.c new file mode 100644 index 00000000000..d977f4d62ec --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_arithm.c @@ -0,0 +1,79 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-rtl-ce1" } */ + +void sink2(int, int); +void sink3(int, int, int); + +void cond1(int cond, int x, int y) +{ + if (cond) + { + x = x << 4; + y = 1; + } + + sink2(x, y); +} + +void cond2(int cond, int x, int y) +{ + if (cond) + { + x++; + y++; + } + + sink2(x, y); +} + +void cond3(int cond, int x1, int x2, int x3) +{ + if (cond) + { + x1++; + x2++; + x3++; + } + + sink3(x1, x2, x3); +} + +void cond4(int cond, int x, int y) +{ + if (cond) + { + x += 2; + y += 3; + } + + sink2(x, y); +} + +void cond5(int cond, int x, int y, int r1, int r2) +{ + if (cond) + { + x = r1 + 2; + y = r2 - 34; + } + + sink2(x, y); +} + +void cond6(int cond, int x, int y) +{ + if (cond) + { + x = -x; + y = ~y; + } + + sink2(x, y); +} + +/* { dg-final { scan-assembler-times "cinc\t" 5 } } */ +/* { dg-final { scan-assembler-times "csneg\t" 1 } } */ +/* { dg-final { scan-assembler-times "csinv\t" 1 } } */ +/* { dg-final { scan-assembler "csel\t" } } */ + +/* { dg-final { scan-rtl-dump-times "if-conversion succeeded through noce_convert_multiple_sets" 6 "ce1" } } */ \ No newline at end of file -- 2.34.1