<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">