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

    <tr>
        <th>Summary</th>
        <td>
            [SPIRV] Add PreLegalizer instCombine for `faceforward` GL extension
        </td>
    </tr>

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

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

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

<pre>
    Follow up to #99114.

The codegen for `faceforward` looks something like
```asm
faceforward(p1, p2, p3) ->
 dResult       = dot(p2, p3)
  cmpResult  = fcmp dResult, 0.0
  subResult = fsub -0.0 p1
  select(cmpResult, p1, subResult)
```
which means we can pattern match in `SPIRVCombine.td` and `SPIRVPreLegalizerCombiner.cpp` to
```c# 
select(
    fcmp(
        dot(p2, p3), 
        0),
    p1,
 0 - p1) 
```

This would allow us to change `select(fcmp(dot(p2, p3), 0), p1, 0 - p1)` to `faceforward(p1, p2, p3)` so that we use the right SPIR-V extension function.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx0U0FvnDwQ_TXmMlpkDGSXAwe-5NuqUg5RWuVuzABujI1sk2376ysbwq7S1Fot2PPGM-_xhjsnB41Yk_I_Uj4kfPGjsfXrNKMektZ0v-qzUcpcYJnBGyAsr6osK1JCG0Kb7yOCMB0OqKE3Fsgd7bnA3tgLtx25o6CMeXXgzIR-lHoAJV8x5N7R9cfdRGhzm8ROc0bYPcws_ueEVXAg-f-ENtA9o1uUh3WR_AE640PGFRtgIKb5HRlAvZjm99wApCmNMLe0Gyyi3NLCgaYU5mwNo0IRrt-vi1Vid3vqWnLnQ2hzGaUYYUKuHVwQBNcwc-_Rapi4FyNIHYT69vT1-eXeTK3UmPooFtfdHnmy-IgDV_I32g1lUzHPAefNbUlBWA6ENnu7sXmIrK-7sP4Wi93DTZyuR9tJJBreKRzipoIPTKMDpIOLWVQHfPWJCz4RI9cDBjJ7V1s7n_awFd603eutXD-66hODBKAz4Efug-SLQ_AjgpXD6CHIeXgB_OlRO2k09IsWXhqdJl2dd1Ve8QTr7FiUZc6y0ykZ676qjgwpy1iL-akXVXkUNO_FSdCupfyYyJpRVtKCFYzRnJ7SqiwrFEXWZ0WWtYKSguLEpUqVeptSY4dEOrdgneVHVpaJ4i0qF6eOMY0XiFHCWBhCW4ekQ7sMjhRUSefd9RovvYrjGl1Cygdoug5u3QJSO79Z5h9T-eXxKkeyWFWP3s-O5A1hZ8LOg_Tj0qbCTISdQ-XtcZit-RG_5jn26wg7b4TeavYnAAD__-QGRoc">