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

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorizer] If Conversion example doesn't work with floating-point types
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          graham-yiu
      </td>
    </tr>
</table>

<pre>
    The example from [Vectorizers/if-conversion](https://llvm.org/docs/Vectorizers.html#if-conversion) when converted to floating point types:
```
float foo(float *A, float *B, int n) {
  float sum = 0;
  for (int i = 0; i < n; ++i)
    if (A[i] > B[i])
      sum += A[i] + 5.0;
  return sum;
}
```
`clang -fvectorize -fno-slp-vectorize -O3 -ffast-math -S -c if_conv.c`
Doesn't get vectorized even when -ffast-math enabled.  From what I can see, the loop body in the IR is slightly different from the integer version, leading to loop vectorizer not recognizing it as a candidate:
```
for.body: ; preds = %for.body.preheader, %for.body
  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
  %sum.014 = phi float [ 0.000000e+00, %for.body.preheader ], [ %sum.1, %for.body ]
 %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv
  %0 = load float, ptr %arrayidx, align 4, !tbaa !5
  %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv
  %1 = load float, ptr %arrayidx2, align 4, !tbaa !5
  %cmp3 = fcmp fast ogt float %0, %1
  %add = fadd fast float %sum.014, 5.000000e+00
  %add6 = fadd fast float %add, %0
  %sum.1 = select nsz i1 %cmp3, float %add6, float %sum.014
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %for.cond.cleanup.loopexit, label %for.body, !llvm.loop !9
}
```
Trace:
```
LV: Checking a loop in 'foo' from if_conv.c
LV: Loop hints: force=? width=0 interleave=0
LV: Found a loop: for.body
LV: Found an induction variable.
LV: Not vectorizing: Found an unidentified PHI   %sum.014 = phi float [ 0.000000e+00, %for.body.preheader ], [ %sum.1, %for.body ]
LV: Interleaving disabled by the pass manager
LV: Can't vectorize the instructions or CFG
LV: Not vectorizing: Cannot prove legality.
```
compared to this loop body for integer types:
```
for.body:                                         ; preds = %for.body.preheader, %for.body
  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
  %sum.014 = phi i32 [ 0, %for.body.preheader ], [ %sum.1, %for.body ]
  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv
  %0 = load i32, ptr %arrayidx, align 4, !tbaa !11
  %arrayidx2 = getelementptr inbounds i32, ptr %B, i64 %indvars.iv
  %1 = load i32, ptr %arrayidx2, align 4, !tbaa !11
 %cmp3 = icmp sgt i32 %0, %1
  %add = add nsw i32 %0, 5
  %add6 = select i1 %cmp3, i32 %add, i32 0
  %sum.1 = add nsw i32 %add6, %sum.014
 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %for.cond.cleanup.loopexit, label %for.body, !llvm.loop !13
}
```
Trace:
```
LV: Checking a loop in 'foo_int' from if_conv.c
LV: Loop hints: force=? width=0 interleave=0
LV: Found a loop: for.body
LV: Found an induction variable.
LV: We can vectorize this loop!
``` # #
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkV0tv4zgS_jX0pWBBoiwnPvjgx3o3QGN3sdvoOTZosSRxWiY1JGUn_esHRT0sJ-l0ejAYzGCMBJbIerGq-H0u4ZwqNeKaZVuW7Wei9ZWx69KKSpzmT6qdHY18Wn-sEPBRnJoaobDmBCzbfsLcG6u-onWMH1Qxz40-o3XKaJbtGb-vvG8cSzeMHxg_1PX5FBlbMn6QJieViYGo8qea8fTWCl_BpUIN3ZJHCd5AURvhlS6hMUp78E8NBifxhi3j_i_eBCkojGH8vntmfLNhfAfj25beyERwxO62LN5Av-3aE7B0DzFL-2VjgfF7ElfjTnjcgaZHxreMbxXjqyAPoApS2LBsq1i2B5b-A7b9y1UIOk98SyavsnwLWTT6tuhbq0myW2F3-2enZcs4r4UuYV6ch6TCvNBm7upmPln6TwrzohDOz0_CVzD_P8xzUMVnynCUd8b2Bp1m_M5DiR5GZQl4Rt0VZGoDtTjWKCOAAzXGpRIeHiAXGhwipdhXCLUxDVAngdJh4eF_oBy4WpWVr59AqqJAi9p33UUSSnss0cLYDDuoUUiqvDedwTE2C9p4sJibUquvJKI8CAeC4pBKCo-vtIixEYXE0g1QBRuL0oXaMp4Nm1FjsUIh0VIAk41QGcYzpeVZWBepc1BtKgVquaD7AfEzlastCE2wC1I3NiKNj_6ZWhDuvbn2FMXJYnTVNzM5i-LwQca38bs9k73kG_4Yz4S14knJx-CvRI81nlD7xltQ-mhaLV0XApmgVcazcMlCCqYHGw4QB1O1EfKF4uCMlkStSg2LLrLEH4Wg72ywMojyHwls-2ZgyfcD4--ILD81abBU5KcG6JaAKf0IOtlQmWQ8ipSdPD0E-VG2LzZpZLfVveouv6UspOxdxdPm6Y7psMbcg3ZfQSVD2FNwDKZvFoZgXrR9aNlglYLQ7QW0u7ySZ76D8dD4qHxutIzo2pKqomzhLy_VphfioiRG3qomyk2rfTB2tP0JpiYDVogj1kNbh428RqHbJiLoIOkXUuFad3UNZBUwhvFk9SrmfrQifwVVPnwiPNlVmH8hHBIdUikNjN8FOrrrIO4KuoPOBxKslPZEZ0Q4ZH7P0gNclPQVS_dxAEVbozjT1tXdgTq-99UrDyB1I6BBadnmXhkNZ2EVIXc0Cv3bXOFe6fJGr9VKovaqUCjhv_96gD8ajroQH4bzU26lcoF64PgUGKMRzsFJaFGivVZCdFx2JcGOXJy3XSIcGAu7wz_fSsNOaOrUxpozQo2lqJV_ip5VPjenRtjuR4qvlJuQHv16GPjsWz9YJmz03s9flbVUyn_M1Vs09V6eUin_LSx1q_Z9jkqSHyKpW_PvpqjXo3qDoLqwpgQVINeVvqvGG8wUYJ0gfSKXvaCgnlJu6aRX6bmI3l4ho2f2B-a55Zy_GeUk6e_IOZ-V9n9m3vkJw7gwRegePRlPpkcFxlP6n8l1KlfpSsxwndwtVvcLHqfLWbWOV4KvsjhN5XHF78VCLBbHleBFtswSzu-PM7XmMc_iZZImqyTNllFOGscY76VcFHlxZIsYT0LV0TCuzpRzLa6TxSJZZLNQPBeGZc41XiDsMs5pdrZrUpof29KxRVwr593VjFe-DlM2pfs6-dK491DAbhx6xzFbjmPYxdgvcFG-Gmff-WT2nbW2Xt-O2qXyVXuMcnPq5-7-a95Y8zPmnsZ1ipuG8P5g5zX_NQAA___MsdLt">