From: Jakub Jelinek Date: Mon, 14 Apr 2025 17:34:22 +0000 (+0200) Subject: expmed: Always use QImode for init_expmed set_zero_cost [PR119785] X-Git-Tag: releases/gcc-12.5.0~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d0580f1e7448283a2b95161a49d6b3c727655aa;p=thirdparty%2Fgcc.git expmed: Always use QImode for init_expmed set_zero_cost [PR119785] This is a regression on some targets introduced I believe by r6-2055 which added mode argument to set_src_cost. The problem here is that in the first iteration, mode is always QImode and we get as -Os zero cost set_src_cost (const0_rtx, QImode, false). But then we use the mode variable for iterating over int, partial int and vector int modes, so for the second iteration we call set_src_cost with mode which is at that time (machine_mode) (MAX_MODE_VECTOR_INT + 1). In the x86 case that happens to be V2HFmode and we don't crash (and compute the same 0 cost as we would for QImode). But e.g. in the SPARC case (machine_mode) (MAX_MODE_VECTOR_INT + 1) is MAX_MACHINE_MODE and that does all kinds of weird things especially when doing ubsan bootstrap. Fixed by always using QImode. 2025-04-14 Jakub Jelinek PR rtl-optimization/119785 * expmed.cc (init_expmed): Always pass QImode rather than mode to set_src_cost passed to set_zero_cost. (cherry picked from commit f96a54350afcf7f3c90d0ecb51d7683d826acc00) --- diff --git a/gcc/expmed.cc b/gcc/expmed.cc index 39e53faec70..9c3bf094f89 100644 --- a/gcc/expmed.cc +++ b/gcc/expmed.cc @@ -284,7 +284,7 @@ init_expmed (void) for (speed = 0; speed < 2; speed++) { crtl->maybe_hot_insn_p = speed; - set_zero_cost (speed, set_src_cost (const0_rtx, mode, speed)); + set_zero_cost (speed, set_src_cost (const0_rtx, QImode, speed)); for (mode = MIN_MODE_INT; mode <= MAX_MODE_INT; mode = (machine_mode)(mode + 1))