From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 2B9573872209 for ; Tue, 13 Dec 2022 09:27:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2B9573872209 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670923649; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=B+Rd9wLSTV4w7vNDgXEULUWsg/58GYX60M5b/++aKNw=; b=JAyQmvClkv2OZxBQqg/Y/fjCp9NtCp5I2tIxjDlqVegn6N2fSnZ4u55NYgY9kP8hdkCqPB XGF2XT0ybw4m+IueR6ZpGgzXUCUNdTsdbN9gWIfbxiiOpGWRLbeuK444lZKi70mgThqJ3S 0fVFC/49rKUL6tQqDQlik/oWQYmO9ps= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-135-rYna62gGPPaVPg8vABFZCg-1; Tue, 13 Dec 2022 04:27:26 -0500 X-MC-Unique: rYna62gGPPaVPg8vABFZCg-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E2B4A1C07565; Tue, 13 Dec 2022 09:27:25 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.195.114]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9E3E4112131B; Tue, 13 Dec 2022 09:27:25 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 2BD9RKGQ1938996 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 13 Dec 2022 10:27:21 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 2BD9RKPk1938995; Tue, 13 Dec 2022 10:27:20 +0100 Date: Tue, 13 Dec 2022 10:27:19 +0100 From: Jakub Jelinek To: Richard Biener Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] vect-patterns: Fix up vect_recog_rotate_pattern [PR108064] Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: Hi! Since vect_recog_rotate_pattern has been extended to work also on signed types in r13-1100 we miscompile the testcase below. vect_recog_rotate_pattern actually emits correct scalar code into the pattern def sequence (in particular cast to utype, doing the 2 shifts in utype so that the right shift is logical and not arithmetic, or and then cast back to the signed type), but it didn't supply vectype for most of those pattern statements, which means that the generic handling fills it up later with the vectype provided by vect_recog_rotate_pattern. The problem is that it is vectype of the result of the whole pattern, i.e. vector of signed values in this case, while the conversion to utype, 2 shifts and or (everything with utype lhs in scalar code) should have uvectype as STMT_VINFO_VECTYPE. Fixed with following patch, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2022-12-13 Jakub Jelinek PR tree-optimization/108064 * tree-vect-patterns.cc (vect_recog_rotate_pattern): Pass uvectype as 4th argument to append_pattern_def_seq for statements with lhs with utype type. * gcc.c-torture/execute/pr108064.c: New test. --- gcc/tree-vect-patterns.cc.jj 2022-12-05 11:10:37.000000000 +0100 +++ gcc/tree-vect-patterns.cc 2022-12-12 13:14:23.356628767 +0100 @@ -3113,7 +3113,7 @@ vect_recog_rotate_pattern (vec_info *vin { def = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd0); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); oprnd0 = def; } @@ -3137,7 +3137,7 @@ vect_recog_rotate_pattern (vec_info *vin { def = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd1); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); } stype = TREE_TYPE (def); @@ -3185,13 +3185,13 @@ vect_recog_rotate_pattern (vec_info *vin def_stmt = gimple_build_assign (var1, rhs_code == LROTATE_EXPR ? LSHIFT_EXPR : RSHIFT_EXPR, oprnd0, def); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); var2 = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (var2, rhs_code == LROTATE_EXPR ? RSHIFT_EXPR : LSHIFT_EXPR, oprnd0, def2); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); /* Pattern detected. */ vect_pattern_detected ("vect_recog_rotate_pattern", last_stmt); @@ -3202,7 +3202,7 @@ vect_recog_rotate_pattern (vec_info *vin if (!useless_type_conversion_p (type, utype)) { - append_pattern_def_seq (vinfo, stmt_vinfo, pattern_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, pattern_stmt, uvectype); tree result = vect_recog_temp_ssa_var (type, NULL); pattern_stmt = gimple_build_assign (result, NOP_EXPR, var); } --- gcc/testsuite/gcc.c-torture/execute/pr108064.c.jj 2022-12-12 13:22:29.875542508 +0100 +++ gcc/testsuite/gcc.c-torture/execute/pr108064.c 2022-12-12 13:21:32.516377957 +0100 @@ -0,0 +1,28 @@ +/* PR tree-optimization/108064 */ + +static inline short +foo (short value) +{ + return ((value >> 8) & 0xff) | ((value & 0xff) << 8); +} + +__attribute__((noipa)) +void +bar (short *d, const short *s) +{ + for (unsigned long i = 0; i < 4; i++) + d[i] = foo (s[i]); +} + +int +main () +{ + short a[4] __attribute__((aligned (16))) = { 0xff, 0, 0, 0 }; + short b[4] __attribute__((aligned (16))); + short c[4] __attribute__((aligned (16))); + + bar (b, a); + bar (c, b); + if (a[0] != c[0]) + __builtin_abort (); +} Jakub