Hi Andrew! On 2024-12-05T15:14:45+0100, I wrote: > On 2020-01-31T11:20:14+0000, Andrew Stubbs <a...@codesourcery.com> wrote: >> This is one of those things I don't know why we didn't notice sooner. > > ..., and here's another thing I don't know why we didn't notice sooner. > ;-P (Category: "don't we all love C++?!") > >> [...] >> I also needed a convenient way to create 0.0 vector constants without >> uglifying the machine description code, so extending gcn_vec_constant >> seemed like a useful place to do it. > >> --- a/gcc/config/gcn/gcn.c >> +++ b/gcc/config/gcn/gcn.c >> @@ -992,9 +992,19 @@ gcn_vec_constant (machine_mode mode, int a) >> return CONST2_RTX (mode);*/ >> >> int units = GET_MODE_NUNITS (mode); >> - rtx tem = gen_int_mode (a, GET_MODE_INNER (mode)); >> - rtvec v = rtvec_alloc (units); >> + machine_mode innermode = GET_MODE_INNER (mode); >> + >> + rtx tem; >> + if (FLOAT_MODE_P (innermode)) >> + { >> + REAL_VALUE_TYPE rv; >> + real_from_integer (&rv, NULL, a, SIGNED); >> + tem = const_double_from_real_value (rv, innermode); >> + } >> + else >> + tem = gen_int_mode (a, innermode); >> >> + rtvec v = rtvec_alloc (units); >> for (int i = 0; i < units; ++i) >> RTVEC_ELT (v, i) = tem; > > That's apparently not the proper way to use 'real_from_integer'. Its > second argument is a 'format_helper', which is a class defined in > 'gcc/real.h', which has a templated constructor that is meant to receive > a mode, so instead of 'NULL', this should pass in 'VOIDmode' (correct?). > Anyway: until recently, this appeared to work (fine?) -- but broke with > Andrew Pinski's recent commit b3f1b9e2aa079f8ec73e3cb48143a16645c49566 > "build: Remove INCLUDE_MEMORY [PR117737]": > > [...] > In file included from ../../source-gcc/gcc/coretypes.h:507:0, > from ../../source-gcc/gcc/config/gcn/gcn.cc:24: > ../../source-gcc/gcc/real.h: In instantiation of > ‘format_helper::format_helper(const T&) [with T = std::nullptr_t]’: > ../../source-gcc/gcc/config/gcn/gcn.cc:1178:46: required from here > ../../source-gcc/gcc/real.h:233:17: error: no match for ‘operator==’ > (operand types are ‘std::nullptr_t’ and ‘machine_mode’) > : m_format (m == VOIDmode ? 0 : REAL_MODE_FORMAT (m)) > ^ > [...] > > Andrew P.'s commit doesn't touch 'gcc/config/gcn/gcn.cc'; the only part > relevant here -- per my understanding -- should be: > > --- gcc/system.h > +++ gcc/system.h > @@ -224,0 +225 @@ extern int fprintf_unlocked (FILE *, const char *, ...); > +# include <memory> > @@ -761,7 +761,0 @@ private: > -/* Some of the headers included by <memory> can use "abort" within a > - namespace, e.g. "_VSTD::abort();", which fails after we use the > - preprocessor to redefine "abort" as "fancy_abort" below. */ > - > -#ifdef INCLUDE_MEMORY > -# include <memory> > -#endif > > In other words, (unconditional) '#include <memory>' appears to preclude > ability to convert 'NULL' into a mode? (Or, I'm off-track, of course...) > > Either way: OK to push the attached "GCN: Fix 'real_from_integer' usage" > after testing completes?
No issues found in testing. Grüße Thomas
>From dfc2a5398979738ae25eb0258bbf64b82df621a5 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge <tschwi...@baylibre.com> Date: Thu, 5 Dec 2024 14:28:26 +0100 Subject: [PATCH] GCN: Fix 'real_from_integer' usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The recent commit b3f1b9e2aa079f8ec73e3cb48143a16645c49566 "build: Remove INCLUDE_MEMORY [PR117737]" exposed an issue in code added in 2020 GCN back end commit 95607c12363712c39345e1d97f2c1aee8025e188 "Zero-initialise masked load destinations"; compilation now fails: [...] In file included from ../../source-gcc/gcc/coretypes.h:507:0, from ../../source-gcc/gcc/config/gcn/gcn.cc:24: ../../source-gcc/gcc/real.h: In instantiation of ‘format_helper::format_helper(const T&) [with T = std::nullptr_t]’: ../../source-gcc/gcc/config/gcn/gcn.cc:1178:46: required from here ../../source-gcc/gcc/real.h:233:17: error: no match for ‘operator==’ (operand types are ‘std::nullptr_t’ and ‘machine_mode’) : m_format (m == VOIDmode ? 0 : REAL_MODE_FORMAT (m)) ^ [...] That's with 'g++ (GCC) 5.5.0', and seen similarly with 'g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0', for example. gcc/ * config/gcn/gcn.cc (gcn_vec_constant): Fix 'real_from_integer' usage. --- gcc/config/gcn/gcn.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc index d078392eeaf1..b60835d8df48 100644 --- a/gcc/config/gcn/gcn.cc +++ b/gcc/config/gcn/gcn.cc @@ -1175,7 +1175,7 @@ gcn_vec_constant (machine_mode mode, int a) if (FLOAT_MODE_P (innermode)) { REAL_VALUE_TYPE rv; - real_from_integer (&rv, NULL, a, SIGNED); + real_from_integer (&rv, VOIDmode, a, SIGNED); tem = const_double_from_real_value (rv, innermode); } else -- 2.34.1