public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values @ 2023-11-27 23:21 kristerw at gcc dot gnu.org 2023-11-27 23:26 ` [Bug tree-optimization/112738] [14 Regression] " pinskia at gcc dot gnu.org ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: kristerw at gcc dot gnu.org @ 2023-11-27 23:21 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112738 Bug ID: 112738 Summary: forwprop4 introduces invalid wide signed Boolean values Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: kristerw at gcc dot gnu.org Target Milestone: --- The forwprop4 pass introduces an invalid wide Boolean when compiling the following function with -O3 for X86_64: int *a, b, c, d; void foo (void) { for (; d <= 0; d++) b &= ((a || d) ^ c) == 1; } What is happening is that forwprop4 changes the IR _38 = (signed int) _16; _59 = -_38; _65 = (<signed-boolean:32>) _59; to the incorrect _55 = (<signed-boolean:32>) _16; _65 = -_55; ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/112738] [14 Regression] forwprop4 introduces invalid wide signed Boolean values 2023-11-27 23:21 [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values kristerw at gcc dot gnu.org @ 2023-11-27 23:26 ` pinskia at gcc dot gnu.org 2023-11-27 23:34 ` pinskia at gcc dot gnu.org ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-11-27 23:26 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112738 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED Summary|forwprop4 introduces |[14 Regression] forwprop4 |invalid wide signed Boolean |introduces invalid wide |values |signed Boolean values Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org Target Milestone|--- |14.0 Last reconfirmed| |2023-11-27 Keywords| |wrong-code Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Mine. ``` /* (nop_outer_cast)-(inner_cast)var -> -(outer_cast)(var) if var is smaller in precision. This is always safe for both doing the negative in signed or unsigned as the value for undefined will not show up. */ (simplify (convert (negate:s@1 (convert:s @0))) (if (INTEGRAL_TYPE_P (type) && tree_nop_conversion_p (type, TREE_TYPE (@1)) && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0))) (negate (convert @0)))) ``` This needs a check for !BOOLEAN_TYPE here I think. boolean is the special case ... ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/112738] [14 Regression] forwprop4 introduces invalid wide signed Boolean values 2023-11-27 23:21 [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values kristerw at gcc dot gnu.org 2023-11-27 23:26 ` [Bug tree-optimization/112738] [14 Regression] " pinskia at gcc dot gnu.org @ 2023-11-27 23:34 ` pinskia at gcc dot gnu.org 2023-11-28 17:52 ` cvs-commit at gcc dot gnu.org 2023-11-28 17:52 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-11-27 23:34 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112738 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This is what I will be testing: ``` /* (nop_outer_cast)-(inner_cast)var -> -(outer_cast)(var) if var is smaller in precision. This is always safe for both doing the negative in signed or unsigned as the value for undefined will not show up. Note the outer cast cannot be a boolean type as the only valid values are 0,-1/1 (depending on the signedness of the boolean) and the negative is there to get the correct value. */ (simplify (convert (negate:s@1 (convert:s @0))) (if (INTEGRAL_TYPE_P (type) && tree_nop_conversion_p (type, TREE_TYPE (@1)) && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)) && TREE_CODE (type) != BOOLEAN_TYPE) (negate (convert @0)))) ``` It even records on why boolean check is needed. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/112738] [14 Regression] forwprop4 introduces invalid wide signed Boolean values 2023-11-27 23:21 [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values kristerw at gcc dot gnu.org 2023-11-27 23:26 ` [Bug tree-optimization/112738] [14 Regression] " pinskia at gcc dot gnu.org 2023-11-27 23:34 ` pinskia at gcc dot gnu.org @ 2023-11-28 17:52 ` cvs-commit at gcc dot gnu.org 2023-11-28 17:52 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: cvs-commit at gcc dot gnu.org @ 2023-11-28 17:52 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112738 --- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Andrew Pinski <pinskia@gcc.gnu.org>: https://gcc.gnu.org/g:68ffaf839883253e0f288862ff20b8005c92df4e commit r14-5938-g68ffaf839883253e0f288862ff20b8005c92df4e Author: Andrew Pinski <quic_apinski@quicinc.com> Date: Mon Nov 27 16:41:25 2023 -0800 MATCH: Fix invalid signed boolean type usage This fixes the incorrect assumption that was done in r14-3721-ge6bcf839894783, that being able to doing the negative after the conversion would be a valid thing but really it is not valid for boolean types. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: PR tree-optimization/112738 * match.pd (`(nop_convert)-(convert)a`): Reject when the outer type is boolean. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/112738] [14 Regression] forwprop4 introduces invalid wide signed Boolean values 2023-11-27 23:21 [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values kristerw at gcc dot gnu.org ` (2 preceding siblings ...) 2023-11-28 17:52 ` cvs-commit at gcc dot gnu.org @ 2023-11-28 17:52 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-11-28 17:52 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112738 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |RESOLVED Resolution|--- |FIXED --- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Fixed. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-11-28 17:52 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-11-27 23:21 [Bug tree-optimization/112738] New: forwprop4 introduces invalid wide signed Boolean values kristerw at gcc dot gnu.org 2023-11-27 23:26 ` [Bug tree-optimization/112738] [14 Regression] " pinskia at gcc dot gnu.org 2023-11-27 23:34 ` pinskia at gcc dot gnu.org 2023-11-28 17:52 ` cvs-commit at gcc dot gnu.org 2023-11-28 17:52 ` pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).