From patchwork Wed Apr 8 21:36:12 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Heiko_Ei=C3=9Ffeldt?= X-Patchwork-Id: 132826 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 197A54BA2E10 for ; Wed, 8 Apr 2026 21:31:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 197A54BA2E10 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=hexco.de header.i=heiko.eissfeldt@hexco.de header.a=rsa-sha256 header.s=s1-ionos header.b=08w8UeJY X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.75]) by sourceware.org (Postfix) with ESMTPS id 221204BA2E0D for ; Wed, 8 Apr 2026 21:31:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 221204BA2E0D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=hexco.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hexco.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 221204BA2E0D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=217.72.192.75 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775683870; cv=none; b=KgLefe6xzQyN2WqvhcFIP1uJV4NrOaWyGXEnD5t0jxJH+Gp2jm1GKWBYPR5IPDdFWR+drGHkyiUKzD1k+U0rl54RJcncaUkmUuuLas27XGmzEmKoMIrrcghj/4K+ekfhSabPDfchC4BIHy0WnB/AVM3duKTKKa6eyXQmAxQiK7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775683870; c=relaxed/simple; bh=tCEtCEoiYbsBD2GfjK2zcXrtVwjDCeG3QyHfitBH/SI=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=jCDKWUbURyRD0L/Gcs8NexvV/7NkifMCxZDpIzSyE1e3ZfBj9pK9lRZp3MQ7B9qXR6dvY7arCLVyYbuz6+jc22QZfY9yIhTfvQPDWJcGnB74ptJhndQwW0ZbLhGW7ZRxL5SyAufWhca8QXVCRJIvuMkojVYQkkhmAUyF66UL+pw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 221204BA2E0D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hexco.de; s=s1-ionos; t=1775683867; x=1776288667; i=heiko.eissfeldt@hexco.de; bh=hlrx+3bVxLTKj3c/NysvVA+icHBoqNxAgGbgGzijopQ=; h=X-UI-Sender-Class:Message-ID:Date:MIME-Version:To:From:Subject: Content-Type:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=08w8UeJY/LfqtgS5Cj/2E0DqhtkMTMaDobVE66iME34gMrcBt3g6Zeqr32N3q8SY tUs60W8XTyM9ArL7COdhVAzvplFpJYLQ7sH8hlOpIhyzyvK5MuKSnCSQHLR/KNijl 7YgAM17FMBsjxX/4QNV4INkb6Mtg2lgTBXkz9Oumz4qLZLNcL1oNBCmP410Rl9v49 lq1F34p+XXE4nUXSSVhHHkvM4AQDb2eEbqefTVhJAo5EcB0GbdrJGC2alg8zJiMAe 13W0avDFIFqCagLAc9jwKZ+cycNdXWJ2zgPcR19X+/NiJW6ND/OM8Zg5gWeo2+l7q 0Wtw8pT8VW+UHX84Iw== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue107 [212.227.17.181]) with ESMTPSA (Nemesis) id 1N4h7p-1vR39g14el-013Ok9 for ; Wed, 08 Apr 2026 23:31:07 +0200 Message-ID: <2c4ed43b-9787-4c50-b0d9-ee213a3bb896@hexco.de> Date: Wed, 8 Apr 2026 23:36:12 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches@gcc.gnu.org From: =?utf-8?q?Heiko_Ei=C3=9Ffeldt?= Subject: [PATCH] - ICE verify_vssa exceeds stack space for big functions [PR124805] X-Provags-ID: V03:K1:Tx4Tp+f5nLAijsiqx0zPVuUa8m2P6zM3nsjXvQS/wX6eLhcHY2b /eHN8E03pZEcAPl6/PwDw873Pi+mb7MBW2Wcv6X+xgvygdhZaDDMd0UApJhWYYN9jbUdEIX UHpoS0qAuj63J4xcCTiKYsMI4SL7H3EyOU5C4OxMgRj/bR/fnq00EUYkq62UP+6/Ocgmcjh xdbo4OLuGQfhFBJtuGsnA== UI-OutboundReport: notjunk:1;M01:P0:n7in7c0bApA=;olisiY5VWvkqIGmul/FdIbH2qZ3 K6NBg9jDc2/6ycRJBIWRaWZ+H+XP2G0CW/hVOIRHhbJHFMLe8LC5EKJx/koztRvzHYsCBZait brCmunD7UwJ8gSbGYY7bIW3Qi+9T45hH71+xkcxJlrw7E7RhQP+3hs2Ey8JkrqkZENprKyubW VgZmJoeMKtNlHTCuRgfowphT/IkZxX+UCqiiHw0454JD0+qOtD09zoIB8RY8xgyiiTLSGQXyx HiVhbMYMbQzq57r15aogQ1sWdUvtPxDVQd7FHpij2nuBNkFDBWpbm80iArEoGCcCFsBpJLBlN p3wPYAC1Q458H9iS2vjWtM0liTX0koJEMNhI4Rjfz6NdN3FJgD7UDi/ijCXRuY29RVNHfuly+ QuMDD1GNOBaUp7Je3MK5Y/HYTfU/EwFjCxJBpBNfRPPvS89fVIswd2vkC2WS1dXjLBgFSDOMb TaGBTC4qsDdDXt1JsOdhMpyrOF/XJC53rAwKQ+n8/5pPiUjMND5NqtCrArS/hCosIMlE7Y/kf VuRcFWFzL40fCR/LkAOdyiyDmNspckRu57MzfQfBR9LaR27aFwJLlVeMZZNxsBcq4PomTwNWP srAQvbNHQurldF1GrDGK2Y3zP9tWCRXqDVLV2aC/xHIg0mxTiUeUNCBukbVP5eNlqorFzPQwO PJQZZDYTNpU/7qkRvPge9vusRPxl7CPFh16ynFAQ4Hjao+gkCnKZjFHkxRP7RleJSiIO7jsJJ rGtphuUAixG6iRH1KxzRZkXPOt7QHzgS6lyYBaBYvl0/WokEiFSAEROMk8fPOZTvHyyV5kba9 RsUfk+2AgckunHsr2UL1pwNnf2y91gHdygs6wISh8L+CUnvKhF4D021gcCuIqow2HqVASog0z WGRL0TAlWsUetaYXkE1h2HQ+GRRxgGjIoX08ycKExAy7XEc0ma8/q4LWGDzbbf/yMdv0cSeKE L1zMw3Pos31xkluYviUfrol5gqNuYr8OBBTO6NN1y6e+Y2/4fYt/EERFyj2wxyymVv0IhaY2r iVRQ+oNOBx19FI8GagA4Sr1lo6BsPod6mf5DQIjRaz1V/Rx86l1tzp3A659UM3ESW8MlI0Juf loG+HAiTcQnePQaLftL030dePSYqNwavYP/RAgY9QSzeZIVS6bMAK5AVV0wbDoQuHW8xZf9Cj pyb50Om3KV8dQvLZvCsImTsTcnYx+7SnYMEO56LY/X8vBEdQVjNweGsasrusT/xJ3Sc2C7L3j RA/P5wJ1JCXlIxi1loChiKScaqf0+Pd3la5Vta6ZxDy5fjNOXSPZgg0OgLd+R1K6O9GQ/cdmk qge5Un4jmIIcF1aoxzi31kayvZp5GfDfAgYnIp5LdUkXvCbdPfuJFKhRLp0goKbC7Wng3VzjZ A6pc7CPU5fhpGt/EB8ECSTTbaSMvP+PeGsfSZHPGibK7ZUGS6WpcQWU6Ry2+GZdhy3HR666QR hSHhR3YDDc1Ybwc2E1909elZXYEBsIbyhzyYrEtUmLgvesh6Y+D2KzWn9nMkhsh6q0TmgPoJZ wUHJ5dcQliGR+ZbpZlW1KGlIVSdxNLvBeT4y+oFz2Ai0bTtpuYKdUxY/oUnDwTyyjo1Oih7s/ VeUHRhu0otpgkzJVV7Oi4LBK0rAf4rPOCbQYy2cECoa2I4g9g4Ya3UpRE177tOFD2nd/cK7s9 Dvk0Q93TCxzNfoMeTVrjzcgfTUpEk5Cv0PKdvT2dnf9yBsFYlyoSXELM4NrK2fzqN1fSlVVS6 Hj7+7YCB16uEoNZkwon7nK1BQVbZmG9vqi3iljoPnu3xKmVj25pfdT/dyZuNOgS53fW3qOGoD Xgh+DA8bS4chzx3j6TUMDA1cPa4oNDvzkQaCrU1yLePf2e5NsFbCQOglGfN2Jxt6A5RphLHFP jTtUSXS4T6ynDq6xThFOlU5yIbtF1efBLyZmVc= X-Spam-Status: No, score=-8.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, 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 sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org The source from PR124561 led to an ICE with --enable-checking, caused by a stack overflow. The recursive verification code verify_vssa in tree-ssa.cc could not handle the extreme number of basic blocks within the typical limits of stack space. As for PR124561 the recursive code was transformed into an iterative version, which avoided the recursive calls. A worklist is used, which has as entries a pair of a basic_block and a tree (vdef). The logic of verification steps for each basic_block is unchanged, although the order of basic_blocks is changed. This fixes PR124805. Reg tested OK. 2026-04-07 Heiko Eißfeldt PR middle-end/124805 * tree-ssa.cc (verify_vssa): replace recursive calls with iteration for lower stack usage diff --git a/gcc/tree-ssa.cc b/gcc/tree-ssa.cc index 3c899eb5979..e110e4acf2b 100644 --- a/gcc/tree-ssa.cc +++ b/gcc/tree-ssa.cc @@ -636,96 +636,119 @@ release_defs_bitset (bitmap toremove) /* Verify virtual SSA form. */ bool -verify_vssa (basic_block bb, tree current_vdef, sbitmap visited) +verify_vssa (basic_block bb_start, tree current_vdef, sbitmap visited) { bool err = false; - if (!bitmap_set_bit (visited, bb->index)) - return false; + struct state_t { + basic_block bb; + tree vdef; + } state; + + auto_vec worklist; + state.bb = bb_start; + state.vdef = current_vdef; + worklist.safe_push (state); - /* Pick up the single virtual PHI def. */ - gphi *phi = NULL; - for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si); - gsi_next (&si)) + while (!worklist.is_empty ()) { - tree res = gimple_phi_result (si.phi ()); - if (virtual_operand_p (res)) + const auto &state = worklist.pop (); + const auto &bb = state.bb; + current_vdef = state.vdef; + + if (!bitmap_set_bit (visited, bb->index)) + continue; + + /* Pick up the single virtual PHI def. */ + gphi *phi = NULL; + for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si); + gsi_next (&si)) + { + tree res = gimple_phi_result (si.phi ()); + if (virtual_operand_p (res)) + { + if (phi) + { + error ("multiple virtual PHI nodes in BB %d", bb->index); + print_gimple_stmt (stderr, phi, 0); + print_gimple_stmt (stderr, si.phi (), 0); + err = true; + } + else + phi = si.phi (); + } + } + if (phi) { - if (phi) + current_vdef = gimple_phi_result (phi); + if (TREE_CODE (current_vdef) != SSA_NAME) { - error ("multiple virtual PHI nodes in BB %d", bb->index); + error ("virtual definition is not an SSA name"); print_gimple_stmt (stderr, phi, 0); - print_gimple_stmt (stderr, si.phi (), 0); err = true; } - else - phi = si.phi (); } - } - if (phi) - { - current_vdef = gimple_phi_result (phi); - if (TREE_CODE (current_vdef) != SSA_NAME) + + /* Verify stmts. */ + for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); + gsi_next (&gsi)) { - error ("virtual definition is not an SSA name"); - print_gimple_stmt (stderr, phi, 0); - err = true; + gimple *stmt = gsi_stmt (gsi); + tree vuse = gimple_vuse (stmt); + if (vuse) + { + if (vuse != current_vdef) + { + error ("stmt with wrong VUSE"); + print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); + fprintf (stderr, "expected "); + print_generic_expr (stderr, current_vdef); + fprintf (stderr, "\n"); + err = true; + } + tree vdef = gimple_vdef (stmt); + if (vdef) + { + current_vdef = vdef; + if (TREE_CODE (current_vdef) != SSA_NAME) + { + error ("virtual definition is not an SSA name"); + print_gimple_stmt (stderr, phi, 0); + err = true; + } + } + } } - } - /* Verify stmts. */ - for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); - gsi_next (&gsi)) - { - gimple *stmt = gsi_stmt (gsi); - tree vuse = gimple_vuse (stmt); - if (vuse) + /* Verify destination PHI uses and add successors to worklist. */ + edge_iterator ei; + edge e; + FOR_EACH_EDGE (e, ei, bb->succs) { - if (vuse != current_vdef) + gphi *phi = get_virtual_phi (e->dest); + if (phi + && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef) { - error ("stmt with wrong VUSE"); - print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); + error ("PHI node with wrong VUSE on edge from BB %d", + e->src->index); + print_gimple_stmt (stderr, phi, 0, TDF_VOPS); fprintf (stderr, "expected "); print_generic_expr (stderr, current_vdef); fprintf (stderr, "\n"); err = true; } - tree vdef = gimple_vdef (stmt); - if (vdef) + + /* Add successor BB along with current vdef to worklist. */ + if (!bitmap_bit_p (visited, e->dest->index)) { - current_vdef = vdef; - if (TREE_CODE (current_vdef) != SSA_NAME) - { - error ("virtual definition is not an SSA name"); - print_gimple_stmt (stderr, phi, 0); - err = true; - } - } - } - } + state_t new_state; + new_state.bb = e->dest; + new_state.vdef = current_vdef; - /* Verify destination PHI uses and recurse. */ - edge_iterator ei; - edge e; - FOR_EACH_EDGE (e, ei, bb->succs) - { - gphi *phi = get_virtual_phi (e->dest); - if (phi - && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef) - { - error ("PHI node with wrong VUSE on edge from BB %d", - e->src->index); - print_gimple_stmt (stderr, phi, 0, TDF_VOPS); - fprintf (stderr, "expected "); - print_generic_expr (stderr, current_vdef); - fprintf (stderr, "\n"); - err = true; + worklist.safe_push (new_state); + } } - - /* Recurse. */ - err |= verify_vssa (e->dest, current_vdef, visited); } - return err; }