New Swedish PO file for 'gcc' (version 14.1-b20240218)
Hello, gentle maintainer. This is a message from the Translation Project robot. A revised PO file for textual domain 'gcc' has been submitted by the Swedish team of translators. The file is available at: https://translationproject.org/latest/gcc/sv.po (This file, 'gcc-14.1-b20240218.sv.po', has just now been sent to you in a separate email.) All other PO files for your package are available in: https://translationproject.org/latest/gcc/ Please consider including all of these in your next release, whether official or a pretest. Whenever you have a new distribution with a new version number ready, containing a newer POT file, please send the URL of that distribution tarball to the address below. The tarball may be just a pretest or a snapshot, it does not even have to compile. It is just used by the translators when they need some extra translation context. The following HTML page has been updated: https://translationproject.org/domain/gcc.html If any question arises, please contact the translation coordinator. Thank you for all your work, The Translation Project robot, in the name of your translation coordinator.
Re: [PATCH] Fortran: no size check passing NULL() without MOLD argument [PR55978]
Hi Harald, This is completely fine - if you haven't committed, please do so. Thanks Paul On Fri, 22 Mar 2024 at 17:32, Harald Anlauf wrote: > Dear all, > > here's a simple and obvious patch for a rejects-valid case when > we pass a NULL() actual to an optional dummy for variants where > there is no MOLD argument and it is also not required. > > The testcase is an extended version of PR55978 comment#16 > and cross-checked with Intel and NAG. > > Regtested on x86_64-pc-linux-gnu. > > I intend to commit soon unless there are objections. > > Thanks, > Harald > >
[PATCH] Fix overwriting files with fs::copy_file on windows
From: Björn Schäpers This fixes i.e. https://github.com/msys2/MSYS2-packages/issues/1937 I don't know if I picked the right way to do it. When acceptable I think the declaration should be moved into ops-common.h, since then we could use stat_type and also use that in the commonly used function. Manually tested on i686-w64-mingw32. -- >8 -- libstdc++: Fix overwriting files on windows The inodes have no meaning on windows, thus all files have an inode of 0. Use a differenz approach to identify equivalent files. As a result std::filesystem::copy_file did not honor copy_options::overwrite_existing. Factored the method out of std::filesystem::equivalent. libstdc++-v3/Changelog: * include/bits/fs_ops.h: Add declaration of __detail::equivalent_win32. * src/c++17/fs_ops.cc (__detail::equivalent_win32): Implement it (fs::equivalent): Use __detail::equivalent_win32, factored the old test out. * src/filesystem/ops-common.h (_GLIBCXX_FILESYSTEM_IS_WINDOWS): Use the function. Signed-off-by: Björn Schäpers --- libstdc++-v3/include/bits/fs_ops.h | 8 +++ libstdc++-v3/src/c++17/fs_ops.cc | 79 +--- libstdc++-v3/src/filesystem/ops-common.h | 10 ++- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/libstdc++-v3/include/bits/fs_ops.h b/libstdc++-v3/include/bits/fs_ops.h index 90650c47b46..d10b78a4bdd 100644 --- a/libstdc++-v3/include/bits/fs_ops.h +++ b/libstdc++-v3/include/bits/fs_ops.h @@ -40,6 +40,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace filesystem { +#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS +namespace __detail +{ + bool + equivalent_win32(const wchar_t* p1, const wchar_t* p2, error_code& ec); +} // namespace __detail +#endif //_GLIBCXX_FILESYSTEM_IS_WINDOWS + /** @addtogroup filesystem * @{ */ diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index 61df19753ef..3cc87d45237 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -67,6 +67,49 @@ namespace fs = std::filesystem; namespace posix = std::filesystem::__gnu_posix; +#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS +bool +fs::__detail::equivalent_win32(const wchar_t* p1, const wchar_t* p2, + error_code& ec) +{ + struct auto_handle { +explicit auto_handle(const path& p_) +: handle(CreateFileW(p_.c_str(), 0, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) +{ } + +~auto_handle() +{ if (*this) CloseHandle(handle); } + +explicit operator bool() const +{ return handle != INVALID_HANDLE_VALUE; } + +bool get_info() +{ return GetFileInformationByHandle(handle, &info); } + +HANDLE handle; +BY_HANDLE_FILE_INFORMATION info; + }; + auto_handle h1(p1); + auto_handle h2(p2); + if (!h1 || !h2) +{ + if (!h1 && !h2) + ec = __last_system_error(); + return false; +} + if (!h1.get_info() || !h2.get_info()) +{ + ec = __last_system_error(); + return false; +} + return h1.info.dwVolumeSerialNumber == h2.info.dwVolumeSerialNumber +&& h1.info.nFileIndexHigh == h2.info.nFileIndexHigh +&& h1.info.nFileIndexLow == h2.info.nFileIndexLow; +} +#endif //_GLIBCXX_FILESYSTEM_IS_WINDOWS + fs::path fs::absolute(const path& p) { @@ -858,41 +901,7 @@ fs::equivalent(const path& p1, const path& p2, error_code& ec) noexcept if (st1.st_mode != st2.st_mode || st1.st_dev != st2.st_dev) return false; - struct auto_handle { - explicit auto_handle(const path& p_) - : handle(CreateFileW(p_.c_str(), 0, - FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) - { } - - ~auto_handle() - { if (*this) CloseHandle(handle); } - - explicit operator bool() const - { return handle != INVALID_HANDLE_VALUE; } - - bool get_info() - { return GetFileInformationByHandle(handle, &info); } - - HANDLE handle; - BY_HANDLE_FILE_INFORMATION info; - }; - auto_handle h1(p1); - auto_handle h2(p2); - if (!h1 || !h2) - { - if (!h1 && !h2) - ec = __last_system_error(); - return false; - } - if (!h1.get_info() || !h2.get_info()) - { - ec = __last_system_error(); - return false; - } - return h1.info.dwVolumeSerialNumber == h2.info.dwVolumeSerialNumber - && h1.info.nFileIndexHigh == h2.info.nFileIndexHigh - && h1.info.nFileIndexLow == h2.info.nFileIndexLow; + return __detail::equivalent_win32(p1.c_str(), p2.c_str(), ec); #else return st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino; #endif diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index d917fddbeb1..7e67286bd01 100644 --- a/libstdc++-v3/src/filesystem
[PATCH] Value Range: Add range op for builtin isinf
Hi, The builtin isinf is not folded at front end if the corresponding optab exists. It causes the range evaluation failed on the targets which has optab_isinf. For instance, range-sincos.c will fail on the targets which has optab_isinf as it calls builtin_isinf. This patch fixed the problem by adding range op for builtin isinf. Bootstrapped and tested on x86 and powerpc64-linux BE and LE with no regressions. Is it OK for the trunk? Thanks Gui Haochen ChangeLog Value Range: Add range op for builtin isinf The builtin isinf is not folded at front end if the corresponding optab exists. So the range op fro isinf is needed for value range analysis. This patch adds range op for builtin isinf. gcc/ * gimple-range-op.cc (class cfn_isinf): New. (op_cfn_isinf): New variables. (gimple_range_op_handler::maybe_builtin_call): Handle CASE_FLT_FN (BUILT_IN_ISINF). gcc/testsuite/ * gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c: New test. patch.diff diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc index a98f7db62a7..9de130b4022 100644 --- a/gcc/gimple-range-op.cc +++ b/gcc/gimple-range-op.cc @@ -1140,6 +1140,57 @@ private: bool m_is_pos; } op_cfn_goacc_dim_size (false), op_cfn_goacc_dim_pos (true); +// Implement range operator for CFN_BUILT_IN_ISINF +class cnf_isinf : public range_operator +{ +public: + using range_operator::fold_range; + using range_operator::op1_range; + virtual bool fold_range (irange &r, tree type, const frange &op1, + const irange &, relation_trio) const override + { +if (op1.undefined_p ()) + return false; + +if (op1.known_isinf ()) + { + r.set_nonzero (type); + return true; + } + +if (op1.known_isnan () + || (!real_isinf (&op1.lower_bound ()) + && !real_isinf (&op1.upper_bound ( + { + r.set_zero (type); + return true; + } + +return false; + } + virtual bool op1_range (frange &r, tree type, const irange &lhs, + const frange &, relation_trio) const override + { +if (lhs.zero_p ()) + { + nan_state nan (true); + r.set (type, real_min_representable (type), + real_max_representable (type), nan); + return true; + } + +if (!range_includes_zero_p (&lhs)) + { + // The range is [-INF,-INF][+INF,+INF], but it can't be represented. + // Set range to [-INF,+INF] + r.set_varying (type); + r.clear_nan (); + return true; + } + +return false; + } +} op_cfn_isinf; // Implement range operator for CFN_BUILT_IN_ class cfn_parity : public range_operator @@ -1232,6 +1283,11 @@ gimple_range_op_handler::maybe_builtin_call () m_operator = &op_cfn_signbit; break; +CASE_FLT_FN (BUILT_IN_ISINF): + m_op1 = gimple_call_arg (call, 0); + m_operator = &op_cfn_isinf; + break; + CASE_CFN_COPYSIGN_ALL: m_op1 = gimple_call_arg (call, 0); m_op2 = gimple_call_arg (call, 1); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c b/gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c new file mode 100644 index 000..468f1bcf5c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c @@ -0,0 +1,44 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-evrp" } */ + +#include +void link_error(); + +void +test1 (double x) +{ + if (x > __DBL_MAX__ && !__builtin_isinf (x)) +link_error (); + if (x < -__DBL_MAX__ && !__builtin_isinf (x)) +link_error (); +} + +void +test2 (float x) +{ + if (x > __FLT_MAX__ && !__builtin_isinf (x)) +link_error (); + if (x < -__FLT_MAX__ && !__builtin_isinf (x)) +link_error (); +} + +void +test3 (double x) +{ + if (!__builtin_isinf (x) && !__builtin_isnan (x) && x > __DBL_MAX__) +link_error (); + if (!__builtin_isinf (x) && !__builtin_isnan (x) && x < -__DBL_MAX__) +link_error (); +} + +void +test4 (float x) +{ + if (!__builtin_isinf (x) && !__builtin_isnan (x) && x > __FLT_MAX__) +link_error (); + if (!__builtin_isinf (x) && !__builtin_isnan (x) && x < -__FLT_MAX__) +link_error (); +} + +/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */ +
[patch, rs6000] Implement optab_isinf for SFmode, DFmode and TFmode [PR97786]
Hi, This patch implemented optab_isinf for SF/DF/TFmode by rs6000 test data class instructions. Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Is it OK for next stage 1? Thanks Gui Haochen ChangeLog rs6000: Implement optab_isinf for SFmode, DFmode and TFmode gcc/ PR target/97786 * config/rs6000/vsx.md (isinf2): New expand for SFmode and DFmode. (isinf2): New expand for TFmode. gcc/testsuite/ PR target/97786 * gcc.target/powerpc/pr97786-1.c: New test. * gcc.target/powerpc/pr97786-2.c: New test. patch.diff diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index f135fa079bd..f0cc02f7e7b 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -5313,6 +5313,26 @@ (define_expand "xststdcp" operands[4] = CONST0_RTX (SImode); }) +(define_expand "isinf2" + [(use (match_operand:SI 0 "gpc_reg_operand")) + (use (match_operand:SFDF 1 "gpc_reg_operand"))] + "TARGET_HARD_FLOAT + && TARGET_P9_VECTOR" +{ + emit_insn (gen_xststdcp (operands[0], operands[1], GEN_INT (0x30))); + DONE; +}) + +(define_expand "isinf2" + [(use (match_operand:SI 0 "gpc_reg_operand")) + (use (match_operand:IEEE128 1 "gpc_reg_operand"))] + "TARGET_HARD_FLOAT + && TARGET_P9_VECTOR" +{ + emit_insn (gen_xststdcqp_ (operands[0], operands[1], GEN_INT (0x30))); + DONE; +}) + ;; The VSX Scalar Test Negative Quad-Precision (define_expand "xststdcnegqp_" [(set (match_dup 2) diff --git a/gcc/testsuite/gcc.target/powerpc/pr97786-1.c b/gcc/testsuite/gcc.target/powerpc/pr97786-1.c new file mode 100644 index 000..1b1e6d642de --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr97786-1.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O2 -mdejagnu-cpu=power9 -mvsx" } */ + +int test1 (double x) +{ + return __builtin_isinf (x); +} + +int test2 (float x) +{ + return __builtin_isinf (x); +} + +int test3 (float x) +{ + return __builtin_isinff (x); +} + +/* { dg-final { scan-assembler-not {\mfcmpu\M} } } */ +/* { dg-final { scan-assembler-times {\mxststdc[sd]p\M} 3 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr97786-2.c b/gcc/testsuite/gcc.target/powerpc/pr97786-2.c new file mode 100644 index 000..de7f2d67c4b --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr97786-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-require-effective-target ppc_float128_sw } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O2 -mdejagnu-cpu=power9 -mvsx -mabi=ieeelongdouble -Wno-psabi" } */ + +int test1 (long double x) +{ + return __builtin_isinf (x); +} + +int test2 (long double x) +{ + return __builtin_isinfl (x); +} + +/* { dg-final { scan-assembler-not {\mxscmpuqp\M} } } */ +/* { dg-final { scan-assembler-times {\mxststdcqp\M} 2 } } */
Re: scheduler queue flush (was Re: [gcc-15 0/3] RISC-V improve stack/array access by constant mat tweak)
On 3/21/24 11:19 AM, Vineet Gupta wrote: Oh yeah ! Robin hinted to this in Tues patchworks meeting too default : 2,565,319,368,591 128 : 2,509,741,035,068 256 : 2,527,817,813,612 no-sched{,2}: 1,295,520,567,376 So one more nugget here. I happened to be doing some historical data mining and I can see the huge instruction jump in our internal runs. We jump from 1.4T instructions to 2.1T. But more importantly we see the cycle counts *improve* across that span, roughly 17%. Unfortunately the data points are way far apart in time, so I don't think they help us narrow down the root cause. Mostly it highlights that while instruction counts are generally correlated to cycle counts, they can deviate and in this case they do so wildly. Whatever fix we end up making we'll likely need to run it on a design to evaluate its actual performance impact. jeff
[PATCH v1] doc: Correction of Tree SSA Passes info.
Current document of Tree SSA passes contains many parts that is not updated for many years. This patch removes some info that is outdated and not existed in current GCC codebase, and fixes some wrong code location descriptions based on current codebase status and ChangeLogs. gcc/ChangeLog: * doc/passes.texi: Correction of Tree SSA Passes info. --- gcc/doc/passes.texi | 70 - 1 file changed, 6 insertions(+), 64 deletions(-) diff --git a/gcc/doc/passes.texi b/gcc/doc/passes.texi index b50d3d5635b..068036acb7d 100644 --- a/gcc/doc/passes.texi +++ b/gcc/doc/passes.texi @@ -450,17 +450,6 @@ The following briefly describes the Tree optimization passes that are run after gimplification and what source files they are located in. @itemize @bullet -@item Remove useless statements - -This pass is an extremely simple sweep across the gimple code in which -we identify obviously dead code and remove it. Here we do things like -simplify @code{if} statements with constant conditions, remove -exception handling constructs surrounding code that obviously cannot -throw, remove lexical bindings that contain no variables, and other -assorted simplistic cleanups. The idea is to get rid of the obvious -stuff quickly rather than wait until later when it's more work to get -rid of it. This pass is located in @file{tree-cfg.cc} and described by -@code{pass_remove_useless_stmts}. @item OpenMP lowering @@ -478,7 +467,7 @@ described by @code{pass_lower_omp}. If OpenMP generation (@option{-fopenmp}) is enabled, this pass expands parallel regions into their own functions to be invoked by the thread -library. The pass is located in @file{omp-low.cc} and is described by +library. The pass is located in @file{omp-expand.cc} and is described by @code{pass_expand_omp}. @item Lower control flow @@ -511,15 +500,6 @@ This pass decomposes a function into basic blocks and creates all of the edges that connect them. It is located in @file{tree-cfg.cc} and is described by @code{pass_build_cfg}. -@item Find all referenced variables - -This pass walks the entire function and collects an array of all -variables referenced in the function, @code{referenced_vars}. The -index at which a variable is found in the array is used as a UID -for the variable within this function. This data is needed by the -SSA rewriting routines. The pass is located in @file{tree-dfa.cc} -and is described by @code{pass_referenced_vars}. - @item Enter static single assignment form This pass rewrites the function such that it is in SSA form. After @@ -562,15 +542,6 @@ variables that are used once into the expression that uses them and seeing if the result can be simplified. It is located in @file{tree-ssa-forwprop.cc} and is described by @code{pass_forwprop}. -@item Copy Renaming - -This pass attempts to change the name of compiler temporaries involved in -copy operations such that SSA->normal can coalesce the copy away. When compiler -temporaries are copies of user variables, it also renames the compiler -temporary to the user variable resulting in better use of user symbols. It is -located in @file{tree-ssa-copyrename.c} and is described by -@code{pass_copyrename}. - @item PHI node optimizations This pass recognizes forms of PHI inputs that can be represented as @@ -585,8 +556,7 @@ The resulting may-alias, must-alias, and escape analysis information is used to promote variables from in-memory addressable objects to non-aliased variables that can be renamed into SSA form. We also update the @code{VDEF}/@code{VUSE} memory tags for non-renameable -aggregates so that we get fewer false kills. The pass is located -in @file{tree-ssa-alias.cc} and is described by @code{pass_may_alias}. +aggregates so that we get fewer false kills. Interprocedural points-to information is located in @file{tree-ssa-structalias.cc} and described by @code{pass_ipa_pta}. @@ -604,7 +574,7 @@ is described by @code{pass_ipa_tree_profile}. This pass implements series of heuristics to guess propababilities of branches. The resulting predictions are turned into edge profile by propagating branches across the control flow graphs. -The pass is located in @file{tree-profile.cc} and is described by +The pass is located in @file{predict.cc} and is described by @code{pass_profile}. @item Lower complex arithmetic @@ -653,7 +623,7 @@ in @file{tree-ssa-math-opts.cc} and is described by @item Full redundancy elimination This is a simpler form of PRE that only eliminates redundancies that -occur on all paths. It is located in @file{tree-ssa-pre.cc} and +occur on all paths. It is located in @file{tree-ssa-sccvn.cc} and described by @code{pass_fre}. @item Loop optimization @@ -708,7 +678,7 @@ to align the number of iterations, and to align the memory accesses in the loop. The pass is implemented in @file{tree-vectorizer.cc} (the main driver), @file{tree-vect-loop.cc} and @file{tree-vect-