* [PATCH, C++] Make Canonical ICE instead of just warn when mismatching @ 2007-01-04 5:30 Andrew_Pinski 2007-01-04 19:23 ` Mike Stump 2007-01-05 6:33 ` Gabriel Dos Reis 0 siblings, 2 replies; 26+ messages in thread From: Andrew_Pinski @ 2007-01-04 5:30 UTC (permalink / raw) To: gcc-patches [-- Attachment #1: Type: text/plain, Size: 864 bytes --] Since Doug mentioned it would ICE without checking enabled (http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00172.html), it seems the right thing to just ICE and then watch out for more fall out. Yes right now we know of a testcase where before this patch we will pass but after we will now ICE but it seems like a good idea to get this ICEing before we get more testcases where we ICE with checking disable. (I posted the reduced testcase for this problem at http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00209.html ). OK? Bootstrapped and tested on i686-linux-gnu with no regressions. Thanks, Andrew Pinski ChangeLog: * typeck.c (comptypes): Call error instead of warning for "canonical types differ for identical types". And then call gcc_unreachable. Likewise for "same canonical type node for different types" case. [-- Attachment #2: makeinternal_error.diff.txt --] [-- Type: text/plain, Size: 1192 bytes --] Index: typeck.c =================================================================== --- typeck.c (revision 120428) +++ typeck.c (working copy) @@ -1121,22 +1121,22 @@ comptypes (tree t1, tree t2, int strict) /* The two types are structurally equivalent, but their canonical types were different. This is a failure of the canonical type propagation code.*/ - warning(0, - "canonical types differ for identical types %T and %T", - t1, t2); + error ("canonical types differ for identical types %T and %T", + t1, t2); debug_tree (t1); debug_tree (t2); + gcc_unreachable (); } else if (!result && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2)) { /* Two types are structurally different, but the canonical types are the same. This means we were over-eager in assigning canonical types. */ - warning (0, - "same canonical type node for different types %T and %T", - t1, t2); + error ("same canonical type node for different types %T and %T", + t1, t2); debug_tree (t1); debug_tree (t2); + gcc_unreachable (); } return result; ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 5:30 [PATCH, C++] Make Canonical ICE instead of just warn when mismatching Andrew_Pinski @ 2007-01-04 19:23 ` Mike Stump 2007-01-04 21:00 ` Andrew_Pinski 2007-01-05 6:35 ` Gabriel Dos Reis 2007-01-05 6:33 ` Gabriel Dos Reis 1 sibling, 2 replies; 26+ messages in thread From: Mike Stump @ 2007-01-04 19:23 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches On Jan 3, 2007, at 9:30 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: > Since Doug mentioned it would ICE without checking enabled > (http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00172.html), it seems > the > right thing to just ICE and then watch out for more fall out. No, that's wrong. If enable checking is off, we normally don't run this code, so changing it in that case, isn't interesting. Further, when we normally do run that code, checking it on. We want soft fail in that case, and your patch removes that feature. > Yes right now we know of a testcase where before this patch we will > pass Pass? I get: mrs2 $ ./xgcc -B./ -x c++ -S t.c t.c: In instantiation of 'CentX<3>': t.c:8: instantiated from here t.c:6: warning: canonical types differ for identical types Mesh<3> and Mesh<3> Is this what you meant by pass? If so, well, that was the design intent. To be able to compile up, say an entire Linux distribution, have it build (not error out), and then go back and review the logs for any of these `warnings'. If any are found, fix them, and then repeat. When the next compiler is released, we plan on asking users (or, they might find out via word of mouth or google) if running the canonical verifier fixes their problem, if it does, they have an instant work around for any bug in this area, and we can quickly know that the area to fix is type canonicalization. > OK? No. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 19:23 ` Mike Stump @ 2007-01-04 21:00 ` Andrew_Pinski 2007-01-04 22:26 ` Doug Gregor 2007-01-04 22:36 ` Mike Stump 2007-01-05 6:35 ` Gabriel Dos Reis 1 sibling, 2 replies; 26+ messages in thread From: Andrew_Pinski @ 2007-01-04 21:00 UTC (permalink / raw) To: Mike Stump; +Cc: gcc-patches Mike Stump <mrs@apple.com> wrote on 01/04/2007 11:23:26 AM: > When the next compiler is released, we plan on asking users (or, they > might find out via word of mouth or google) if running the canonical > verifier fixes their problem, if it does, they have an instant work > around for any bug in this area, and we can quickly know that the > area to fix is type canonicalization. Except two things, One: you cannot turn off the warning without turning off all warnings. Two: when you turn off all the warnings, you still get gabarbe to the screen. Also this is an internal verifier and not one that is verifier of the C++ code. It seems better to ICE rather than just warn as we trying to catch problems early on, rather than going crazy when people start really testing the compiler. One more thing, we have lots of verifiers inside GCC which we turn on/off while development. Maybe the code should be written as: #ifdef ENABLE_CHECKING /* The two types are structurally equivalent, but their canonical types were different. This is a failure of the canonical type propagation code.*/ error ("canonical types differ for identical types %T and %T", t1, t2); debug_tree (t1); debug_tree (t2); gcc_unreachable (); #else warning(0, "canonical types differ for identical types %T and %T", t1, t2); #endif And then we don't have to worry about the weird debugging trees getting in the way. Thanks, Andrew Pinski ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 21:00 ` Andrew_Pinski @ 2007-01-04 22:26 ` Doug Gregor 2007-01-06 8:25 ` Eric Botcazou 2007-01-04 22:36 ` Mike Stump 1 sibling, 1 reply; 26+ messages in thread From: Doug Gregor @ 2007-01-04 22:26 UTC (permalink / raw) To: Andrew_Pinski; +Cc: Mike Stump, gcc-patches On 1/4/07, Andrew_Pinski@playstation.sony.com > Maybe the code should be written as: > > #ifdef ENABLE_CHECKING > /* The two types are structurally equivalent, but their > canonical types were different. This is a failure of the > canonical type propagation code.*/ > error ("canonical types differ for identical types %T and > %T", > t1, t2); > debug_tree (t1); > debug_tree (t2); > gcc_unreachable (); > #else > warning(0, > "canonical types differ for identical types %T and > %T", > t1, t2); > #endif > > And then we don't have to worry about the weird debugging trees getting in > the way. That's not a bad solution... ICEing when we run into a problem and ENABLE_CHECKING is defined means that we'll catch more bugs earlier, which is probably a good thing, and release compilers (--disable-checking) will still have the graceful degradation behavior with the warning. Cheers, Doug ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 22:26 ` Doug Gregor @ 2007-01-06 8:25 ` Eric Botcazou 0 siblings, 0 replies; 26+ messages in thread From: Eric Botcazou @ 2007-01-06 8:25 UTC (permalink / raw) To: Doug Gregor; +Cc: gcc-patches, Andrew_Pinski, Mike Stump > That's not a bad solution... ICEing when we run into a problem and > ENABLE_CHECKING is defined means that we'll catch more bugs earlier, > which is probably a good thing, and release compilers > (--disable-checking) will still have the graceful degradation behavior > with the warning. Released compilers are configured with --enable-checking=release nowadays. -- Eric Botcazou ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 21:00 ` Andrew_Pinski 2007-01-04 22:26 ` Doug Gregor @ 2007-01-04 22:36 ` Mike Stump 2007-01-04 23:44 ` Andrew_Pinski 1 sibling, 1 reply; 26+ messages in thread From: Mike Stump @ 2007-01-04 22:36 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches On Jan 4, 2007, at 12:59 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: > One: you cannot turn off the warning without turning off all warnings. And is that a feature, or a bug? Sounds kinda like a feature to me. > Two: when you turn off all the warnings, you still get gabarbe to the > screen. I can live with that. If someone wanted to conditionalize the two tree dumpers on warnings coming out, that'd be better of course. > It seems better to ICE rather than just warn as we trying to catch > problems early on, Consider there are 20 bugs a person could find for us building an entire linux world. Ad I engineered it, they get to do the whole build, and report the 20 translation units that produced the warning and report (at the same time) that when those 20 are fixed, there are no more bugs in the entire build. If we did it your way, they would get a compiler from us, do a build, it would die, the would report it, they would wait, we'd fix it, the would download a new compiler, build it, install it, and rebuild the world, find the next bug, and so on. In your scheme they download 20 times, build the compiler 20 times and they do 20 world builds. In addition, they have to wait for us 20 times, and they have to allocate 20 chunks of time to do 20 separate tests. There isn't any visibility into how many bugs there will be in the end, until the very last bug is fixed. In my scheme, one download, one world build, one test, one bug report. Find 5 engineers that run world builds, and ask them what scheme they would rather do. Let us know the results. I'm gonna go out on a limb and say that our's would rather do 1 build, but I can ask if you don't want to take my word for it. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 22:36 ` Mike Stump @ 2007-01-04 23:44 ` Andrew_Pinski 2007-01-04 23:48 ` Daniel Jacobowitz 2007-01-05 2:04 ` Mike Stump 0 siblings, 2 replies; 26+ messages in thread From: Andrew_Pinski @ 2007-01-04 23:44 UTC (permalink / raw) Cc: gcc-patches Mike Stump <mrs@apple.com> wrote on 01/04/2007 02:36:26 PM: > On Jan 4, 2007, at 12:59 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: > > One: you cannot turn off the warning without turning off all warnings. > > And is that a feature, or a bug? Sounds kinda like a feature to me. It would be a feature if the user could fix their code if it was broken but their code is not the issue here but GCC is broken. So users get a warning which is bogus to them and not helpful at all. What they will do is just move to an older version of GCC and give up on the newer ones. This is why this needs to be an internal error and not a warning. I don't think we really need to warn at all even without checking enabled. > > Two: when you turn off all the warnings, you still get gabarbe to the > > screen. > > I can live with that. If someone wanted to conditionalize the two > tree dumpers on warnings coming out, that'd be better of course. Considering this is all internal to GCC rather than an issue with people's code. I rather not warn at all because people might think their code is broken when instead GCC is broken. The real question is why was this a warning with junk after it in the first place, it seems wrong to be a warning which the user is not able to resolve at all. To an user this warning is not helpful at all since it says nothing about their code except GCC is broken internal so what can the user do, nothing except report a bug. They cannot turn off just that warning. I am thinking about applying this patch as obvious and then letting people file more bugs about problems internally to GCC. -- Pinski ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 23:44 ` Andrew_Pinski @ 2007-01-04 23:48 ` Daniel Jacobowitz 2007-01-04 23:59 ` Andrew Pinski 2007-01-05 2:04 ` Mike Stump 1 sibling, 1 reply; 26+ messages in thread From: Daniel Jacobowitz @ 2007-01-04 23:48 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches On Thu, Jan 04, 2007 at 03:42:36PM -0800, Andrew_Pinski@PlayStation.Sony.Com wrote: > It would be a feature if the user could fix their code if it was broken > but their code is not the issue here but GCC is broken. So users get a > warning which is bogus to them and not helpful at all. What they will do > is just move to an older version of GCC and give up on the newer ones. I can only conclude that you did not read or think about anything that Mike wrote. Please try again. > The real question is why was this a warning with junk after it in the > first place, > it seems wrong to be a warning which the user is not able to resolve at > all. So why not fix that instead? Format the extra info into string buffers and use %s. > I am thinking about applying this patch as obvious and then letting people > file more bugs > about problems internally to GCC. Do not do that. A patch which draws immediate disagreement is _NEVER_ obvious, no matter how thoroughly you ignore the response. -- Daniel Jacobowitz CodeSourcery ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 23:48 ` Daniel Jacobowitz @ 2007-01-04 23:59 ` Andrew Pinski 2007-01-05 0:03 ` Daniel Jacobowitz 2007-01-05 6:41 ` Gabriel Dos Reis 0 siblings, 2 replies; 26+ messages in thread From: Andrew Pinski @ 2007-01-04 23:59 UTC (permalink / raw) To: Daniel Jacobowitz; +Cc: Andrew_Pinski, gcc-patches > > On Thu, Jan 04, 2007 at 03:42:36PM -0800, Andrew_Pinski@PlayStation.Sony.Com wrote: > Do not do that. > > A patch which draws immediate disagreement is _NEVER_ obvious, no > matter how thoroughly you ignore the response. Except what Mike is talking about is not really an issue we should be worrying about right now because again this is an internal check. If GCC is broken, why try to continue? This is just like any other internal check inside GCC we have. Do you want to continue to compile when a RTL instruction is invalid for a target and then get wrong code which is harder to debug? I don't think so. Then why have a warning which is not really helpful at all to users saying GCC is broken and might miscompile their programs. Really this should have been an internal compiler error to begin with and not a warning. Also what Mike is talking about is doing a compile farm for a world build which is a different issue and seperate issue. It should not be an issue with a patch which actually just corrects a mistake of generating a bogus warning. Again the warning is useless to the user as it is an internal GCC issue rather than a problem with their code. The warning should be turned into an internal error as it is an internal check and not a problem with the source that is being compiled. warning should only be used for problems with the source being compiled and not internal GCC problems, those should be internal errors. Also I am about to fix more internal problems and then post more internal checkers do you want a warning or an error? Warnings like this are all but useless to the user. Maybe we should have -Winternal-checking but that seems like a stupid idea since the internal problems need to be fixed inside GCC and not in the sources that are being compiled. -- Pinski ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 23:59 ` Andrew Pinski @ 2007-01-05 0:03 ` Daniel Jacobowitz 2007-01-05 0:17 ` Andrew_Pinski 2007-01-05 6:41 ` Gabriel Dos Reis 1 sibling, 1 reply; 26+ messages in thread From: Daniel Jacobowitz @ 2007-01-05 0:03 UTC (permalink / raw) To: Andrew Pinski; +Cc: Andrew_Pinski, gcc-patches On Thu, Jan 04, 2007 at 07:00:22PM -0500, Andrew Pinski wrote: > Except what Mike is talking about is not really an issue we should > be worrying about right now because again this is an internal check. > If GCC is broken, why try to continue? You haven't thought enough about the reason the warning was added as a warning. Please go read it again, and then think about it (and don't copy me about it again). Thanks. -- Daniel Jacobowitz CodeSourcery ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 0:03 ` Daniel Jacobowitz @ 2007-01-05 0:17 ` Andrew_Pinski 2007-01-05 6:44 ` Gabriel Dos Reis 0 siblings, 1 reply; 26+ messages in thread From: Andrew_Pinski @ 2007-01-05 0:17 UTC (permalink / raw) Cc: gcc-patches Daniel Jacobowitz <drow@false.org> wrote on 01/04/2007 04:03:39 PM: > On Thu, Jan 04, 2007 at 07:00:22PM -0500, Andrew Pinski wrote: > > Except what Mike is talking about is not really an issue we should > > be worrying about right now because again this is an internal check. > > If GCC is broken, why try to continue? > > You haven't thought enough about the reason the warning was added as a > warning. Please go read it again, and then think about it (and don't > copy me about it again). Thanks. The only thing the warning says to me, is that GCC is broken. And if an user gets it, what can they do except complain or ignore it. With an internal compiler error, they are more willing to complain about that than a warning being there. If it was an internal error, we would have caught the issue with tramp3d earlier. The warning is useless to the common user of GCC really. I don't see why I am getting push back on a simple change that is actually obviously the correct thing to do for an internal check. Can I now then change all the internal checking ICEs into warnings because that is what the real issue here? To me, Canonical types was not thought through enough if this was a warning and the reviewer of the patch should have caught this issue when reviewing the patch in the first place. There are multiple issues with Canonical types right now, since it causes memory usage to go up around 1-2% (in C and other langauge code) which seems like not a good thing when most of the problems are really just internal to the C++ front-end rather than in generic code. Thanks, Andrew Pinski ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 0:17 ` Andrew_Pinski @ 2007-01-05 6:44 ` Gabriel Dos Reis 2007-01-05 14:14 ` Doug Gregor 2007-01-05 14:16 ` Richard Kenner 0 siblings, 2 replies; 26+ messages in thread From: Gabriel Dos Reis @ 2007-01-05 6:44 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches Andrew_Pinski@PlayStation.Sony.Com writes: [...] | The warning is useless to the common user of GCC really. I don't see why | I am getting push back on a simple change that is actually obviously the | correct | thing to do for an internal check. "obvious" means different thing for different people. Please, invent a new non-fatal diagnostic category ("internal consistency check: "?) and resubmit your patch -- I'll review it. -- Gaby ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 6:44 ` Gabriel Dos Reis @ 2007-01-05 14:14 ` Doug Gregor 2007-01-05 14:16 ` Richard Kenner 1 sibling, 0 replies; 26+ messages in thread From: Doug Gregor @ 2007-01-05 14:14 UTC (permalink / raw) To: Gabriel Dos Reis; +Cc: Andrew_Pinski, gcc-patches On 05 Jan 2007 07:44:01 +0100, Gabriel Dos Reis <gdr@integrable-solutions.net> wrote: > Please, invent a new non-fatal diagnostic category > ("internal consistency check: "?) and resubmit your patch -- I'll > review it. Good idea. Cheers, Doug ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 6:44 ` Gabriel Dos Reis 2007-01-05 14:14 ` Doug Gregor @ 2007-01-05 14:16 ` Richard Kenner 1 sibling, 0 replies; 26+ messages in thread From: Richard Kenner @ 2007-01-05 14:16 UTC (permalink / raw) To: gdr; +Cc: Andrew_Pinski, gcc-patches > Please, invent a new non-fatal diagnostic category ("internal > consistency check: "?) and resubmit your patch -- I'll review it. I've been following this discussion without any opinions so far, but I like that approach: that way we have plenty of opportunities to decide how to handle that set of diagnostics, including via command-line options or doing different things for release and development branches, or ... ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 23:59 ` Andrew Pinski 2007-01-05 0:03 ` Daniel Jacobowitz @ 2007-01-05 6:41 ` Gabriel Dos Reis 1 sibling, 0 replies; 26+ messages in thread From: Gabriel Dos Reis @ 2007-01-05 6:41 UTC (permalink / raw) To: Andrew Pinski; +Cc: Daniel Jacobowitz, Andrew_Pinski, gcc-patches Andrew Pinski <pinskia@physics.uc.edu> writes: [...] | Again the warning is useless to the user as it is an internal GCC issue | rather than a problem with their code. Labeling the diagnotics "warning: " is indeed confusing; I should have caught that earlier. Still the diagnotic is useful to us, however useless you think it is for user. So we want to know about it. Consequently, I think warning() or error() is NOT a good thing. We should either issue sorry() or invent a new diagnostic category -- we only need an enumerator and a forwarding function for that. -- Gaby ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 23:44 ` Andrew_Pinski 2007-01-04 23:48 ` Daniel Jacobowitz @ 2007-01-05 2:04 ` Mike Stump 2007-01-05 3:13 ` Brooks Moses 1 sibling, 1 reply; 26+ messages in thread From: Mike Stump @ 2007-01-05 2:04 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches On Jan 4, 2007, at 3:42 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: > Mike Stump <mrs@apple.com> wrote on 01/04/2007 02:36:26 PM: > >> On Jan 4, 2007, at 12:59 PM, Andrew_Pinski@PlayStation.Sony.Com >> wrote: >>> One: you cannot turn off the warning without turning off all >>> warnings. >> >> And is that a feature, or a bug? Sounds kinda like a feature to me. > > It would be a feature if the user could fix their code if it was > broken > but their code is not the issue here but GCC is broken. Correct. > So users get a warning Correct. > which is bogus We can reword the warning anyway you want, further, we can make it a note if you prefer. Does the wording, "note: internal consistency failure in type canonicalization, recovering" rock your world? If so, let's change the wording if you don't like the present wording. > to them and not helpful at all. Go poll 20 users, ask them what is more useful to them, a compiler that core dumps immediately when trying to compile their software, or one that compiles it. Tell us what your results are. I'd be happy to go poll 20 people if you think they will claim that failing to compile is better than compiling. > What they will do is just move to an older version of GCC and give > up on the newer ones. And how does this differ from a compiler that ICEs? > This is why this needs to be an internal error and not a warning. Explain that slowly again, I missed your entire argument in favor of an ICE. > I rather not warn at all because people might think their code is > broken > when instead GCC is broken. So, you object to the spelling. We look forward to any enhancements to the wording you'd care to contribute. > The real question is why was this a warning with junk after it in the > first place, it seems wrong to be a warning which the user is not > able to resolve at all. I'm happy to explain this again. The answer is so that they can file a problem report for it, and so that we can trivially know that the problem is with type canonicalization. > I am thinking about applying this patch as obvious I'm happy for you to do that, if I'm wrong and you're right. On Jan 4, 2007, at 4:00 PM, Andrew Pinski wrote: > Except what Mike is talking about is not really an issue we should > be worrying about right now So, testing isn't something we should worry about now? Nor, large scale testing on large source bases? Why is it important to avoid testing now? > If GCC is broken, why try to continue? What part of my previous explanation was unclear? > This is just like any other internal check inside GCC we have. It could be. It need not be. In our design for this one, we choose to use software fault tolerance. 99.9% of the other checks, don't. If you want to argue that software is no place to practice fault tolerance, fine, do that. Feel free to cite references if you want. We don't have to, but, for the transition hump, I do think it is better to offer fault tolerance. > Do you want to continue to compile when a RTL instruction is invalid > for a target Yes, why. > and then get wrong code Trivially, software fault tolerance is about correctly handling faults, not replacing one fault with a harder to diagnose fault. To correctly practice this art, one would necessarily get good code, not wrong code. > which is harder to debug? Having a compiler tell you that that it failed an internal consistency check is easier to debug. That is what the code does. > Then why have a warning which is not really helpful at all to users > saying GCC is broken and might miscompile Why diagnose internal consistency problems, well, because it makes for faster/better software development. Why practice software fault tolerance? To reduce the occurrences of software faults. Why is that good? Because users like software that works as opposed to software that faults. > their programs. Really this should have been an internal compiler > error to begin with and not a warning. In software fault tolerance, producing a fault for error recovery isn't valid, the only valid option it to correctly compile the code, if we ICE, we can't do that. > Also what Mike is talking about is doing a compile farm for a world > build > which is a different issue and seperate issue. No, gcc-4.3 is undergoing testing now by people that download and build and install it. > Again the warning is useless to the user as it is an internal GCC > issue > rather than a problem with their code. Ok, please design a better system that the users will like, that will get them to file a bug report with us, and that will compile their code. Do up those patches and propose that. > Also I am about to fix more internal problems and then post more > internal > checkers do you want a warning or an error? If you feel that software fault tolerance is appropriate, then I'd encourage it. As CPUs get faster, there will be (should be) more software fault tolerance in the world. Ideally, it would be nice it when we took the fault, we wrapped up the bug report, squirted it into the bug database, and didn't say a thing to the user. We can't do that, yet. On Jan 4, 2007, at 4:16 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: > The only thing the warning says to me, is that GCC is broken. Excellent, that's what we wanted to convey. > And if an user gets it, what can they do except complain or ignore > it. With an internal compiler error, they are more willing to > complain about that than a warning being there. History has shown to me that users will file bug reports. I've done this before. > If it was an internal error, we would have caught the issue with > tramp3d earlier. Ok, but catching it in 1 day v 3 days isn't very interesting to me. It was caught, long before the release of the 4.3 compiler. > The warning is useless to the common user of GCC really. A common user isn't downloading and using gcc-4.3. Why is an ICE is more useful to them then compiling? Do you know of any users that say that? > I don't see why I am getting push back on a simple change Because you've violated a design principal we thought was important enough to engineer in. > Can I now then change all the internal checking ICEs into warnings Yes, if you make them all correctly compile with no fault. I look forward to your contribution. > There are multiple issues with Canonical types right now, since it > causes memory usage to go up around 1-2% (in C and other langauge > code) which seems like not a good thing when most of the problems > are really just internal to the C++ front-end rather than in generic > code. We care about compilation speed more than memory usage. A compile that is 10x faster is more interesting that one that is 1 or 2% smaller. Do you favor a compiler that is 10x slower if we can make it 1% smaller? If so, why? ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 2:04 ` Mike Stump @ 2007-01-05 3:13 ` Brooks Moses 2007-01-05 14:13 ` Doug Gregor 0 siblings, 1 reply; 26+ messages in thread From: Brooks Moses @ 2007-01-05 3:13 UTC (permalink / raw) To: gcc-patches Mike Stump wrote: > On Jan 4, 2007, at 3:42 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: >> This is just like any other internal check inside GCC we have. > > It could be. It need not be. In our design for this one, we choose > to use software fault tolerance. 99.9% of the other checks, don't. > If you want to argue that software is no place to practice fault > tolerance, fine, do that. Feel free to cite references if you want. > We don't have to, but, for the transition hump, I do think it is > better to offer fault tolerance. There's one thing that I'm not sure I'm understanding here, in trying to follow this discussion. Normally, on a random compiler ICE, the presence of the condition that caused the ICE is an indication that something has happened that does not fit our understanding of how the code works, and thus we are in a situation where we have no reason to expect that the generated results will be correct -- and, in fact, chances are pretty good that it will be incorrect and buggy. Thus, in all of those cases, there _is_ no fault tolerance, regardless of whether the ICE is an error or a warning -- in either case, usable results are not produced. The distinction is in how we tell the user of this failure, and how clear we make it that the results are unusable. An ICE and no output makes this blantantly clear; a warning and probably-buggy output (which masquerades as a valid executable) makes it far less clear, and it's possible that some users will overlook the failure entirely. In that case, an ICE and error-out is almost certainly the correct answer. My impression from your argument is that this case is not like that; that here we know that a failure to pass this particular internal check will never result in invalid code. And thus a warning is appropriate here, because the user will still get valid usable code if they ignore the warning. Is this a correct impression? I haven't seen any mention of this distinction, but it seems to me that it's the only way that the argument for a warning instead of a hard error would make sense. - Brooks ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 3:13 ` Brooks Moses @ 2007-01-05 14:13 ` Doug Gregor 2007-01-05 14:20 ` Richard Guenther 0 siblings, 1 reply; 26+ messages in thread From: Doug Gregor @ 2007-01-05 14:13 UTC (permalink / raw) To: Brooks Moses; +Cc: gcc-patches On 1/4/07, Brooks Moses <brooks.moses@codesourcery.com> wrote: > My impression from your argument is that this case is not like that; > that here we know that a failure to pass this particular internal check > will never result in invalid code. And thus a warning is appropriate > here, because the user will still get valid usable code if they ignore > the warning. > > Is this a correct impression? I haven't seen any mention of this > distinction, but it seems to me that it's the only way that the argument > for a warning instead of a hard error would make sense. Yes, your impression is correct. The canonical types implementation is a compile-time optimization that makes comparing types for equality (e.g., is "int*" the same as "my_int_t*"?) faster. Previously, we would have to look at the structure of the types to determine if they are equivalent; with canonical types, we only do a single pointer comparison. However, the code that looks at the structure of types is still needed for some comparisons, so it's still available for us to use when checking. As it stands now, there is a parameter "verify-canonical-types". When it is zero (the default for --disable-checking builds), we trust the canonical type system to be correct and get our 5-10% speedup on template-heavy code. When it is one (the default for --enable-checking builds), we compare the results of the older, slower structure-based comparison against the results of the canonical type comparison. If they differ, we complain. Then, we can recover from the failure of the canonical-types system by reporting the result that the structure-based comparison determined. Cheers, Doug ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 14:13 ` Doug Gregor @ 2007-01-05 14:20 ` Richard Guenther 2007-01-05 14:35 ` Doug Gregor 2007-01-05 19:04 ` Mike Stump 0 siblings, 2 replies; 26+ messages in thread From: Richard Guenther @ 2007-01-05 14:20 UTC (permalink / raw) To: Doug Gregor; +Cc: Brooks Moses, gcc-patches On 1/5/07, Doug Gregor <doug.gregor@gmail.com> wrote: > On 1/4/07, Brooks Moses <brooks.moses@codesourcery.com> wrote: > > My impression from your argument is that this case is not like that; > > that here we know that a failure to pass this particular internal check > > will never result in invalid code. And thus a warning is appropriate > > here, because the user will still get valid usable code if they ignore > > the warning. > > > > Is this a correct impression? I haven't seen any mention of this > > distinction, but it seems to me that it's the only way that the argument > > for a warning instead of a hard error would make sense. > > Yes, your impression is correct. > > The canonical types implementation is a compile-time optimization that > makes comparing types for equality (e.g., is "int*" the same as > "my_int_t*"?) faster. Previously, we would have to look at the > structure of the types to determine if they are equivalent; with > canonical types, we only do a single pointer comparison. However, the > code that looks at the structure of types is still needed for some > comparisons, so it's still available for us to use when checking. > > As it stands now, there is a parameter "verify-canonical-types". When > it is zero (the default for --disable-checking builds), we trust the > canonical type system to be correct and get our 5-10% speedup on > template-heavy code. When it is one (the default for --enable-checking > builds), we compare the results of the older, slower structure-based > comparison against the results of the canonical type comparison. If > they differ, we complain. Then, we can recover from the failure of the > canonical-types system by reporting the result that the > structure-based comparison determined. So for --disable-checking builds we can get the wrong answer for T1 == T2 and so generate wrong code? In this case the error should be fatal, so we get each error reported and not get silent failures at the time 4.3 is released. Richard. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 14:20 ` Richard Guenther @ 2007-01-05 14:35 ` Doug Gregor 2007-01-05 19:04 ` Mike Stump 1 sibling, 0 replies; 26+ messages in thread From: Doug Gregor @ 2007-01-05 14:35 UTC (permalink / raw) To: Richard Guenther; +Cc: Brooks Moses, gcc-patches On 1/5/07, Richard Guenther <richard.guenther@gmail.com> wrote: > So for --disable-checking builds we can get the wrong answer for > T1 == T2 and so generate wrong code? In this case the error should > be fatal, so we get each error reported and not get silent failures > at the time 4.3 is released. I might be able to come up with a twisted example where we get wrong code from a wrong answer with canonical types... more likely, we'll just error or ICE on legal code. When users report such problems, we ask them to add "--param verify-canonical-types 1"... if that fixes the problem, they can continue to get work done and we can fix the problem. Cheers, Doug ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 14:20 ` Richard Guenther 2007-01-05 14:35 ` Doug Gregor @ 2007-01-05 19:04 ` Mike Stump 2007-01-05 19:12 ` Richard Guenther 2007-01-08 5:14 ` Andrew Pinski 1 sibling, 2 replies; 26+ messages in thread From: Mike Stump @ 2007-01-05 19:04 UTC (permalink / raw) To: Richard Guenther; +Cc: Doug Gregor, Brooks Moses, gcc-patches On Jan 5, 2007, at 6:20 AM, Richard Guenther wrote: > So for --disable-checking builds we can get the wrong answer for > T1 == T2 and so generate wrong code? There are two cases, one the does checking, and one that doesn't. -- disable-checking merely sets the default for the checking code but that can be further refined by the user. If there is no bug in the compiler, the right answer is always obtained, without checking or with checking. If there is a bug in the compiler, the right answer is always obtained with checking. The wrong answer is obtained without checking, and there is no warning/error and also no way to know that the the bug existed. > In this case the error should be fatal, Can't, see above. > so we get each error reported and not get silent failures at the > time 4.3 is released. One cannot achieve compilation time benefits while still running the checking code, they are fundamentally at odds with each other. You can either have good code in the face of bugs or a faster compiler, pick one. The current plan is to release 4.3 with the checking code off by default, it is hoped by that time that all bugs will be found and fixed. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 19:04 ` Mike Stump @ 2007-01-05 19:12 ` Richard Guenther 2007-01-08 5:14 ` Andrew Pinski 1 sibling, 0 replies; 26+ messages in thread From: Richard Guenther @ 2007-01-05 19:12 UTC (permalink / raw) To: Mike Stump; +Cc: Doug Gregor, Brooks Moses, gcc-patches On 1/5/07, Mike Stump <mrs@apple.com> wrote: > On Jan 5, 2007, at 6:20 AM, Richard Guenther wrote: > > So for --disable-checking builds we can get the wrong answer for > > T1 == T2 and so generate wrong code? > > There are two cases, one the does checking, and one that doesn't. -- > disable-checking merely sets the default for the checking code but > that can be further refined by the user. > > If there is no bug in the compiler, the right answer is always > obtained, without checking or with checking. > > If there is a bug in the compiler, the right answer is always > obtained with checking. The wrong answer is obtained without > checking, and there is no warning/error and also no way to know that > the the bug existed. > > > In this case the error should be fatal, > > Can't, see above. > > > so we get each error reported and not get silent failures at the > > time 4.3 is released. > > One cannot achieve compilation time benefits while still running the > checking code, they are fundamentally at odds with each other. You > can either have good code in the face of bugs or a faster compiler, > pick one. > > The current plan is to release 4.3 with the checking code off by > default, it is hoped by that time that all bugs will be found and > fixed. Sure - my point is that if honza didn't look at the tramp3d logfiles we wouldn't have noticed the type comparison mismatch. If it ICEd we would. So if we make it an error/ICE with checking enabled we're sure people will look into their logfiles because build actually fails. Richard. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 19:04 ` Mike Stump 2007-01-05 19:12 ` Richard Guenther @ 2007-01-08 5:14 ` Andrew Pinski 1 sibling, 0 replies; 26+ messages in thread From: Andrew Pinski @ 2007-01-08 5:14 UTC (permalink / raw) To: Mike Stump; +Cc: Richard Guenther, Doug Gregor, Brooks Moses, gcc-patches On Fri, 2007-01-05 at 11:02 -0800, Mike Stump wrote: > If there is a bug in the compiler, the right answer is always > obtained with checking. The wrong answer is obtained without > checking, and there is no warning/error and also no way to know that > the the bug existed. Right which is why this should not be just a warning for checking. This case is that we can recover from but only at expense of compile time speed. If we had it as an ICE before, we would have noticed the problem, the same day the patch went in. So we get only a warning if checking defaults or the user explicitly turns on the checking. So really most people will not see the ICE at all unless someone tells them to turn on the checking. I don't see why this case is special compared to all other checking code inside GCC, some of which we can recover from if we wanted to but we don't currently. Thanks, Andrew Pinski ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 19:23 ` Mike Stump 2007-01-04 21:00 ` Andrew_Pinski @ 2007-01-05 6:35 ` Gabriel Dos Reis 1 sibling, 0 replies; 26+ messages in thread From: Gabriel Dos Reis @ 2007-01-05 6:35 UTC (permalink / raw) To: Mike Stump; +Cc: Andrew_Pinski, gcc-patches Mike Stump <mrs@apple.com> writes: | On Jan 3, 2007, at 9:30 PM, Andrew_Pinski@PlayStation.Sony.Com wrote: | > Since Doug mentioned it would ICE without checking enabled | > (http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00172.html), it seems | > the | > right thing to just ICE and then watch out for more fall out. | | No, that's wrong. If enable checking is off, we normally don't run | this code, so changing it in that case, isn't interesting. Further, | when we normally do run that code, checking it on. We want soft fail | in that case, and your patch removes that feature. | | > Yes right now we know of a testcase where before this patch we will | > pass | | Pass? I get: | | mrs2 $ ./xgcc -B./ -x c++ -S t.c | t.c: In instantiation of 'CentX<3>': | t.c:8: instantiated from here | t.c:6: warning: canonical types differ for identical types Mesh<3> | and Mesh<3> | | Is this what you meant by pass? | | If so, well, that was the design intent. Now that I think about it, warning() is also wrong, because it leds user believe something is wrong with her code, while in fact it is the compiler which is defective. We can invent a new diagnotic category for this kind of thing or sorry(). -- Gaby ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-04 5:30 [PATCH, C++] Make Canonical ICE instead of just warn when mismatching Andrew_Pinski 2007-01-04 19:23 ` Mike Stump @ 2007-01-05 6:33 ` Gabriel Dos Reis 2007-01-23 3:41 ` Mark Mitchell 1 sibling, 1 reply; 26+ messages in thread From: Gabriel Dos Reis @ 2007-01-05 6:33 UTC (permalink / raw) To: Andrew_Pinski; +Cc: gcc-patches Andrew_Pinski@PlayStation.Sony.Com writes: | Since Doug mentioned it would ICE without checking enabled | (http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00172.html), it seems the | right thing to just ICE and then watch out for more fall out. Yes right | now we know of a testcase where before this patch we will pass but after | we will now ICE but it seems like a good idea to get this ICEing before we | get more testcases where we ICE with checking disable. (I posted the | reduced testcase for this problem at | http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00209.html ). | | OK? Bootstrapped and tested on i686-linux-gnu with no regressions. | | Thanks, | Andrew Pinski | | ChangeLog: | | * typeck.c (comptypes): Call error instead of warning for Calling error() is wrong -- there is no error in the user code. You can either gcc_assert(), or sorry(), or fatal() if you want the notification be unambiguous. -- Gaby ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH, C++] Make Canonical ICE instead of just warn when mismatching 2007-01-05 6:33 ` Gabriel Dos Reis @ 2007-01-23 3:41 ` Mark Mitchell 0 siblings, 0 replies; 26+ messages in thread From: Mark Mitchell @ 2007-01-23 3:41 UTC (permalink / raw) To: Gabriel Dos Reis; +Cc: Andrew_Pinski, gcc-patches Gabriel Dos Reis wrote: > Andrew_Pinski@PlayStation.Sony.Com writes: > > | Since Doug mentioned it would ICE without checking enabled > | (http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00172.html), it seems the > | right thing to just ICE and then watch out for more fall out. Yes right > | now we know of a testcase where before this patch we will pass but after > | we will now ICE but it seems like a good idea to get this ICEing before we > | get more testcases where we ICE with checking disable. (I posted the > | reduced testcase for this problem at > | http://gcc.gnu.org/ml/gcc-patches/2007-01/msg00209.html ). > | > | OK? Bootstrapped and tested on i686-linux-gnu with no regressions. I think we should leave this as is for now, and turn it into a sorry() or internal_error() before the 4.3 release. For now, it's nice to be able to work around any failures. You can file a P1 bug against 4.3 to make that change, if you like. -- Mark Mitchell CodeSourcery mark@codesourcery.com (650) 331-3385 x713 ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2007-01-23 3:41 UTC | newest] Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-01-04 5:30 [PATCH, C++] Make Canonical ICE instead of just warn when mismatching Andrew_Pinski 2007-01-04 19:23 ` Mike Stump 2007-01-04 21:00 ` Andrew_Pinski 2007-01-04 22:26 ` Doug Gregor 2007-01-06 8:25 ` Eric Botcazou 2007-01-04 22:36 ` Mike Stump 2007-01-04 23:44 ` Andrew_Pinski 2007-01-04 23:48 ` Daniel Jacobowitz 2007-01-04 23:59 ` Andrew Pinski 2007-01-05 0:03 ` Daniel Jacobowitz 2007-01-05 0:17 ` Andrew_Pinski 2007-01-05 6:44 ` Gabriel Dos Reis 2007-01-05 14:14 ` Doug Gregor 2007-01-05 14:16 ` Richard Kenner 2007-01-05 6:41 ` Gabriel Dos Reis 2007-01-05 2:04 ` Mike Stump 2007-01-05 3:13 ` Brooks Moses 2007-01-05 14:13 ` Doug Gregor 2007-01-05 14:20 ` Richard Guenther 2007-01-05 14:35 ` Doug Gregor 2007-01-05 19:04 ` Mike Stump 2007-01-05 19:12 ` Richard Guenther 2007-01-08 5:14 ` Andrew Pinski 2007-01-05 6:35 ` Gabriel Dos Reis 2007-01-05 6:33 ` Gabriel Dos Reis 2007-01-23 3:41 ` Mark Mitchell
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).