[Bug c/29592] Unending loops
--- Comment #1 from darkjames at darkjames dot ath dot cx 2006-10-25 16:12 --- Created an attachment (id=12490) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12490action=view) First testcase First testcase loops unending with -O2, not loops with -O2 -fno-strict-aliasing || -fstrict-aliasing -O1 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #2 from darkjames at darkjames dot ath dot cx 2006-10-25 16:13 --- Created an attachment (id=12491) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12491action=view) Second testcase test1.c + added printf() to loop, not loops with -O2 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #3 from darkjames at darkjames dot ath dot cx 2006-10-25 16:20 --- By the way, it's possible to fix the code in other way than using unions? It just need to work both for wchar_t strings and normal strings... If you have some ideas how, it'll be nice if you give me some hint... maybe use char * everywhere and use: real_char_index = index * (config_use_unicode * sizeof(wchar_t)) ? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #4 from pinskia at gcc dot gnu dot org 2006-10-25 16:45 --- In the both case, you are accessing wchar * via char * which causes an alias violation. -- pinskia at gcc dot gnu dot org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #5 from darkjames at darkjames dot ath dot cx 2006-10-25 17:11 --- Yeah, I know, but why gcc generate good code if we add that printf to test1.c (test2.c) ? It's still wchar * - char * still aliasing violation. or if we replace: __SN(str, 1); with str = (CHAR_T *) (((char *) str) + 1); it generate good code too. it's still aliasing violation? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #6 from pinskia at gcc dot gnu dot org 2006-10-25 17:18 --- (In reply to comment #5) Yeah, I know, but why gcc generate good code if we add that printf to test1.c (test2.c) ? It's still wchar * - char * still aliasing violation. Yes but there is a barrier which cause optimizations not to happen. or if we replace: __SN(str, 1); with str = (CHAR_T *) (((char *) str) + 1); it generate good code too. it's still aliasing violation? No, that is legal as you are not accessing str (wchar_t*) as a char* any longer but as a wchar_t*. You access str as a wchar_t* and then cast that value to a char* and then add one and then cast back to wchar_t* which causes the above code to be valid and defined. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592
[Bug c/29592] Unending loops
--- Comment #7 from darkjames at darkjames dot ath dot cx 2006-10-25 17:24 --- Ok, one more question, is it possible to gcc print some warnings about code like that? Cause even with -Wall it doesn't ;( gcc4 is quite more verbose than gcc3 so I think It'll be better to print warning about situation which doesn't even generate invalid code... which actually -Wstrict-aliasing does (according to manpage), but neither -Wstrict-aliasing nor -Wstrict-aliasing=2 prints warning in that testcode... I hope it's possible, thx for all. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29592