From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 61678 invoked by alias); 24 Oct 2018 10:38:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 61305 invoked by uid 89); 24 Oct 2018 10:38:26 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.9 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy=UD:ii X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 24 Oct 2018 10:38:24 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 568EBAEA5; Wed, 24 Oct 2018 10:38:22 +0000 (UTC) From: Andreas Schwab To: Segher Boessenkool Cc: gcc-patches@gcc.gnu.org, bergner@linux.ibm.com Subject: Re: [PATCH] combine: Do not combine moves from hard registers References: <68abf72a5400b96b9a100966331d3ad2056648e7.1540237620.git.segher@kernel.crashing.org> <20181023152815.GL5205@gate.crashing.org> X-Yow: Why are these athletic shoe salesmen following me?? Date: Wed, 24 Oct 2018 12:24:00 -0000 In-Reply-To: <20181023152815.GL5205@gate.crashing.org> (Segher Boessenkool's message of "Tue, 23 Oct 2018 10:28:16 -0500") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2018-10/txt/msg01497.txt.bz2 It's the test case that is miscompiled. $ cat nested_struct.c #include typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; void cls_struct_combined_fn(struct cls_struct_16byte1 b0, struct cls_struct_16byte2 b1, struct cls_struct_combined b2) { struct cls_struct_combined result; printf("%g %g %d %d %g %g %g %g %d %d %g %g\n", b0.a, b0.b, b0.c, b1.ii, b1.dd, b1.ff, b2.d.a, b2.d.b, b2.d.c, b2.e.ii, b2.e.dd, b2.e.ff); } $ cat main.c typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; void cls_struct_combined_fn (struct cls_struct_16byte1, struct cls_struct_16byte2, struct cls_struct_combined); int main (void) { struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, {3, 1.0, 8.0}}; cls_struct_combined_fn (e_dbl, f_dbl, g_dbl); } $ bad/gcc/xgcc -Bbad/gcc/ -O2 -c nested_struct.c $ good/gcc/xgcc -Bgood/gcc/ -O2 main.c nested_struct.o $ ./a.out 9 2 6 1 2 3 1.32677e-313 5 6 3 1 8 --- good/nested_struct.s +++ bad/nested_struct.s @@ -25,78 +25,69 @@ cls_struct_combined_fn: movl r43 = @gprel(.LC0) ;; .mmi - adds r16 = 120, r12 - adds r17 = 72, r12 - adds r18 = 96, r12 + adds r14 = 120, r12 + adds r16 = 72, r12 + adds r15 = 96, r12 .mmi - adds r19 = 152, r12 - adds r15 = 88, r12 adds r21 = 48, r12 - ;; - .mmi - mov r14 = r16 - ldfs f9 = [r19] - adds r19 = 144, r12 - .mmi - st8 [r17] = r33 - st8 [r18] = r36 adds r20 = 40, r12 + adds r18 = 32, r12 ;; - .mmb + .mmi st8 [r14] = r37, 8 - ldfs f8 = [r18] - nop 0 - .mii - adds r18 = 24, r12 + st8 [r16] = r33 .save rp, r40 mov r40 = b0 .body + .mmi + adds r17 = 24, r12 + adds r22 = 136, r12 add r43 = r1, r43 ;; + .mmb + ldfs f8 = [r16] + adds r16 = 152, r12 + nop 0 .mmi - ldfs f7 = [r17] st8 [r14] = r38 + st8 [r15] = r36 extr.u r38 = r38, 32, 32 - .mmi - st8 [r15] = r35 - ldfd f10 = [r19] - adds r17 = 64, r12 ;; .mmi ldfs f6 = [r14] - st8 [r17] = r32 - adds r14 = 136, r12 + st8 [r22] = r39 + nop 0 .mmi - adds r19 = 32, r12 - ld8 r50 = [r16] - adds r17 = 16, r12 + ldfs f9 = [r15] + ldfs f7 = [r16] + adds r16 = 144, r12 ;; .mmi - st8 [r14] = r39 - nop 0 - adds r14 = 76, r12 + ldfd f10 = [r16] + adds r16 = 64, r12 + adds r15 = 88, r12 .mmi - ld8 r48 = [r15] - st4 [r19] = r39 - nop 0 + ld8 r50 = [r14] + st4 [r18] = r39 + adds r14 = 76, r12 ;; .mmi - nop 0 + st8 [r16] = r32 ld4 r46 = [r14] - adds r14 = 64, r12 + adds r16 = 16, r12 .mmi - nop 0 - st4 [r18] = r38 + adds r14 = 64, r12 + st8 [r15] = r35 nop 0 ;; - .mfi + .mmi nop 0 - fnorm.d f9 = f9 + ld8 r48 = [r15] nop 0 .mmi + st4 [r17] = r38 ld8 r44 = [r14] nop 0 - nop 0 ;; .mmf nop 0 @@ -105,31 +96,30 @@ cls_struct_combined_fn: ;; .mfi nop 0 - fnorm.d f7 = f7 + fnorm.d f9 = f9 nop 0 - .mmi - stfd [r20] = f10 + .mfi nop 0 + fnorm.d f7 = f7 nop 0 ;; - .mmf - nop 0 + .mfi nop 0 fnorm.d f6 = f6 - ;; + nop 0 .mmi - stfd [r21] = f9 + stfd [r20] = f10 ;; - getf.d r49 = f8 + getf.d r45 = f8 nop 0 ;; .mmi - nop 0 - getf.d r45 = f7 + getf.d r49 = f9 + stfd [r21] = f7 nop 0 ;; .mib - stfd [r17] = f6 + stfd [r16] = f6 nop 0 br.call.sptk.many b0 = printf# ;; Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."