[PATCH] D59035: [X86] Promote i8 CMOV's (PR40965)

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 15 05:59:55 PDT 2019


lebedev.ri added inline comments.


================
Comment at: test/CodeGen/X86/cmov-promotion.ll:155-158
+; CMOV-NEXT:    movl $117, %eax
+; CMOV-NEXT:    movl $237, %ecx
+; CMOV-NEXT:    cmovnel %eax, %ecx
+; CMOV-NEXT:    movsbl %cl, %eax
----------------
andreadb wrote:
> I noticed that we could avoid the sign extend if we move -19 instead of 237 to ECX, and we commute the operands of that CMOV (along with the condition: from NE to E).
> 
> The following sequence should be equivalent:
> 
> ```
> ; CMOV-NEXT:    movl $117, %eax
> ; CMOV-NEXT:    movl $-19, %ecx
> ; CMOV-NEXT:    cmovel %ecx, %eax
> ```
> 
> Same for other 'spromotion' tests below.
> 
> P.s.: none of these things require changes to your patch. This was just FIY (something that I found interesting while looking at the test changes).
Given that the input is
```
define i16 @old(i1 %c) {
  %t0 = select i1 %c, i8 117, i8 -19
  %ret = sext i8 %t0 to i16
  ret i16 %ret
}
```
why can't we simply widen the hands of select, like
```
define i16 @new(i1 %c) {
  %ret = select i1 %c, i16 117, i16 -19
  ret i16 %ret
}
```
https://rise4fun.com/Alive/cs8
?

So instead of 
```
        testb   $1, %dil
        movl    $117, %eax
        movl    $237, %ecx
        cmovnel %eax, %ecx
        movsbl  %cl, %eax

```
we get
```
        testb   $1, %dil
        movl    $117, %ecx
        movl    $65517, %eax            # imm = 0xFFED
        cmovnel %ecx, %eax
```

I.e. the 'obvious' fix here is that if we are widening result of CMOV,
and both of the possibilities are constants, then just widen those constants and CMOV itself.

Why do you think we'd need to flip the CMOV condition?


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59035/new/

https://reviews.llvm.org/D59035





More information about the llvm-commits mailing list