<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/125374>125374</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorize] Miscompilation at Os
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            loopoptim,
            vectorizers
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          dtcxzyw
      </td>
    </tr>
</table>

<pre>
    Reproducer: https://alive2.llvm.org/ce/z/ygvCK5
```
; bin/opt -passes=loop-vectorize 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"

define i32 @main() {
entry:
  br label %for.body.i.i

for.body.i.i:                                     ; preds = %for.body.i.i, %entry
  %indvars.iv.i.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i.i, %for.body.i.i ]
  %conv678.i.i = phi i8 [ 1, %entry ], [ %add.i.i.i, %for.body.i.i ]
  %add.i.i.i = add i8 0, %conv678.i.i
 %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1
  %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i

o.exit:                                           ; preds = %for.body.i.i
  %conv6.i.i = zext i8 %add.i.i.i to i32
  ret i32 %conv6.i.i
}
```
Before:
```
Entering function main
  br label %for.body.i.i jump to %for.body.i.i
    phi i64 %indvars.iv.i.i -> i64 0
 phi i8 %conv678.i.i -> i8 1
  %add.i.i.i = add i8 0, %conv678.i.i -> i8 1
 %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1 -> i64 1
 %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1 -> F
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i jump to %for.body.i.i
 phi i64 %indvars.iv.i.i -> i64 1
    phi i8 %conv678.i.i -> i8 1
 %add.i.i.i = add i8 0, %conv678.i.i -> i8 1
  %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1 -> i64 2
  %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1 -> T
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i jump to %o.exit
  %conv6.i.i = zext i8 %add.i.i.i to i32 -> i32 1
  ret i32 %conv6.i.i
Exiting function main
```
After:
```
define i32 @main() {
entry:
  br i1 false, label %scalar.ph, label %vector.ph

vector.ph:                                        ; preds = %entry
  br label %vector.body

vector.body: ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <2 x i8> [ <i8 1, i8 0>, %vector.ph ], [ splat (i8 1), %vector.body ]
  %index.next = add nuw i64 %index, 2
  br i1 true, label %middle.block, label %vector.body, !llvm.loop !0

middle.block:                                     ; preds = %vector.body
  %0 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> splat (i8 1))
  br i1 true, label %o.exit, label %scalar.ph

scalar.ph: ; preds = %entry, %middle.block
  %bc.resume.val = phi i64 [ 2, %middle.block ], [ 0, %entry ]
  %bc.merge.rdx = phi i8 [ %0, %middle.block ], [ 1, %entry ]
  br label %for.body.i.i

for.body.i.i: ; preds = %scalar.ph, %for.body.i.i
 %indvars.iv.i.i = phi i64 [ %bc.resume.val, %scalar.ph ], [ %indvars.iv.next.i.i, %for.body.i.i ]
  %conv678.i.i = phi i8 [ %bc.merge.rdx, %scalar.ph ], [ %add.i.i.i, %for.body.i.i ]
  %add.i.i.i = add i8 0, %conv678.i.i
  %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1
 %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i, !llvm.loop !3

o.exit:                                           ; preds = %middle.block, %for.body.i.i
  %add.i.i.i.lcssa = phi i8 [ %add.i.i.i, %for.body.i.i ], [ %0, %middle.block ]
  %conv6.i.i = zext i8 %add.i.i.i.lcssa to i32
  ret i32 %conv6.i.i
}
```
```
Entering function main
  br i1 false, label %scalar.ph, label %vector.ph jump to %vector.ph
 br label %vector.body jump to %vector.body
    phi i64 %index -> i64 0
 phi <2 x i8> %vec.phi -> { i8 1, i8 0 }
  %index.next = add nuw i64 %index, 2 -> i64 2
  br i1 true, label %middle.block, label %vector.body, !llvm.loop !0 jump to %middle.block
  %0 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> splat (i8 1)) -> i8 2
  br i1 true, label %o.exit, label %scalar.ph jump to %o.exit
    phi i8 %add.i.i.i.lcssa -> i8 2
  %conv6.i.i = zext i8 %add.i.i.i.lcssa to i32 -> i32 2
  ret i32 %conv6.i.i
Exiting function main
```
llvm version: 5c3c0a8cec9205efba78583bd0b8a646270968a1
cc @fhahn 
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWF1vqzgT_jXOjQUydvjIRS5I09y872qlPau9XRnjJD4HMGtMDu2vX9kQPhKapjmttFWVxmY-PDPPeJ5Cq0ocCs7XwN8Af7ugtT5KtU41a15ffi4Smb6s_-ClkmnNuAIkhketywqQGOAdwDuaiRPHbpadcleqA8A7xgHevQK8ezmcnv7nAxSDAHW_KAZkAxNRALyTpYZOSauKV4BsMylL58SZlkq8cqi48Ze6WQadbwDFmqoD1zClmmb0RdYaArKFAGPu5IDE3ClxiACJCbYfZulNl-ZbsLQfjui_eDgCJPZw5Owj1H0r7FZwVg-WzjcjhvFwDq1EmfHzGZoo-DtYOnXxo5A_CycTRd04h6JuVQCKU74XBYeCYAiWKKcm_gjgFQThBqCYF1q9mIyiGMJEwYwmPIMA-3upXFMBV7iitTTZITG858ekvFQ8rbrzTs3iJ7PVHsH4B9gXRXqiqnLFyUhYrfIooAiWEPgbiMY6EPhbu_Y3F6oFb_TIw9ipVeqcMVmcgjCaeoqsPe-GI5qmRuVd872cNU7T1Bg_RzDybeTnzz8omvgvs2MseWdnvBGaySJ1CzmoCpaXkP_znnqioPDmjBiRHhHSNY8nW9cg6YTuhMc9IBnXqg_slTfalmqcZS0NzK2C4rqF_EjRHDDcXtwJG76XircNMN5_LjRXojjAfV0wLWQBbevc6hL4vc5Lc4i5COAA4yuQO4A820fGcQ_CKTxbmWio973gmmo-DLPhkGc7DwKuNbT7PNzdSvsdOffG5bmd9oez_hlpx7_Y6K2lP78m753oR1u1i47gLk1vdO1zI_RcK477Nd5rSxEutj84_YQH9zSr-CToitGMKrc8TnZbvmB27b03LO-_-q7uvWESju-YzrTJ-8SX3SDxtZnx8xaZ48Oe0cibN6drL349YXlj4TsVNJ7Gg-_EmWvsnu0D8oRhA0Vkym1tkSfbG_ip7R_yfMtzVWZUQ4CjVmd12_lwyL6_ivrnqDN4YwzgUc21qqclz0WaZtxNMsl-zFV9SK1n2adhkGaB2gJN1B9lStOy29CQfcZoltmGWiLrvBNsaatreuyERWRwPk77dRJXtzIw0_xDH9ggh-UcBlsot4WapKMLJWGu4lWdc_dEsysg4hnNMSKuaeBgNufqwF2VNpeUziTwHbvXrO_jtPgqFZP7Y2ZIvc96L_PVGeoNfyURvkjqO66_ghr_Gjf-T1DjmauCfCJfvryu3qDQfdLdjFUVnan0u-UbKv1mK91NArpTPMLa72fqj0z0MbOZTM43pvKMfH9rX_J-3szQ_el8HOanlQThBo6HJWzT8aFZd0kjP3vsjTMwd9t_8uDq2fXNaG6NsDfI6_jfgEucTn1-HOED2b0J9nvIrskePHFVCVmYq8NnhCEaMc5WGPl8n9Aw8iOSpCiJaLAMcIhWQUTNjcaYSf_-SI8FXKRrkq7Iii742gtJtAyQF-LFcZ1GPvKDkCR-kvD9Hi0R50HEaEjSgAURX4g1RthHGGHkkcDDLk78CKcRTpdpwvwwBEvEcyqy_uXcQlRVzdce9km4XNiCVPa9H8a5qJjMS5FREy_AZvgDjA24ZKlF3u_0r-hUZfb87UKtjX0nqQ-VAZWodDV41EJn9t3i_6Us_zrrAn8Lf5t4hFTD36tFrbL19P3iQehjnbhM5gDvjNnuj1Mq-Z0zDfDORlUBvOsCO63xvwEAAP__-0rxxg">