https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112665
Bug ID: 112665
Summary: I am getting incorrect output values at optimization
level 2 in GCC for the s390x architecture.
Product: gcc
Version: 11.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: shinwogud12 at gmail dot com
Target Milestone: ---
The provided C code includes a main function and a helper function i(), along
with a struct definition and several global variables. The code primarily
involves conditional logic and a loop to manipulate these global variables.
###PoC(Proof of Concept)
```
#include <stdint.h>
#include <stdio.h>
struct a {
uint64_t b;
};
int c = 1;
int d, e, h, f, g, l = 0;
volatile struct a k[1];
void i() {
for (; l < 1; l++)
f = d <= 0;
}
int main() {
for (e = 9; e; --e){
i();
c && (g = ((int16_t)(k[0], f)) <= e);
}
printf("g_200 value %d\n", g);
return 0;
}
```
**Struct Definition**
```
struct a {
uint64_t b;
};
```
- Defines a struct **`a`** with a single member **`b`** of type **`uint64_t`**.
**Global Variables**
```c
int c = 1;
int d, e, h, f, g, l = 0;
volatile struct a k[1];
```
- A loop that runs once, setting **`f`** to 1 if **`d`** is less than or equal
to 0.
**Main Function**
```c
cCopy code
int main() {
for (e = 9; e; --e){
i();
c && (g = ((int16_t)(k[0], f)) <= e);
}
printf("g_200 value %d\n", g);
return 0;
}
```
- A loop starts with **`e`** at 9, decrementing until it reaches 0.
- Calls function **`i()`**, which sets **`f`** based on the condition **`d <=
0`**.
- The expression **`c && (g = ((int16_t)(k[0], f)) <= e)`** uses the comma
operator, resulting in **`f`** being evaluated and cast to **`int16_t`**. Since
**`c`** is always 1, **`g`** is set to 1 if **`f`** is less than or equal to
**`e`**.
- The final value of **`g`** is printed.
### Expected Result
- Since **`d`** is initialized to 0 and never modified, **`f`** will always be
set to 1 in the **`i()`** function.
- In the main function, **`g`** is set to 1 in each iteration of the loop
because **`f`** (which is 1) is always less than or equal to **`e`** (which
decrements from 9 to 1).
- The final output of the program will be **`g_200 value 1`**.
Why does optimization level 2 in GCC output 0?
Godbolt Link: https://www.godbolt.org/z/r6c4oo18a