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

    <tr>
        <th>Summary</th>
        <td>
            Finite only math doesn't strip out most of body of powr implementation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            floating-point
      </td>
    </tr>

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

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

<pre>
    With sufficient fast math flags passed to an implementation of OpenCL's powr, the edge case infinite value handling is not pruned out. This should have adequate information to delete everything except the first 4 instructions in this function from the nofpclass(nan inf) attributes on the arguments and return value

```
define hidden noundef nofpclass(nan inf nzero nsub nnorm) float @test_powr(float noundef nofpclass(nan inf) %x, float noundef nofpclass(nan inf) %y) #0 {
entry:
  %i = tail call float @llvm.fabs.f32(float noundef %x)
  %i1 = tail call float @llvm.log2.f32(float noundef %i)
  %i2 = fmul float %i1, %y
  %i3 = tail call noundef nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float noundef %i2)
  %i4 = fcmp olt float %y, 0.000000e+00
  %i5 = select i1 %i4, float 0x7FF0000000000000, float 0.000000e+00
  %i6 = fcmp oeq float %x, 0.000000e+00
  %i7 = select i1 %i6, float %i5, float %i3
  %i8 = fcmp oeq float %y, 0.000000e+00
  %i9 = select i1 %i6, float 0x7FF8000000000000, float 1.000000e+00
  %i10 = select i1 %i8, float %i9, float %i7
  %i11 = fcmp oeq float %x, 1.000000e+00
  %i12 = select i1 %i11, float 1.000000e+00, float %i10
  %i13 = fcmp olt float %x, 0.000000e+00
  %i14 = select i1 %i13, float 0x7FF8000000000000, float %i12
  ret float %i14
}

declare float @llvm.fabs.f32(float) #1
declare float @llvm.log2.f32(float) #1
declare float @llvm.exp2.f32(float) #1
declare float @llvm.trunc.f32(float) #1
declare float @llvm.copysign.f32(float, float) #1

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

```

I think this requires a "simplify demanded fpclass" type of handling, similar to SimplifyDemandedBits
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVk1v4zYQ_TX0ZRBDomRZPvjQrGGgQIEeWqDHgiaHFrsUqSWHSby_vqDkxB-1nVQIpIjhvPdmqMw8EaPZO8Q1WzyzxWYmEnU-rEWI6PrZzqvD-i9DHcSktZEGHYEWkaAX1IG2Yh9hEDGiAvIgHJh-sNijI0HGO_Aafh_QffuN8WWEwb8Gxr8BdQio9ghSRATjtHGGEF6ETQidcMoatwcTwXmCISSHCnyiOfzZmQix88kq6MQLglD4IwkaQXzoJ1LyoNAiIeALhgN1GQ3fJA40UmsTIkENxkUKSeaYCMYBZXSd3LgCOvh-3O68HqQVMTLeupyi04yvQBAFs0uEETJnhyDCPuXUIwinICCl4KakWLFhxS_He1Mcf8ZXhdo4hM4ohQ6cT06hvsUJ7icGDy6mHTjnQ59FaOsFAasLwkh_T_Vtp8UHUDmS8cVbPouvbj5Mz6oAtnyepKOjcGDVMS_IuwywagMkjAUprD3ps_aln2uxi3Nd8f9onMSszoHKh0jW7_k9JHOFxEck3acPkAyfcx_TOttZXXHerMqnRzEKxLfhvkB-pbCeFMp-AG_ppPKQRRbzYryQ8eeiOA9bjGERLUqCXLAMdTrT4m253Rbn19nf7oI2Z1rwx0nL22MtyxtamhPfKPfytToPb--wflKB1WPWsQLt7QqUd0HL4gZqeyl-dfm6vIgvH5XwAS-_wVuWdyVfKCgvoao7X9Qnp1jWtyRUX6volMM7XEA6X6-PzW-5Oe-FCqUVAT9pE8fOUz6KuW4IX4m5_h_9SgyF5OT_DZJ-OOQxexl3rNslwHQ_my1Ty602ue1CnyINwe8DxjwcdcA8ngLKFGL-LR6cHDvNq3EKXo21xynUY-_DIbcv73BkfD-IS6ryg8r53AJ3Qn4_EV3CxwFlsoLEzuLXuG4OwOn-a56-7vs0gwP-SCZgBAGM85g9hdEHUNgLp1DBRzfmQIcBs8t4dw25rNH0xoqQfcAfx9jNMfTZUJypdaVW1UrMcF02K97UZV03s27dlkpyUaxU3TRCiYXeLXkp26VslGxEI2dmzQteFS0vy7Ys6mZetcu2VFqvdvVCNpqzusBeGDsfj92H_czEmHDd1O2ymFmxQxtHp8V5b7JrevIDmd78HI0L45zxb4zz8bswbv80eOMoLy82s7DOoE-7tI_5uzKR4omGDFlcbycf5Z09TAZNeYyO8SVBpGCGbKKg95FyxbK3y89sGq5s2ywFu-6IhpinO98yvt0b6tJuLn3P-DbTHh9PQ_D_oCTGt2OqkfHtmO2_AQAA__-H9Cg-">