<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61268>61268</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
WRONG code: likely instcombine of multiple i1:s.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
nikic,
rotateright
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JonPsson
</td>
</tr>
</table>
<pre>
This program should print 0:
```
int printf(const char *, ...);
long a = 0, d = -1L, h = 0;
char b = 0, c = 0;
unsigned char g = 0;
int ****e = 0;
int *****f = &e;
int main() {
long i = 0;
for (g = 4; g; g++) {
c = 0 >= a;
// -1 int64_max 1 0
i = d > (9223372036854775807 - c) ? : (d + c);
if (i) {
char *j = &b;
// 0 int64_max -1
h = a > 9223372036854775807 - d; // OF
*j = h;
*f = 0;
}
}
printf("%d\n", b);
}
```
I think this program is well defined,as 'i' will always be 0, and the overflowing subtract in the inner clause will never happen.
clang -O0 -march=z13 wrong0.i -o a.out ; ./a.out
0
clang -O1 -march=z13 wrong0.i -o a.out ; ./a.out
1
I have found this transformation by InstCombine which I think look suspicious:
```
for.body: ; preds = %for.cond
%1 = load i64, ptr @a, align 8, !tbaa !7
%cmp = icmp sge i64 0, %1
%C = zext i1 %cmp to i32
%D = load i64, ptr @d, align 8, !tbaa !7
%MAX_min_C = sub nuw nsw i64 9223372036854775807, %C
%CC_DGT = icmp sgt i64 %D, %MAX_min_C
%BOOL_DGT = zext i32 %CC_DGT to i64
%add = add nsw i64 %D, %C
%cond = select i1 %CC_DGT, i64 %BOOL_DGT, i64 %add
%tobool7 = icmp ne i64 %cond, 0
br i1 %tobool7, label %enter, label %for.inc
*** IR Dump After InstCombinePass on main ***
for.body: ; preds = %for.cond
%A = load i64, ptr @a, align 8, !tbaa !7
%C_CC = icmp slt i64 %A, 1
%D = load i64, ptr @d, align 8, !tbaa !7
%C_BOOL = sext i1 %C_CC to i64
%D_NE_MAX = icmp ne i64 %D, 9223372036854775807
%NOT_C = xor i1 %C_CC, true
%NOT_C_or_D_NE_MAX = select i1 %NOT_C, i1 true, i1 %D_NE_MAX
%D_EQ_C = icmp eq i64 %D, %C_BOOL
%tobool = select i1 %NOT_C_or_D_NE_MAX, i1 %D_EQ_C, i1 false
br i1 %tobool, label %for.inc, label %enter
```
Before instcombine, it all makes sense, but then it seems that something has gone wrong: %tobool will be false (D is not equal to C), and as the branch targets have been swapped, the inner clause will now be entered, which is wrong.
I bisected this to b751da4 (HEAD, refs/bisect/bad) "[InstCombine] Handle integer extension in `select` patterns using the condition as value", which might be related as it indeed changes InstCombine.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV1tzmzwT_jXyzY49IGxDLnzhQ9L2m7bp1-nM2zuPAAFqhORKIk76699ZAY7I4T17PFhoT89qH2llZq2oFecbstoRSpW4EwWhlNA9odRoxxw3om4czq0OM9a5RpvN_7T6Yq1Ws1yXj5tvjbBwMro2rAXb6E6WcDJCOYhIsiXRgUTjcx0NX_-KKl6xIjQrtLIOioYZIHRL6B4WiwWhVyTZ9dpSqxoYkOQAEYpLP5zHH_GlGeZHZe8nf1Iunsk75fMu-4D1MykC8yCGL_8TOaHbyqsQuuYTrZYJRWhG6BWQdJgH8KmIZ04BKo25Zz2aJUl2UPcPuvPfiQ8YcwKSXOOABZ4AgNAbQm8A5rF_BaHcenls2QMME_iJ4Mmix4Oreo0orihNkpRGyTpbLdN0lUUpzKHwKJIbIMkWtUogdOdnJ9FFhULxAjJcCvxjXK98CvuCOwoQj595HGr2NWce8OtoS1y-weHtzZjrJXrzIvRQxmgiIOlhfAmGF-L67bIqyWqv-p0DebgcF5NXt0D__ACuEeoOn087SVg4cymh5JVQvCR0zywQmgpCUzgLKYHJM3u0kPOe40yV4BoO-p6bSuqzUDXYLneGFQ6E8jKhFDdQSNZZ3jtR_J4baNjpxNUCQlSFZKqG-W0E85aZoiHJ4VecwNloVUcLAXMNbKE7B7jKC0Jv_FtvG01dxP_ARTxdoYbdc6h055MUFpxhylbatMwJrSB_hA_Kur1uc6E4nBtRNDCuq9T6DmxnT6IQurN_fCpV2izwXPMMT3ZwMry0A1tXKCy0KuGycQhdxV4qNStBrJdYipMzQJYR82WRolaQ4ZDQ2OWM4W8a2BftyXsQOLA1Ry99SdF5oLj3ar_4gwMRj5ZOg0hooHV4C0751-B82n4_tkId-2i2y0F1Z1D27HG9stMGpPsQ6f54ePctzMp5a4Q3qF_CXLbland7-_Fi16eZ0MAdprpeBmFY2XcB_B0BBiFCRL5qPiEueTEuYO8Y1QfTEUIwxcoy8ON0rrVMn1JTfFTEEGgXjeq5GcIMRiiULOcS57hy3ExmkFxCFRNujv0FPnyFQ9eeYFs5bkKuf2HWgla-1QRdKXDy9xm9_ZeM3h_3-6D48lJ839jj_5Cs-yNWbCjsZV_4-C_Ycjh-vj5-2n5_rXaeMq9x-8n88-23YU88aBMEQktnOv5c9ajNcRJywjyv4lkW99b9MIA5QX79_2OwovznC6r7dXjB0zfihtDCwBhleK-YtGNKz3j8KmlfUvvtfrfjlTbYjKwrehL7oA6YlNCyO27BcmX9bN457FwKxZbz1oJrmAOrW46Hew0Ns1BrPPOxq_T3kjF73-Fy3ieDV5IDtlWlHfCfHZNIkT0266F7MuubZG6YKhpwzNTc2b7z5JwrsGdsk56ZbzRTfcZwPv9er29E2MsR3WLa03JheeH42NE05OkqLhkWNnt_vfW1NbyyhN70qjhgpb9W4YV8FxwDZHWA90yVEnE5XnMD_MFxZbE74smwjnoekHUEJ-YcN8pCZ3EJMRk8A4RvpczCPZPISPqUQYv_AjA3wyVDyMxiRYQqeX-LVjW34bE0STV8zspNUl4lV2zGN_E6zZIoonE8azYJi6sszdJ8XSZZdLViNFst45zHaZyv6DKZiQ2NaBIlURZnSRTHi2XE1nmyjnO2qpIkSsky4i0TciHlfbvQpp4Jazu-Wcd0nc08Pe3wTwc1SLKdUND_xTEbFM3zrrZkGUlhnX1y54STfPPb19vP76DQJUe2SXHH5WNIZtAVtJ104oTFiEmytYtZZ-Smce7kbx_-SloL13T5otAtoTceT_8zPxn9oy-2h4_l9xn8HgAA__-Wssc0">