| Issue |
75600
|
| Summary |
unexpected output results in fusion using -O1
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
Elowen-jjw
|
For the following two c files, I performed the equivalent transformation of loop from **file1.c** to **file2.c**. I ran these two files respectively using different optimization levels including **-O0**, **-O1**, **-O2**, **-O3**, **-Os**, **-Ofast**. The exact output results(i.e. checksum values) are:
```
-O0 -O1 -O2 -O3 -Os -Ofast
file1.c B446EEBD E7E07BE5 7A003B57 7A003B57 E7E07BE5 7A003B57
file2.c B446EEBD 9BA54690 7A003B57 7A003B57 E7E07BE5 7A003B57
```
Please help me to explain why these two files produced different output results when using the same optimization level(i.e. -O1), thank you.
command line:
```
clang <filename.c> <optimization level> -lm -I $CSMITH_HOME/include && ./a.out
```
version: clang+llvm 14.0.0
os: ubuntu 22.04
**file1.c**
```
#include "csmith.h"
static int g_a75[1];
static int64_t g_b75[1];
union U0 {
signed f0 : 26;
int64_t f1;
int16_t f2;
};
static int32_t g_37 = 0x2CE6C1CCL;
static int32_t *g_120 = &g_37;
static int16_t g_169[2] = {0xB768L, 0xB768L};
static uint8_t g_206[2] = {0UL, 0UL};
static union U0 g_300 = {0x9E01EE1CL};
static union U0 *g_302[2][3][2] = {{{&g_300, &g_300}, {&g_300, &g_300}, {&g_300, &g_300}}, {{&g_300, &g_300}, {&g_300, &g_300}, {&g_300, &g_300}}};
static union U0 **volatile g_301 = &g_302[0][1][1];
static int32_t **volatile g_493 = &g_120;
static void func_1(void);
static void func_1(void) {
int32_t *l_36[2][1][1];
int32_t **l_94 = &l_36[1][0][0];
int32_t ***l_93 = &l_94;
int i, j, k;
for (i = 0; i < 2; i++) {
int ii_1;
// fusion
for (j = 0, ii_1 = 0; j < 1; j++, ii_1++) {
for (k = 0; k < 1; k++) {
l_36[i][j][k] = &g_37;
g_a75[ii_1] = (*g_302[1][1][0]).f0 * g_37 - (**g_493);
}
}
int jj_1;
for (jj_1 = 0; jj_1 < 1; jj_1++) {
g_b75[jj_1] = (*g_302[1][0][0]).f2 * g_a75[jj_1] + (**g_301).f1;
}
}
((***l_93) = (safe_mul_func_uint16_t_u_u((((safe_unary_minus_func_int64_t_s((safe_div_func_int32_t_s_s((((safe_sub_func_uint16_t_u_u(((safe_mod_func_int32_t_s_s((((*l_93) != (void *)0) < g_169[1]), 0xFA4BC5AEL)) > g_206[0]), 65535UL)) || 0xA1EAL) & 0x77DCL), g_206[1])))) != 0UL) > (-1L)), 0xA492L)));
}
int main(void) {
int i;
int print_hash_value = 0;
platform_main_begin();
crc32_gentab();
func_1();
transparent_crc(g_37, "g_37", print_hash_value);
for (i = 0; i < 2; i++) {
transparent_crc(g_169[i], "g_169[i]", print_hash_value);
}
for (i = 0; i < 2; i++) {
transparent_crc(g_206[i], "g_206[i]", print_hash_value);
}
for (i = 0; i < 1; i++) {
transparent_crc(g_a75[i], "g_a75[i]", print_hash_value);
}
for (i = 0; i < 1; i++) {
transparent_crc(g_b75[i], "g_b75[i]", print_hash_value);
}
platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
return 0;
}
```
**file2.c**
```
#include "csmith.h"
static int g_a75[1];
static int64_t g_b75[1];
union U0 {
signed f0 : 26;
int64_t f1;
int16_t f2;
};
static int32_t g_37 = 0x2CE6C1CCL;
static int32_t *g_120 = &g_37;
static int16_t g_169[2] = {0xB768L, 0xB768L};
static uint8_t g_206[2] = {0UL, 0UL};
static union U0 g_300 = {0x9E01EE1CL};
static union U0 *g_302[2][3][2] = {{{&g_300, &g_300}, {&g_300, &g_300}, {&g_300, &g_300}}, {{&g_300, &g_300}, {&g_300, &g_300}, {&g_300, &g_300}}};
static union U0 **volatile g_301 = &g_302[0][1][1];
static int32_t **volatile g_493 = &g_120;
static void func_1(void);
static void func_1(void) {
int32_t *l_36[2][1][1];
int32_t **l_94 = &l_36[1][0][0];
int32_t ***l_93 = &l_94;
int i, j, k;
for (i = 0; i < 2; i++) {
int ii_1;
int jj_1;
int ij_1;
// fusion
for (j = 0, ii_1 = 0, jj_1 = 0, ij_1 = 0; ij_1 <= 1; ij_1++) {
if (ij_1 <= 1 && j < 1) {
for (k = 0; k < 1; k++) {
l_36[i][j][k] = &g_37;
g_a75[ii_1] = (*g_302[1][1][0]).f0 * g_37 - (**g_493);
}
j++;
ii_1++;
}
if (ij_1 <= 1 && jj_1 < 1) {
g_b75[jj_1] = (*g_302[1][0][0]).f2 * g_a75[jj_1] + (**g_301).f1;
jj_1++;
}
}
}
((***l_93) = (safe_mul_func_uint16_t_u_u((((safe_unary_minus_func_int64_t_s((safe_div_func_int32_t_s_s((((safe_sub_func_uint16_t_u_u(((safe_mod_func_int32_t_s_s((((*l_93) != (void *)0) < g_169[1]), 0xFA4BC5AEL)) > g_206[0]), 65535UL)) || 0xA1EAL) & 0x77DCL), g_206[1])))) != 0UL) > (-1L)), 0xA492L)));
}
int main(void) {
int i;
int print_hash_value = 0;
platform_main_begin();
crc32_gentab();
func_1();
transparent_crc(g_37, "g_37", print_hash_value);
for (i = 0; i < 2; i++) {
transparent_crc(g_169[i], "g_169[i]", print_hash_value);
}
for (i = 0; i < 2; i++) {
transparent_crc(g_206[i], "g_206[i]", print_hash_value);
}
for (i = 0; i < 1; i++) {
transparent_crc(g_a75[i], "g_a75[i]", print_hash_value);
}
for (i = 0; i < 1; i++) {
transparent_crc(g_b75[i], "g_b75[i]", print_hash_value);
}
platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
return 0;
}
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs