<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75809>75809</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Unexpected results in optimizations when using -O1.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Elowen-jjw
</td>
</tr>
</table>
<pre>
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 timeout FA5BEE67 FA5BEE67 FA5BEE67 FA5BEE67 FA5BEE67
file2.c timeout AC3672BB FA5BEE67 FA5BEE67 FA5BEE67 FA5BEE67
```
The ```timeout``` means the ```./a.out``` had been running for a long time and still didn't terminate.
using command line:
```
clang <filename.c> <optimization level> -lm -I $CSMITH_HOME/include && ./a.out
```
Besides, I ran the command line ```clang <filename.c> <optimization level> -fsanitize=<option> -I /usr/include/csmith/ && ./a.out```, options include **address**, **undefined** and **memory**, and the terminal showed that my programs have no undefined behavior. Meanwhile, both test cases appear not to be relying on uninitialized memory, at least according to **valgrind**.
Please help me to explain why these two files produced different output results when using the same optimization level(i.e. -O1), while the transformation of loop is equivalent when using other optimization levels, thank you.
version: clang+llvm 14.0.0
os: ubuntu 22.04
And the content of ```csmith.h``` is as follows.
```
/* -*- mode: C -*-
*
* Copyright (c) 2007-2011, 2013, 2014 The University of Utah
* All rights reserved.
*
* This file is part of `csmith', a random generator of C programs.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef RANDOM_RUNTIME_H
#define RANDOM_RUNTIME_H
#ifdef CSMITH_MINIMAL
#include "csmith_minimal.h"
#else
/*****************************************************************************/
#include <string.h>
#include <float.h>
#include <math.h>
#define __STDC_LIMIT_MACROS
#include "random_inc.h"
static uint32_t crc32_tab[256];
static uint32_t crc32_context = 0xFFFFFFFFUL;
static void
crc32_gentab (void)
{
uint32_t crc;
const uint32_t poly = 0xEDB88320UL;
int i, j;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 8; j > 0; j--) {
if (crc & 1) {
crc = (crc >> 1) ^ poly;
} else {
crc >>= 1;
}
}
crc32_tab[i] = crc;
}
}
static void
crc32_byte (uint8_t b) {
crc32_context =
((crc32_context >> 8) & 0x00FFFFFF) ^
crc32_tab[(crc32_context ^ b) & 0xFF];
}
#if defined(__SPLAT__) || defined(NO_LONGLONG)
static void
crc32_8bytes (uint32_t val)
{
crc32_byte ((val>>0) & 0xff);
crc32_byte ((val>>8) & 0xff);
crc32_byte ((val>>16) & 0xff);
crc32_byte ((val>>24) & 0xff);
}
static void
transparent_crc (uint32_t val, char* vname, int flag)
{
crc32_8bytes(val);
if (flag) {
printf("...checksum after hashing %s : %X\n", vname, crc32_context ^ 0xFFFFFFFFU);
}
}
#else
static void
crc32_8bytes (uint64_t val)
{
crc32_byte ((val>>0) & 0xff);
crc32_byte ((val>>8) & 0xff);
crc32_byte ((val>>16) & 0xff);
crc32_byte ((val>>24) & 0xff);
crc32_byte ((val>>32) & 0xff);
crc32_byte ((val>>40) & 0xff);
crc32_byte ((val>>48) & 0xff);
crc32_byte ((val>>56) & 0xff);
}
static void
transparent_crc (uint64_t val, char* vname, int flag)
{
crc32_8bytes(val);
if (flag) {
printf("...checksum after hashing %s : %lX\n", vname, crc32_context ^ 0xFFFFFFFFUL);
}
}
#endif
static void
transparent_crc_bytes (char *ptr, int nbytes, char* vname, int flag)
{
int i;
for (i=0; i<nbytes; i++) {
crc32_byte(ptr[i]);
}
if (flag) {
printf("...checksum after hashing %s : %lX\n", vname, crc32_context ^ 0xFFFFFFFFUL);
}
}
/*****************************************************************************/
#endif
#endif /* RANDOM_RUNTIME_H */
/*
* Local Variables:
* c-basic-offset: 4
* tab-width: 4
* End:
*/
/* End of file. */
```
**file1.c**
```
#include "csmith.h"
struct S0 {
unsigned f0 : 28;
signed f1 : 3;
signed f2 : 26;
signed f3 : 29;
};
static int64_t g_31 = 0x9117A540F8278B72LL;
static struct S0 g_41 = {14571, -0, 4770, 6340};
static struct S0 *volatile g_220[1] = {&g_41};
static void func_1(void);
static void func_1() {
int32_t l_34 = 0xDFE53505L;
// unswitching
for (g_31 = (-27); (g_31 < 19); g_31++) {
uint64_t l_42[2];
int i;
for (i = 0; i < 2; i++) {
l_42[i] = 0xE971521F00BB6E74LL;
}
if (l_42[1]) {
if ((*g_220[0]).f1) {
break;
}
for (l_34 = (-22); (l_34 != (-14)); l_34 = safe_add_func_uint16_t_u_u(l_34, 8)) {
}
}
}
}
int main(void) {
int print_hash_value = 0;
platform_main_begin();
crc32_gentab();
func_1();
transparent_crc(g_31, "g_31", print_hash_value);
transparent_crc(g_41.f0, "g_41.f0", print_hash_value);
transparent_crc(g_41.f1, "g_41.f1", print_hash_value);
transparent_crc(g_41.f2, "g_41.f2", print_hash_value);
transparent_crc(g_41.f3, "g_41.f3", print_hash_value);
platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
return 0;
}
```
**file2.c**
```
#include <math.h>
#include <stdlib.h>
#include "csmith.h"
struct S0 {
unsigned f0 : 28;
signed f1 : 3;
signed f2 : 26;
signed f3 : 29;
};
static int64_t g_31 = 0x9117A540F8278B72LL;
static struct S0 g_41 = {14571, -0, 4770, 6340};
static struct S0 *volatile g_220[1] = {&g_41};
static void func_1(void);
static void func_1() {
int32_t l_34 = 0xDFE53505L;
// unswitching
if ((*g_220[0]).f1) {
for (g_31 = (-27); (g_31 < 19); g_31++) {
uint64_t l_42[2];
int i;
for (i = 0; i < 2; i++) {
l_42[i] = 0xE971521F00BB6E74LL;
}
if (l_42[1]) {
{ break; }
for (l_34 = (-22); (l_34 != (-14)); l_34 = safe_add_func_uint16_t_u_u(l_34, 8)) {
}
}
}
} else {
for (g_31 = (-27); (g_31 < 19); g_31++) {
uint64_t l_42[2];
int i;
for (i = 0; i < 2; i++) {
l_42[i] = 0xE971521F00BB6E74LL;
}
if (l_42[1]) {
for (l_34 = (-22); (l_34 != (-14)); l_34 = safe_add_func_uint16_t_u_u(l_34, 8)) {
}
}
}
}
}
int main(void) {
int print_hash_value = 0;
platform_main_begin();
crc32_gentab();
func_1();
transparent_crc(g_31, "g_31", print_hash_value);
transparent_crc(g_41.f0, "g_41.f0", print_hash_value);
transparent_crc(g_41.f1, "g_41.f1", print_hash_value);
transparent_crc(g_41.f2, "g_41.f2", print_hash_value);
transparent_crc(g_41.f3, "g_41.f3", print_hash_value);
platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWltzm8qy_jX4pUsqGHR98ANCKKZKFj6AkpUnagSDNFlcdGCQ4_XrT_WAEMhy4nhnV6199nIpgaFnunu-vg4SLUu-zxi7V8YLZby8o5U45MW9leTPLBt8-_Z8t8ujl_tVXoA4MIjzJMmfebYH8ZxDCDFPWKkQE2w4siLOi5RFciL734qfaMIyAaKgWYkkKnieQR5DkudHiIs8leu1YQgil7dkGA7BhoJmyKRkUoqUAQUrjywU_MSSF6hKVCHiccwKFJEfBU_5X7WAhJ1YUgLPwqSKcN7AUVHFgaPVF1Jf9PpS1peYlmIIPqr-nYYC8kocK4Fiq0SUCpnxIRtCeGDhn2WVwokmFe58DrRgim4o6lJRDWWiNh85hP7fwFGvxtrVmKBaV8_KqzEqesUYanEtmDxleXWZtDLGC8uaTH953CdchJBheJ57Lcsw9cmULBY_4fW20JtAolnaR43Idgwpo1kpva59NlTIig57sw40gh1jGRRVlqFbxHkBFJIcnZmnDGgWQSl4kkDEo0whUwGCFSnPqGDDWo_a78I8TXFywrM3TR8mNNuDopuIV0ZTNgwV3cIHr30VCYMkhYENChmZ3qPtPwQPzqOlkFXtxQwUMlHIBC77uiV0wUoeneOxCaKetheAflm_uKQZF_wvpujLZlaeSQpqvarK4qKtQlZhmXJxUMjqteatzsSEms05WHGbhkIMGkUFK8t6gNPquyqLWMwzFtVDabD6NmVpXrxc5iMF997YL4HykD_LzEQFpC9wLPJ9QdMSDvTEIMuhZQ07dqAnnhdDeGQ0ez7whCHHXS4OIFgpIKQlK4Eej4wWkOUCc9eOQcGSF3SOPIMq4wgVTfhfLIKzbiZQAQnD6KVhmBcyNYm82cGJJvuCZ83WGner_3_CRQwOLDlCynAJ-35MKM_g-fDyKk8eizyqQhZ1s2MvlcHzgWVNBkWMSpqyGwn0nPFk1pyj-hKLGtbbGZ2X3bTfEZOLAytuJWlki0bJ_oSXvOrt-sSKUnqYAdJXFbJIklMK2mioDht_z0skV7sqExUQMlRHXQ5G4wRhngkJQ9xxf-mew8MlPfASaNnUt3J4M7wUskK3GyjEGECaRxj8YNbjJuGj-do7MPPjS8H3BwEKmYVYLIiqTgdE1WQlIqqmN9eRrDzbjMttixdUdivoocPMSBKQzGQtZMWJRcObUv0DL6Uz4J6OtDjv_BySU-mLmB-iPIU9y1hBRV7gLLONjNusXRbxUhR8V0kjYphVJQOeQZlXRVjn0B3PaPGC6TWVBn7m4gB5Ia9t5pLs0jziMQ-lR0ilCoZtRMqFYBGqcuLROWr73UeYZxGvUwcuSploE_GVynBD8RL32mgc5hGDtCoxPgQGFQqiu_yEpLP5slzwEPNAjzG6Li8h4aWEuKtT43oXhSNehgnlKStuI3tbTZ510Tyr2YT4LU2v9Gv1_pCmUKNxxTPKwyplmaBnF1AIdod1jKdUsILTpLxYT5ofRXS39obnPtgeeM7K_2K4FtgePLnOZ3tpLWHxFfwHC0zn6atrf3rw4cFZLy3XA2OzBNPZ-K692PqO64FCiOGB7SmEdINnswRj8xWsP55cy_PAccF-fFrb1hK-GK5rbHzb8mTd3Jjr7dLefMLBYuvDxvFhbT_avrUE38Gn_oPV4fyaDTgreLRc88HY-MbCXtv-Vyl_ZfsblL1yXDDgyXB929yuDReetu6T43WZ4vaXtmeuDfvRWg4B7A1sHLA-WxsfvAdjvb6Cw_mysVzcVQ-LRZfn2jYWa6uWvvkKS9u1TL_ecvfetJfWxjfWOPKeLNOub60_rMenteF-xYHjdpOcs_Gs_9laG9821rA0Ho1PFpph9g4on1zH3LrWI27LWXWYetuF59v-1rfgk-MspcE8y_1sm5an6AtYO57EeetZyGdp-EatGLJc2b6c5Liw2Ho2gt412Ma3XHf75NvOBlPyg_PF-my5YBpbz1pKSzkbCZH_YDnuVxSD2ElDopAvD5b_YLlgb_oo-K5Rg-j5rm36_UWOC77j-j1cYGN9WtufrI1pId1Brl9s3NG85wu2h5PtWqkvxldwtgiXdIGtZ9W3nciR9vpsbcBegbH8bOO26ukdtk-O59mNdzor8LbmQ2O8bmySVbeiKkTnMXZK4BqbpfMYuNuNbz9awUNLr9uot-gXLsik6XQf7Y39aKwvxLYXJHXJClKe8ZQmw0Mb1ArRWVKyPtvVuQH8f_95ZZUzZLqJOTbbDw-Kbt0ix0lOxZvUlMqmqCVeWTUIPH9pBjKGg0fDdB3vltXqziLgWdi1mPy_xLIRQsUzoZNAQFiEeKU7Zbwg44kyXir64kdTZTP3XYCiL0H9vmr-tut2WW_xKedRc26tl--xcO0wCpHUBpoybVfPuwI7XOdhnpXios4xT14aLazlYjbTidrTYs4zARxD8Vv3aXuDp0_ssWsemK7w1gREAQcKWcjPHLrKoR5FKNfwPtszw2-SOEMeeGvVvL8NBjdYoZax7E2RJ5mAdntSR-p5sm4h73r-2JJoXOmDn-kSMEx_xNKSnyVoN5f3nvSHXdfhyngp1buy2WXJZe2P3GP3ItCDZ2jlWSBgd43HayfsaUhmNT69ORKpmeREJqB-V9Xaac_YvbWp16zGVqOR5LNadcPlaocyyUJ7Xp4Fgfe0NvwgqHdkKlOzQ904wdrZfMJ_bUy8hdEMQSrPKMlYONHkZij1QcWgo0mNh3rZRhzjWv09q2YfWqVNPrSMjN5c9jNnkufjI8XDd1CH1hVWJoQHWmAZPmU0lQ06pos4ofsfAFkj3-jY30Ydxs36i8dC7VXHgmcilvsjw-GwfYlJY8EKONDygI2_QsYl4JFWIeM_lLGZYe4m5kXF197YycBXCt2IvG7Jfp9zTUb_hc71o2U6-dCy0ccQGX0MkvHbkHwwcC5-8LcPnOTXI2f989BpAyiLePxLEAZtQCFw2NMfRXGGLWtw-SVUAQDq3kbvPDm3M4q-rJsZRTcb9m90M3DxIIXMUKu6jnfRkF87dMr-W9b6e5rrv_c88spPz8-geYd6fT68ediU-HVeYOQhTeAzLTjdJehXXWI42NGSh4M8jkv5MhBGHaqgu8Ezj8ThmmBlUf_F4S0dcBbksXynOuzPun5BjJ_ma7gGm5vz3jzq3jgwFVUowFO73l5l8kvbCGJVOjKZdSLmTNIkSb9BIfWiyQ2SXpP6Kfvm0eqclveBrjXnoLmmTY3xSF3NyHS2mJL1-vowd9nNPhjVy5TpQhuNp_VXs_I7odF0Kq8TfaR2xb_ioRDjlCdU8ITBPiBEVcYL7XwSQLjIBMW8uQWZNeMqCwOtcyB8x9Sr5HNu7ZJAHzVQLFfWWB-r43UHY-lMKzTeMxchpqIzpUmeLZQKmQ3ItFamQzBBmzcP8cmtnAoAbcFMghHBY3X3lPDj5P3qLPpm7pZ_jYD28KV-t-ZTbUy0laouFhNrOlqvb6dyqYbM5Q0PrU781xLqOfJjnC2s1lOHsXZjAcCuYPTPntQrue12W3NJuMkF7ppAtDNNG8lvwCS5XVTSmAU0igLpFQi6NglEUAVVwwFdeFYvvNbyok9Hs7fqCJorpTy7uOiV74EsewGWt0D-LKE1YzPpmFAR50UaIJtgx_aSWb_Odl-PvCJ2Hf_y-KrTaPy0_rqW1LeyrF6r91MmI20Yqy2fZvRxVlqP1b-kFemxIv8KK73HSn8Pq74dWRbdfEPQb1V-wrJgoiqyjrNcNzFvFTjy4wL3w7eKV-8ro4Tvbr10_Kc4_lMcjV-uAb-vlv60kN4qpR8ppr9cR19VtJ_UUmW6aOvi9dK_QTl8tZ3esFcsr14n_16Dw7vap_8Yq__H2PXf2Pq8p_f5QOvze3qf39n8_M7u53e2P7-z__l3NEDv74Duons9mutzesfutalK5hrRZ_O7w_2MjWfzeaxPdhEdzeN5PJvQ-VjX9Km6G00nozt-T1Sia0SbaWNNV8lwNw3pbjqbTKJ4NBrNmDJSWUp5MkySUzrMi_0dL8uK3U_HM3V-l9AdS0r5A21CMvYMkoiAjZd3xT2uGeyqfamM1ISXorxwEVwk7H6bse9HFgoWtT8B5Fnv13i93wQOHG0Id1WR3B-EOMrXLLI277k4VLthmKcKWaGI5jI4Fvk3FgqFrKRipUJWUvH_CwAA__-SrIPG">