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

    <tr>
        <th>Summary</th>
        <td>
            [GlobalISel] Divide multiple values by the same value.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            performance,
            llvm:globalisel,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    SDAG has an optimization that converts multiple divides by the same value into `y = 1/x` and multiplies by y.

https://godbolt.org/z/3qY8dxWGx
```
define dso_local void @test(ptr nocapture noundef %a, double noundef nofpclass(nan inf) %c) local_unnamed_addr {
entry:
  %0 = load double, ptr %a, align 8
 %div = fdiv fast double %0, %c
  store double %div, ptr %a, align 8
 %arrayidx1 = getelementptr inbounds i8, ptr %a, i64 8
  %1 = load double, ptr %arrayidx1, align 8
  %div2 = fdiv fast double %1, %c
  store double %div2, ptr %arrayidx1, align 8
  %arrayidx3 = getelementptr inbounds i8, ptr %a, i64 16
  %2 = load double, ptr %arrayidx3, align 8
  %div4 = fdiv fast double %2, %c
  store double %div4, ptr %arrayidx3, align 8
  %arrayidx5 = getelementptr inbounds i8, ptr %a, i64 24
  %3 = load double, ptr %arrayidx5, align 8
  %div6 = fdiv fast double %3, %c
  store double %div6, ptr %arrayidx5, align 8
  ret void
}
```

SDAG:
```
test: // @test
        fmov    d1, #1.00000000
        ldp     d3, d4, [x0, #16]
        fdiv    d0, d1, d0
        ldp     d1, d2, [x0]
 fmul    d1, d1, d0
        fmul    d2, d2, d0
        fmul    d3, d3, d0
        fmul    d0, d4, d0
        stp     d1, d2, [x0]
 stp     d3, d0, [x0, #16]
        ret
```

GISel:
```
test: // @test
        ldp     d1, d2, [x0]
        ldp     d3, d4, [x0, #16]
        fdiv    d1, d1, d0
 fdiv    d2, d2, d0
        fdiv    d3, d3, d0
        stp     d1, d2, [x0]
        fdiv    d0, d4, d0
        stp     d3, d0, [x0, #16]
        ret
```
We should implement the same thing in GISel.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk2PozgQ_TXmYnVkzEfDgUP3RmnteQ6jPbUMLhKvjM3aBiXz61c2kGSzSZrRDIpwwFXv1avCpWLWir0CqFD2jrJtxAZ30KbibIRubwBUVGt-qr5t3z7wgVnMFNa9E534wZzQCrsDc7jRagTjLO4G6UQvAXMxCg4W1yfsDoAt6wCPTA6AhXIao5ycMEq2OEZ0d0Q5wUzxxVtMfqcNIltE3qb7wbneouQN0R2iu73mtZZuo80e0d0PRHfJP38V_Pj94zg75WT-hUcOrVCAudWfUjdM4lELjlFKHFiHaNE7g5VuWO8GA1jpQXFoMaIZQ_QPzPVQy8trpdu-kcxaRAvFFBaqRbT01o1fA8HnoBTrgH8yzg1Gr-9THKCcOXkV4Ql7HxLyIDXjM49n9PEs7EyKvcLF7IJoxsUYfFr_p2XWLQF6NO8RIpkZrNMGrgy4GL8kYMawk-DHONDswYGEDpTzTkLVPg0Wi-IWR-TpGcW_jJ8pWyj-H8AcJX2oMV6hka7nWraTn1cb51c4dIXc5KHc9KFcukJuup5r2c5-Xi5Nr3CSFXKzh3Lzh3KTFXLzlVwGXDjpc0943d5tDtPdd7jzybyxCF0i8WfDN59z35hZpqvt9OhXPn-eSbwh8_VfQ8n7sPKglIfSoez9SBa_HGXbG2yfJ-8SbCYG_gh22qUX2DNa2w3yyuQuzNmGXmAe2kwKkqc25KLy1sa6L0M-mywkXyfLgHtS5o8_v4H8lTqvyPNvKPS9Cp03n5VmsXlSmhVpv__dPS_ir1foO2B70IPkWHT91JUu04M7CLXHQuFQwU3Eq4SXSckiqOJXWhZpmeRldKgSmsRZQwpGStZCweCVtQRIRpO2qLMcIlFRQtOY0IyUKU3LDc0ptCRvm7xu06LkKCXQMSE3Uo6dHzEiYe0AVRwneV5EktUgbZiXKO3BtNp0TDWAqM8kotS7oeRtL3XNpLAgzzudsBb4y_UA5feybWQq7_VSD3uLUiKFdfZC74STYUD7CJDhC862eBtmrMvMFearOyPXJhqMrG4GKOEOQ71pdIfoLgQ8LS-90X9D4xDdBdEW0d2se6zovwEAAP__d1jRNQ">