From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by sourceware.org (Postfix) with ESMTPS id 0CD173858439 for ; Thu, 13 Jul 2023 10:30:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0CD173858439 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-9923833737eso76798466b.3 for ; Thu, 13 Jul 2023 03:30:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689244226; x=1691836226; h=content-transfer-encoding:to:subject:from:content-language:cc :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=LCrZJZw/PHO4/175i+K0M3S/a2jJfT8GV8bCWlM0KUA=; b=Bti52bPcDicw6fH29XwhfAVU2LjzA8R/4fhOmU7uN9zvbh9jOt+RAm+FWK9I0e5BeE /CS0HLXLUy9k1SKg2kcDwJn90dAPPgP1mmL8iWWp7Kbsi6uPPgN85grNalmcCkS/flCD Q8Ln2RmjFWLb4nip6HOkYJ1yP1NnWXQSWb/SFTmZfmGMIM/paz+TCwF8uSHiNofOe3w+ mapnGlPT7vEGdxUdEh6i0h0TfGleTYbMOHRgvlVrI0hQMBBByold8TpgooSwjWUrTY2k YjSajJ92jGVsLhEAdiak6Ol8O1HXl02ONRT9yKC7msDDpXD9zshHBM7pL17WIiPItGzi 6U+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689244226; x=1691836226; h=content-transfer-encoding:to:subject:from:content-language:cc :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LCrZJZw/PHO4/175i+K0M3S/a2jJfT8GV8bCWlM0KUA=; b=KJFW6Kr45zYVQKy6QD1ZBmGVzCOy5Fj52PAQd+EXpmSUBjl6i/auu0jkvSNQFideR3 1T0Jf2k2pJr9IC+P4K9hT8USmZXBneBq/OtnKq5GZ/59tBtVNh0kLpTeQMBIpDcrXuFt spKzJEmdeqREZYluYRaL1NtA7CClCcFrU9gcXjz8GP9WVnsxvXSj1ueCYXzeaL1x3wCP o25HEtE91Cr91MNfAGb7NqHrT3QunXAE2TBRQBTr06zgqIUv26VZtT+1BoaRCgBVxy7G B/Hg4qjir0c3vnnqNbaYPpEzsDL+0ZyLlikT3RLFQOHnWqtzvJ2lhaldb/yZ0gdalaOl hm+Q== X-Gm-Message-State: ABy/qLacP/mBvg3qO6DJi88dVmRSJevGcAmZ13bfIN2NqqR1f+/CK/Fc ZDYILR+H6YzR96IZNnEru74DxATS0lC+xA== X-Google-Smtp-Source: APBJJlEZ8+fkHoF6Do5d4sLAr0GKr1kn1eBVa2lD2QrVNG201DhKJyOxEfyJ9Hc9OVl73OSXbYAJCA== X-Received: by 2002:a17:906:5c:b0:989:34a0:45b0 with SMTP id 28-20020a170906005c00b0098934a045b0mr1386416ejg.49.1689244226427; Thu, 13 Jul 2023 03:30:26 -0700 (PDT) Received: from [192.168.1.23] (ip-046-005-130-086.um12.pools.vodafone-ip.de. [46.5.130.86]) by smtp.gmail.com with ESMTPSA id mj7-20020a170906af8700b0098963eb0c3dsm3822989ejb.26.2023.07.13.03.30.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 13 Jul 2023 03:30:26 -0700 (PDT) Message-ID: Date: Thu, 13 Jul 2023 12:30:25 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Cc: rdapp.gcc@gmail.com Content-Language: en-US From: Robin Dapp Subject: [PATCH] vect: Handle demoting FLOAT and promoting FIX_TRUNC. To: gcc-patches Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-9.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,T_SCC_BODY_TEXT_LINE 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: Hi, the recent changes that allowed multi-step conversions for "non-packing/unpacking", i.e. modifier == NONE targets included promoting to-float and demoting to-int variants. This patch adds demoting to-float and promoting to-int handling. Bootstrapped and regtested on x86 and aarch64. A question that seems related: Why do we require !flag_trapping_math for the "NONE" multistep conversion but not for the "NARROW_DST" case when both seem to handle float -> int and there are float values that do not have an int representation? If a backend can guarantee that the conversion traps, should it just implement a multistep conversion in a matching expander? Regards Robin gcc/ChangeLog: * tree-vect-stmts.cc (vectorizable_conversion): Handle more demotion/promotion for modifier == NONE. --- gcc/tree-vect-stmts.cc | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 10e71178ce7..78e0510be7e 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -5324,28 +5324,46 @@ vectorizable_conversion (vec_info *vinfo, break; } - /* For conversions between float and smaller integer types try whether we - can use intermediate signed integer types to support the + /* For conversions between float and larger integer types try whether + we can use intermediate signed integer types to support the conversion. */ if ((code == FLOAT_EXPR - && GET_MODE_SIZE (lhs_mode) > GET_MODE_SIZE (rhs_mode)) + && GET_MODE_SIZE (lhs_mode) != GET_MODE_SIZE (rhs_mode)) || (code == FIX_TRUNC_EXPR - && GET_MODE_SIZE (rhs_mode) > GET_MODE_SIZE (lhs_mode) - && !flag_trapping_math)) + && ((GET_MODE_SIZE (rhs_mode) > GET_MODE_SIZE (lhs_mode) + && !flag_trapping_math) + || GET_MODE_SIZE (rhs_mode) < GET_MODE_SIZE (lhs_mode)))) { + bool demotion = GET_MODE_SIZE (rhs_mode) > GET_MODE_SIZE (lhs_mode); bool float_expr_p = code == FLOAT_EXPR; - scalar_mode imode = float_expr_p ? rhs_mode : lhs_mode; - fltsz = GET_MODE_SIZE (float_expr_p ? lhs_mode : rhs_mode); + unsigned short target_size; + scalar_mode intermediate_mode; + if (demotion) + { + intermediate_mode = lhs_mode; + target_size = GET_MODE_SIZE (rhs_mode); + } + else + { + target_size = GET_MODE_SIZE (lhs_mode); + tree itype + = build_nonstandard_integer_type (GET_MODE_BITSIZE + (rhs_mode), 0); + intermediate_mode = SCALAR_TYPE_MODE (itype); + } code1 = float_expr_p ? code : NOP_EXPR; codecvt1 = float_expr_p ? NOP_EXPR : code; - FOR_EACH_2XWIDER_MODE (rhs_mode_iter, imode) + opt_scalar_mode mode_iter; + FOR_EACH_2XWIDER_MODE (mode_iter, intermediate_mode) { - imode = rhs_mode_iter.require (); - if (GET_MODE_SIZE (imode) > fltsz) + intermediate_mode = mode_iter.require (); + + if (GET_MODE_SIZE (intermediate_mode) > target_size) break; cvt_type - = build_nonstandard_integer_type (GET_MODE_BITSIZE (imode), + = build_nonstandard_integer_type (GET_MODE_BITSIZE + (intermediate_mode), 0); cvt_type = get_vectype_for_scalar_type (vinfo, cvt_type, slp_node); -- 2.41.0