From patchwork Thu Nov 3 13:23:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 59832 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D7DC8385841A for ; Thu, 3 Nov 2022 13:23:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D7DC8385841A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1667481825; bh=+rG7VJFtjUxWzBo6np+1HT4bdFrp3wCOFbSzYtURDEs=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=wJ6Yl4clTHpJbFmI/FXSayto519kV7MRnuUUp3bNlrHsZZt0fombyMAv5vekOgM2H EZlqWRupLDd/57QeZsWuI70P87PJiWVXd/bf7Knqb6oG+UODRWE0kok62dqxkXn2OU n5NXcIkxGKBCmN8KKaopN3yx7lmgFUUFvdFLszSw= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-yw1-x1132.google.com (mail-yw1-x1132.google.com [IPv6:2607:f8b0:4864:20::1132]) by sourceware.org (Postfix) with ESMTPS id DE8403858D28 for ; Thu, 3 Nov 2022 13:23:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DE8403858D28 Received: by mail-yw1-x1132.google.com with SMTP id 00721157ae682-3701a0681daso14931937b3.4 for ; Thu, 03 Nov 2022 06:23:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=+rG7VJFtjUxWzBo6np+1HT4bdFrp3wCOFbSzYtURDEs=; b=Ght0cXlWlOxPcLovVvOBomoxFuCRuufJgnfetz2O/HVGyECo/iv9zVDaHQ2f6Lfr9J y6NilUN178bNN7ZrHOlreDpZDHE3kjWwXuAS8A0PCK9fVFMJCEXE63/4kDG700SR+UGo 2HnXElEPrnz/Hu1bgxrPa8ZWA4fyk23xMs8Fvrv6TAKTThlyCNsFpo8cRLbaML2CWL9f 0v9yK9T9S6X0QCT3LLDp8QTRYM9UC0AIa46nIemZzvTLKuZs/oScSfKuLYhoqKm9tgif kxIoTK/MQ/SBdLdFuOkcQOoVuFnVr1KTi0NgQg8D9MLPtU+XM7DNUiSxjHwXnC2u5KxG 7r4A== X-Gm-Message-State: ACrzQf33kAVDfqSGI+92skDOCZ+JJIlc+KNkzfSaHD0VbrdTmE8LiPFs y74zcUK1r6OFimIVXVaS2ODw5iIa94bciARXQBIgdRrXp0WP5w== X-Google-Smtp-Source: AMsMyM7N34xzrinYsjKePYt7QwQxsIPPDVfeD0jnBSD/4xjplevL9WjYvIrhV+S8mUKwPb5l1ME5tkUyT38QZuNIZJo= X-Received: by 2002:a81:c204:0:b0:370:28bf:c630 with SMTP id z4-20020a81c204000000b0037028bfc630mr29106212ywc.429.1667481795024; Thu, 03 Nov 2022 06:23:15 -0700 (PDT) MIME-Version: 1.0 Date: Thu, 3 Nov 2022 14:23:03 +0100 Message-ID: Subject: [PATCH] i386: Fix uninitialized register after peephole2 conversion [PR107404] To: "gcc-patches@gcc.gnu.org" X-Spam-Status: No, score=-7.5 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.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Uros Bizjak via Gcc-patches From: Uros Bizjak Reply-To: Uros Bizjak Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The eliminate reg-reg move by inverting the condition of a cmove #2 peephole2 converts the following sequence: 473: bx:DI=[r14:DI*0x8+r12:DI] 960: r15:DI=r8:DI 485: {flags:CCC=cmp(r15:DI+bx:DI,bx:DI);r15:DI=r15:DI+bx:DI;} 737: r15:DI={(geu(flags:CCC,0))?r15:DI:bx:DI} to: 1110: {flags:CCC=cmp(r8:DI+bx:DI,bx:DI);r8:DI=r8:DI+bx:DI;} 1111: r15:DI=[r14:DI*0x8+r12:DI] 1112: r15:DI={(geu(flags:CCC,0))?r8:DI:r15:DI} Please note that(insn 1110) uses register BX, but its initialization was eliminated. Avoid conversion if eliminated move intialized a register, used in the moved instruction. 2022-11-03 Uroš Bizjak gcc/ChangeLog: PR target/107404 * config/i386/i386.md (eliminate reg-reg move by inverting the condition of a cmove #2 peephole2): Check if eliminated move initialized a register, used in the moved instruction. gcc/testsuite/ChangeLog: PR target/107404 * g++.target/i386/pr107404.C: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Pushed to master. Uros. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 85567980aa3..436eabb691a 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -21800,7 +21800,8 @@ (define_peephole2 && REGNO (operands[2]) != REGNO (operands[1]) && peep2_reg_dead_p (2, operands[1]) && peep2_reg_dead_p (4, operands[2]) - && !reg_overlap_mentioned_p (operands[0], operands[3])" + && !reg_overlap_mentioned_p (operands[0], operands[3]) + && !reg_mentioned_p (operands[2], operands[6])" [(parallel [(set (match_dup 7) (match_dup 8)) (set (match_dup 1) (match_dup 9))]) (set (match_dup 0) (match_dup 3)) diff --git a/gcc/testsuite/g++.target/i386/pr107404.C b/gcc/testsuite/g++.target/i386/pr107404.C new file mode 100644 index 00000000000..e47d0fd779d --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr107404.C @@ -0,0 +1,53 @@ +// PR target/107404 +// { dg-do run } +// { dg-options "-O3" } + +unsigned long long a; +void b(unsigned long long *f, int p2) { *f ^= p2; } +long c; +char e, i; +short g, m; +long long ab[1][25][21][22]; +unsigned long long aa[1][21][22]; +unsigned long long ae[1][25][21][21]; +long long ac[129360]; +char ad[25][1][21]; +char ah[1][25][1][21]; +short af[100]; +long max(long f, unsigned long p2) { return f < p2 ? p2 : f; } +const int &max2(const int &f, const int &p2) { return f < p2 ? p2 : f; } +void foo(unsigned f, unsigned p2, char l, char p4, long long n[][25][21][22], + unsigned long long p6[][21][22], unsigned long long u[][25][21][21]) { + long an; + for (int j = 0; j < 4; j = p2) + for (short k = 0; k < 7; k += 2) + for (short o = 0; o < (short)p2 + 21742; o = l) { + for (signed char p = 2; p < 9; p += p4) + if (p6[j][o][p]) + for (long q(3); 4 ? n[0][k][o][0] : 0; + q += p6[0][o][0] ? p6[j][0][p] : 0) + ac[j + q] = 5066799590; + for (long r(p4 - 16); r < 21; r += 4) { + ad[k][o][r] = max(u[j][k][o][r], f + u[j][k][o][r]); + long d = u[j][k][o][r]; + an = d < p2 ? p2 : d; + e = ah[j][k][o][r] = an; + af[o * r] = i; + } + for (short s(c); s < (short)p2; s = 2) + for (short am(m); am; am = max2(3, p2)) + for (long y = 0; y; y = 3) + for (short t(0); t < max2(g, 0);) + ; + } +} +int main() { + foo(7, 1558227751, 104, 16, ab, aa, ae); + for (unsigned long v = 0; v < 5; ++v) + for (unsigned long w = 0; w < 1; ++w) + for (unsigned long x = 0; x < 21; ++x) + b(&a, ad[v][w][x]); + + if (a) + __builtin_abort(); +}