<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140444>140444</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LoopFullUnroll] Miscompilation at O3
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
loopoptim,
generated by fuzzer
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dtcxzyw
</td>
</tr>
</table>
<pre>
Reproducer:
```
; bin/opt -passes=loop-unroll-full reduced.ll -S
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@g_479 = global i8 -1
@crc32_tab = global [256 x i32] zeroinitializer
@.str.8 = constant [15 x i8] c"checksum = %X\0A\00"
define i32 @main() {
entry:
br label %for.cond1.preheader.i
for.cond1.preheader.i: ; preds = %for.cond1.preheader.i, %entry
%indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.cond1.preheader.i ]
%0 = and i64 %indvars.iv.i, 20
%tobool.not.4.not.i = icmp eq i64 %0, 16
%xor.5.i = select i1 %tobool.not.4.not.i, i32 0, i32 1
%arrayidx.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %indvars.iv.i
store i32 %xor.5.i, ptr %arrayidx.i, align 4
%indvars.iv.next.i = add i64 %indvars.iv.i, 1
%exitcond.not.i = icmp eq i64 %indvars.iv.next.i, 256
br i1 %exitcond.not.i, label %lbl_1516.us.us.i.i, label %for.cond1.preheader.i
lbl_1516.us.us.i.i: ; preds = %lbl_1587.us.us.i.i, %for.cond1.preheader.i
%conv134690.us.us.i.i = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ], [ 0, %for.cond1.preheader.i ]
%l_1485.0.us.us.i.i = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ], [ -14340, %for.cond1.preheader.i ]
%inc130.us.us.i.i = add i16 %l_1485.0.us.us.i.i, 1
%tobool132.not.us.us.i.i = icmp eq i8 %conv134690.us.us.i.i, 0
br i1 %tobool132.not.us.us.i.i, label %lbl_1587.us.us.i.i, label %land.rhs133.us.us.i.i
land.rhs133.us.us.i.i: ; preds = %lbl_1516.us.us.i.i
store i8 25, ptr @g_479, align 1
br label %lbl_1587.us.us.i.i
lbl_1587.us.us.i.i: ; preds = %land.rhs133.us.us.i.i, %lbl_1516.us.us.i.i
%tobool293.not.not.us.us.i.i = icmp eq i16 %l_1485.0.us.us.i.i, 0
%spec.select.i.i = select i1 %tobool293.not.not.us.us.i.i, i8 1, i8 0
br i1 %tobool293.not.not.us.us.i.i, label %func_134.exit, label %lbl_1516.us.us.i.i
func_134.exit: ; preds = %lbl_1587.us.us.i.i
%1 = load i8, ptr @g_479, align 1
%idxprom.i.i.i = zext i8 %1 to i64
%arrayidx.i.i.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %idxprom.i.i.i
%2 = load i32, ptr %arrayidx.i.i.i, align 4
%call.i = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %2)
ret i32 0
}
declare i32 @printf(ptr, ...)
```
```
; ModuleID = 'reduced.ll'
source_filename = "reduced.ll"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@g_479 = global i8 -1
@crc32_tab = global [256 x i32] zeroinitializer
@.str.8 = constant [15 x i8] c"checksum = %X\0A\00"
define i32 @main() {
entry:
br label %for.cond1.preheader.i
for.cond1.preheader.i: ; preds = %for.cond1.preheader.i, %entry
%indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.cond1.preheader.i ]
%0 = and i64 %indvars.iv.i, 20
%tobool.not.4.not.i = icmp eq i64 %0, 16
%xor.5.i = select i1 %tobool.not.4.not.i, i32 0, i32 1
%arrayidx.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %indvars.iv.i
store i32 %xor.5.i, ptr %arrayidx.i, align 4
%indvars.iv.next.i = add i64 %indvars.iv.i, 1
%exitcond.not.i = icmp eq i64 %indvars.iv.next.i, 256
br i1 %exitcond.not.i, label %lbl_1516.us.us.i.i.preheader, label %for.cond1.preheader.i
lbl_1516.us.us.i.i.preheader: ; preds = %for.cond1.preheader.i
br label %lbl_1516.us.us.i.i
lbl_1516.us.us.i.i: ; preds = %lbl_1516.us.us.i.i.preheader, %lbl_1587.us.us.i.i
%conv134690.us.us.i.i = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ], [ 0, %lbl_1516.us.us.i.i.preheader ]
%l_1485.0.us.us.i.i = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ], [ -14340, %lbl_1516.us.us.i.i.preheader ]
%inc130.us.us.i.i = add nsw i16 %l_1485.0.us.us.i.i, 1
%tobool132.not.us.us.i.i = icmp eq i8 %conv134690.us.us.i.i, 0
br i1 %tobool132.not.us.us.i.i, label %lbl_1587.us.us.i.i, label %land.rhs133.us.us.i.i
land.rhs133.us.us.i.i: ; preds = %lbl_1516.us.us.i.i
store i8 25, ptr @g_479, align 1
br label %lbl_1587.us.us.i.i
lbl_1587.us.us.i.i: ; preds = %land.rhs133.us.us.i.i, %lbl_1516.us.us.i.i
%tobool293.not.not.us.us.i.i = icmp eq i16 %l_1485.0.us.us.i.i, -1
%spec.select.i.i = select i1 %tobool293.not.not.us.us.i.i, i8 1, i8 0
br i1 %tobool293.not.not.us.us.i.i, label %func_134.exit.peel.begin, label %lbl_1516.us.us.i.i, !llvm.loop !0
func_134.exit.peel.begin: ; preds = %lbl_1587.us.us.i.i
%spec.select.i.i.lcssa = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ]
%inc130.us.us.i.i.lcssa = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ]
br label %lbl_1516.us.us.i.i.peel
lbl_1516.us.us.i.i.peel: ; preds = %func_134.exit.peel.begin
%inc130.us.us.i.i.peel = add i16 %inc130.us.us.i.i.lcssa, 1
%tobool132.not.us.us.i.i.peel = icmp eq i8 %spec.select.i.i.lcssa, 0
br i1 %tobool132.not.us.us.i.i.peel, label %lbl_1587.us.us.i.i.peel, label %land.rhs133.us.us.i.i.peel
land.rhs133.us.us.i.i.peel: ; preds = %lbl_1516.us.us.i.i.peel
store i8 25, ptr @g_479, align 1
br label %lbl_1587.us.us.i.i.peel
lbl_1587.us.us.i.i.peel: ; preds = %land.rhs133.us.us.i.i.peel, %lbl_1516.us.us.i.i.peel
%tobool293.not.not.us.us.i.i.peel = icmp eq i16 %inc130.us.us.i.i.lcssa, 0
%spec.select.i.i.peel = select i1 %tobool293.not.not.us.us.i.i.peel, i8 1, i8 0
br i1 %tobool293.not.not.us.us.i.i.peel, label %func_134.exit.peel.next, label %func_134.exit.peel.next
func_134.exit.peel.next: ; preds = %lbl_1587.us.us.i.i.peel, %lbl_1587.us.us.i.i.peel
br label %lbl_1516.us.us.i.i.peel.next
lbl_1516.us.us.i.i.peel.next: ; preds = %func_134.exit.peel.next
br label %func_134.exit
func_134.exit: ; preds = %lbl_1516.us.us.i.i.peel.next
%1 = load i8, ptr @g_479, align 1
%idxprom.i.i.i = zext i8 %1 to i64
%arrayidx.i.i.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %idxprom.i.i.i
%2 = load i32, ptr %arrayidx.i.i.i, align 4
%call.i = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %2)
ret i32 0
}
declare i32 @printf(ptr, ...)
!0 = distinct !{!0, !1}
!1 = !{!"llvm.loop.peeled.count", i32 1}
```
Before:
```
checksum = 1
```
After:
```
checksum = 0
```
llvm version: 3ccb15d6caf57f2a866d496ada2fb52d14b179d2
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWV2Ps7gV_jXOjQWyzWcucpHZaKRKXVXqqlLvRsaYxF0HU2Pmzcyvr2wIIcRksm9H7Wg1o4gB7POc4_NtQ9tW7GvONyB5AsluRTtzUHpTGnZ6f_uxKlT5tvk7b7QqO8Y1iLYAbUGKhh_agugJFqIG5Fk1BgYNbVvegmgnlWqCrtZKyqDqpISaW4QylBIGvwG0NVTvuYElNVTSN9UZCKIdBITw4AiiLQ8akiEQbSPiLvYRXz_auzR2l0CMN5jkINpikgdVjoa72r1Kz-RpHPxmpxFykcNo0Uh-luGUpy9pHHT177X6UQdS1N0p2NddT2J_Mdq_xNnaEeylKqiEIocB7seYZhF5MbSYjoPkiSQpPEEREZDs4DvXStTCCCrFO9c9ZdgaHeaOjKm6NbQ2lhAnli63ZAwQwg6c_d52x0He5J8g-QVt7QWNIpa8EjW3zCCI0ZFaI-WArCHIngDa8trot96eEBYaSlpwabEqpUOm6hKHjeYHTkuuQ9FD-oeiLbzzZx2k0bxsz7L6QcgvdqwXykoESCLq8pXqNhSvoXDEzUFAkcZWHxBNKSBIdu45eZoR1vxkRnQvZ0c7cESODa3Lns21CBaEoPNUowqlZFgrE8bu2oso2LGB_N9neiclTs9EJ6XDZJjZcsmZgQL70SyhNR063-AzCNWavonyNODsueGSH3ltGqPnPmaJ3euJSzrANB6QPeu0fFqj9OA7o9gj2FQG-5JKsa9h7LFbr_5eq-WiVt3SrC1Pwlj7LOvTa1mSpGcn7rV5jWOnjM4tC_mCE5yGXWt_YjZ8x_c9lPcd3-f7PUieXbO_w9gplKn6FUdxukYXuktA5Ge3bxvOwt6tJsi3LKfRgh4NDfmC4zwJvRLg9BJ5DEfoZnX3ZQhwHMUPCzJncXEuK4ZP0KmL9YGGI-J84xpk9LV8SekWCV372gKgx-nmVr8M07oM9aHFUTSZ0Tudd-gPJlyP505CPIckmaQJV9UuQY1vyoNnMZP4uHr_E_HhXe_UiebLGE1A1pEzwR273nMQNIDNgmgpVXu5uYSaQzz893rKIuElB3U1e8FRHNo09lHy6svyFcWHWn84NQ0Rh90UqWhpO5D7rmIDtDw1Wh0twqC_d34yQ1RhaJRN5rfFbJz9OQVtKsSZGZksJCLecna2xqykMSrlIJ69HQpj3hhtJ4dh6PqqGDVa1KbqR-DYzZ1LuBUBkLUD1dwM9R1tQbY7t2xMUj32bFO0C595Az5rxn9VZSf5X3aDXbNL3w1IBtC2VZ1m_KUSktf0OHa802nkuz3_bs-_2_Pv9vwLtOcXX_j5Rn2CsRAMD0aBvxe6LcifuFdY1sVizf7f7Bjuiff_2Dg8Ks_i_qFufzywh_gzbSK-1E7hE_YCn7YZCEZTf7HtQNhwLsOC72238OGxBiBYytdjKJVq7APybBemiMsu4dsWzFQTSta29L9NMgtBOgf_2cTxcQJ3-lguJHbQp6ZFnS4tyE6ZH134V_1I6rnAXecfr40eT0D9eu9nIc8cX-BO9bo8_lhSOmP9kcx0PzHdWP128OEUNSrkvuz3U4DHoB_5yMIJxgXp0bw1LuCnktetP3hiw3aHD81ZSlhu8LF8dWsPn-UfygsTme7OeDBDDGiz_d3VYc5nn-8sLun7pOdrnvSgrS3cTp5StEbUzNhSDrInV9D7Ko8HXILxYO5hAiBk7ACcuXkZMtXVBhBy2bn2xJNzpCdeKc1vP_ZenWvg2eC2Mr4PxFc08wMrKxx85boVyrUfEWMFTsqU0SrJKkLzNC3jdUpLSqoiISWOC5ytSwLQdlVuonIdremKb3AWZ0myTlG2OmyqKOMEcxbFVZKiPKnKPCJZQvKUMZSX1UpsCCIJSnCO1jgiWViUjBYZZRVa5-syQyBG_EiFDJ3ulN6vRNt2fINjFMfxyoVq6z6YE3IULVPHRkhq7BqcWq3WlWpUY8RxfLPnNdfU8BIWb7Dq3t_tLs46-kpvLJ-g6PYtiJEUrWkvnI0w0n2c_6tSzXMn5T_cN3WQ7OCvV6whNfBv0arTcnMwpmmtJcgzIM97YQ5dETJ1BOTZ4g7_gkarf3FmAHl2y2sBeR5W-Loh_wkAAP__GBsyoQ">