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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: Eliminate redundant scalar multiplication by reusing vector multiplication results
        </td>
    </tr>

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

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

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

<pre>
    ```
define i1 @src(ptr %arg0, ptr %arg1) {
 %v0 = load <2 x float>, ptr %arg1, align 4
  %v1 = getelementptr inbounds nuw i8, ptr %arg1, i64 8
  %v2 = load float, ptr %v1, align 4
  %v3 = load <2 x float>, ptr %arg0, align 4
  %v4 = getelementptr inbounds nuw i8, ptr %arg0, i64 8
  %v5 = load float, ptr %v4, align 4
  %v6 = fmul <2 x float> %v0, %v3
  %v7 = extractelement <2 x float> %v6, i64 0
  %v8 = extractelement <2 x float> %v0, i64 1
  %v9 = extractelement <2 x float> %v3, i64 1
  %v10 = fmul float %v8, %v9
  %v11 = fadd float %v7, %v10
 %v12 = fmul float %v2, %v5
  %v13 = fadd float %v12, %v11
  %v14 = fcmp olt float %v13, 0.000000e+00
  ret i1 %v14
}

define i1 @tgt(ptr %arg0, ptr %arg1) {
  %v0 = load <2 x float>, ptr %arg1, align 4
  %v1 = getelementptr inbounds nuw i8, ptr %arg1, i64 8
  %v2 = load float, ptr %v1, align 4
 %v3 = load <2 x float>, ptr %arg0, align 4
  %v4 = getelementptr inbounds nuw i8, ptr %arg0, i64 8
  %v5 = load float, ptr %v4, align 4
  %v6 = fmul <2 x float> %v0, %v3
  %v7 = extractelement <2 x float> %v6, i64 0
  %v8 = extractelement <2 x float> %v6, i64 1
  %v9 = fadd float %v7, %v8
  %v10 = fmul float %v2, %v5
  %v11 = fadd float %v10, %v9
  %v12 = fcmp olt float %v11, 0.000000e+00
  ret i1 %v12
}
```

alive2: available in alive2 when timeout limit = 50000
```
----------------------------------------
define i1 @src(ptr %arg0, ptr %arg1) {
#0:
  %v0 = load <2 x float>, ptr %arg1, align 4
  %v1 = gep inbounds nuw ptr %arg1, 1 x i64 8
  %v2 = load float, ptr %v1, align 4
  %v3 = load <2 x float>, ptr %arg0, align 4
  %v4 = gep inbounds nuw ptr %arg0, 1 x i64 8
  %v5 = load float, ptr %v4, align 4
 %v6 = fmul <2 x float> %v0, %v3
  %v7 = extractelement <2 x float> %v6, i64 0
  %v8 = extractelement <2 x float> %v0, i64 1
  %v9 = extractelement <2 x float> %v3, i64 1
  %v10 = fmul float %v8, %v9
  %v11 = fadd float %v7, %v10
  %v12 = fmul float %v2, %v5
  %v13 = fadd float %v12, %v11
  %v14 = fcmp olt float %v13, 0.000000
  ret i1 %v14
}
=>
define i1 @tgt(ptr %arg0, ptr %arg1) {
#0:
  %v0 = load <2 x float>, ptr %arg1, align 4
  %v1 = gep inbounds nuw ptr %arg1, 1 x i64 8
  %v2 = load float, ptr %v1, align 4
  %v3 = load <2 x float>, ptr %arg0, align 4
  %v4 = gep inbounds nuw ptr %arg0, 1 x i64 8
  %v5 = load float, ptr %v4, align 4
  %v6 = fmul <2 x float> %v0, %v3
  %v7 = extractelement <2 x float> %v6, i64 0
  %v8 = extractelement <2 x float> %v6, i64 1
  %v9 = fadd float %v7, %v8
  %v10 = fmul float %v2, %v5
  %v11 = fadd float %v10, %v9
  %v12 = fcmp olt float %v11, 0.000000
  ret i1 %v12
}
Transformation seems to be correct!
```
godbolt: https://godbolt.org/z/nTxrcxfbK

Pattern found in: https://github.com/dtcxzyw/llvm-opt-benchmark/blob/main/bench/pbrt-v4/optimized/vecmath.ll
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsV8Fu4zYQ_Rr6QsQgh5YsHXRwktWlLdDD_gAljWy2FCmQlOPk6wtKsZ06SupdbLFZIIJhQOK84RvOPDxJeq-2BrEgyS1J7hdyCDvrit_RsoSli8o2jwVJ2fOPbRpslUGqOCUr5l1NIOuDowQS6baMwB0933ICOSXrW8I28cmeUSLuqbayoUTcAT3QVlsZiPjyCndHpVZbQ1cRO4L5CN5iQI0dmhDDlansYBpPzfBAVTaTRaUrmp1ywJnAtPMZsJ_dVFzJmM2BV9_KmL1mnLzDeDW3aToC2m7Ql4ynFkTMWNkJsR4ReAhO1keqs9j0SI-dsNm12FNp_ITNr8WK11jOzmWOsRObY3H5OXAam1Y2zYvA9TGQs-NscpjLCMfA5JxRzGXkp0j-guU0AW3d9dTq8DJ8rIkt2XghgVs2HarDMGprRBO2Iev7-H-hu7AN1-ru1xPep-5-oO7St3T3liKy_9DYnCJmNcbZjBrhTUHwKwQBZ0G8cCTCNlKrPQIRGyr3UmlZaaTK0OkxfdihoUF1aIdAtepUGFkkcaeLXDdXXt9vhAQEI2LzY6XZ_3u-L1CcHj6ED77Jks2z_BYNfmAJfmjr--ne957rifs4YN_tfZ9S-1-k9pG19mva3TtG99VJ41vrOhmUNdQjdp4GSyuktXUO60CAX5jY1jaV1SHa4S6E3kcNQEmgfF5YWrclUD4RKM3Xg6sPbfXb5KN_yhDQGdrG0aHKzKRQYTdUy9p2BMom1IenxwcCpdb77sb24aZCU-866f4mUFbaVgTKTioT7-IKgbKvXLiJQ1XaPqhOPWFDoNxj3cmwW2q9aArR5CKXCyz4ei04h0zki12R8VxmnHO5bmWarRFF3iQSMRHQggC2UAUwSJngjAlgIl_WkOcJk3nGU-ANtGTFsJNKLyPdeAoL5f2ABc-SJF0ttKxQ-_FDGMDgAx1XCUD8LnbFWGM1bD1ZMa188Oc0QQWNxR_Ke2zoc1ljw-IBfomvHEYGpA6bwTTSBOprqaWj3aCD6rWqp-5Wj9Th4JXZ0j3Wwb4KcOgHHfxicLp4py-R17EpvbN_jVNSjtV4AuVzufsC_gkAAP__Ahd3SA">