public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug other/115437] New: Wrong optimized code - GCC didn't detect a variable is modified
@ 2024-06-11 15:19 Explorer09 at gmail dot com
2024-06-11 15:25 ` [Bug other/115437] " pinskia at gcc dot gnu.org
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Explorer09 at gmail dot com @ 2024-06-11 15:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115437
Bug ID: 115437
Summary: Wrong optimized code - GCC didn't detect a variable is
modified
Product: gcc
Version: 12.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: Explorer09 at gmail dot com
Target Milestone: ---
Note: I cannot tell which component this bug belongs to. Please help me update
the "component" field for this bug report.
Tested in Compiler Explorer: https://godbolt.org/z/c6fKjMboK
## Test code
```c
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
__attribute__((noinline)) \
uint32_t utf8_to_ascii(const uint8_t **sequence)
{
if (**sequence <= 0x7F) {
return *(*sequence)++;
}
(*sequence)++;
return (uint32_t)-1;
}
int main(void)
{
static const char str[] = { 'A', 'B', 'C', '\x00' };
static const uint8_t str2[] = { 'A', 'B', 'C', '\x00' };
uint32_t code_point;
{
const char *str_ptr;
str_ptr = str;
code_point = utf8_to_ascii((const uint8_t **)&str_ptr);
printf("%p %p\n", str, str_ptr);
printf("src: %lu byte(s) parsed\n", (unsigned long)(str_ptr - str));
}
{
const uint8_t *str_ptr2;
str_ptr2 = (const uint8_t *)str;
code_point = utf8_to_ascii(&str_ptr2);
const char *str_ptr;
str_ptr = (const char *)str_ptr2;
printf("%p %p\n", str, str_ptr);
printf("src: %lu byte(s) parsed\n", (unsigned long)(str_ptr - str));
}
{
const uint8_t *str_ptr2;
str_ptr2 = str2;
code_point = utf8_to_ascii(&str_ptr2);
printf("%p %p\n", str2, str_ptr2);
printf("src: %lu byte(s) parsed\n", (unsigned long)(str_ptr2 - str2));
}
return 0;
}
```
## Expected result
All three blocks in main() should print "src: 1 byte(s) parsed".
## Actual result
x86_64 gcc 12.1 with "-O2" option would have the first block print "src: 0
byte(s) parsed". "-Os" would also produce the same error result.
"-O0" and "-O1" are fine as far as I have tested.
GCC versions 12.1 to 14.1 are those that are affected.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug other/115437] Wrong optimized code - GCC didn't detect a variable is modified
2024-06-11 15:19 [Bug other/115437] New: Wrong optimized code - GCC didn't detect a variable is modified Explorer09 at gmail dot com
@ 2024-06-11 15:25 ` pinskia at gcc dot gnu.org
2024-06-11 15:29 ` pinskia at gcc dot gnu.org
2024-06-11 19:04 ` Explorer09 at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-11 15:25 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115437
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
There is an alias violation here.
Use -fno-strict-aliasing or as you shown use the correct pointer type
originally.
That is stores to `uint8_t *` and loads from `char *` are considered different
aliasing sets and GCC optimizes based on that.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug other/115437] Wrong optimized code - GCC didn't detect a variable is modified
2024-06-11 15:19 [Bug other/115437] New: Wrong optimized code - GCC didn't detect a variable is modified Explorer09 at gmail dot com
2024-06-11 15:25 ` [Bug other/115437] " pinskia at gcc dot gnu.org
@ 2024-06-11 15:29 ` pinskia at gcc dot gnu.org
2024-06-11 19:04 ` Explorer09 at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-11 15:29 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115437
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|INVALID |DUPLICATE
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
.
*** This bug has been marked as a duplicate of bug 115096 ***
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug other/115437] Wrong optimized code - GCC didn't detect a variable is modified
2024-06-11 15:19 [Bug other/115437] New: Wrong optimized code - GCC didn't detect a variable is modified Explorer09 at gmail dot com
2024-06-11 15:25 ` [Bug other/115437] " pinskia at gcc dot gnu.org
2024-06-11 15:29 ` pinskia at gcc dot gnu.org
@ 2024-06-11 19:04 ` Explorer09 at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: Explorer09 at gmail dot com @ 2024-06-11 19:04 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115437
--- Comment #3 from Kang-Che Sung <Explorer09 at gmail dot com> ---
Now I come to realize that the C standard doesn't say that a pointer type is
"compatible" with any other pointer type. So that "Foo **" type and "Bar **"
type are assumed to never alias. This is troubling because I saw many APIs that
would take a "pointer to pointer" argument in order to output address to a
particular object (for example, asprintf()), and it would be difficult to write
concise code while strictly conforming to the so-called strict aliasing rule.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-06-11 19:04 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-11 15:19 [Bug other/115437] New: Wrong optimized code - GCC didn't detect a variable is modified Explorer09 at gmail dot com
2024-06-11 15:25 ` [Bug other/115437] " pinskia at gcc dot gnu.org
2024-06-11 15:29 ` pinskia at gcc dot gnu.org
2024-06-11 19:04 ` Explorer09 at gmail dot com
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).