[PATCH] D149782: [DAGCombiner] Add bswap(logic_op(bswap(x), y)) regression test case; NFC

Noah Goldstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 5 16:16:31 PDT 2023


goldstein.w.n added inline comments.


================
Comment at: llvm/test/CodeGen/X86/combine-bswap.ll:385
+}
+
 ; negative test
----------------
austin880625 wrote:
> RKSimon wrote:
> > goldstein.w.n wrote:
> > > goldstein.w.n wrote:
> > > > Can you do two things.
> > > > 
> > > > 1) Add a negative test that is `(bswap (logic (bitreverse a), b))`
> > > > 2) Make some of the tests use `bitreverse`. You don't need to add new tests, just modify half the `bswap` ones to use `bitreverse instead.
> > > ping on this comment, otherwise LG.
> > +1 for (1) - but I'd prefer equivalent tests added to combine-bitreverse.ll instead of being added to combine-bswap.ll
> I was trying to add `(bitreverse (logic (bswap a), b))` in combine-bitreverse.ll and `(bswap (logic (bitreverse a), b))` in combine-bswap.ll and found the following:
> 
> x86 doesn't have RBIT like ARM, so the first instruction of `bitreverse` is a `bswap`(to replace 0x00FF00FF), then the `0x0F0F0F0F, 0x33333333,...` twiddling. This cause the `(bitreverse (logic (bswap a), b))` actually got optimized as a negative test, just not on the major part of `bitreverse`.
> 
> ```
> ; X86-LABEL: brev_xor_rhs_bs32:                                                      
> ; X86:       # %bb.0:                                                                
> ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
> ; X86-NEXT:    bswapl %eax ; <--- this becomes LHS
> ; X86-NEXT:    xorl {{[0-9]+}}(%esp), %eax
> -; X86-NEXT:    bswapl %eax <---- this line got removed
> ; X86-NEXT:    movl %eax, %ecx
> ; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F
> ; X86-NEXT:    shll $4, %ecx
> ...
> ```
> 
> Currently I only keep `(bswap (logic (bitreverse a), b))` for this patch, then there's no diff after the optimization as desired, though this assumes the order of bswap and the manual bit ops.
> 
> Another way is moving these test cases into ARM version(need to create new files), which also reduces a lot of FileCheck lines
> I was trying to add `(bitreverse (logic (bswap a), b))` in combine-bitreverse.ll and `(bswap (logic (bitreverse a), b))` in combine-bswap.ll and found the following:
> 
> x86 doesn't have RBIT like ARM, so the first instruction of `bitreverse` is a `bswap`(to replace 0x00FF00FF), then the `0x0F0F0F0F, 0x33333333,...` twiddling. This cause the `(bitreverse (logic (bswap a), b))` actually got optimized as a negative test, just not on the major part of `bitreverse`.
> 

@RKSimon maybe we should postpone x86 bitreverse lowing till after legalization?
> ```
> ; X86-LABEL: brev_xor_rhs_bs32:                                                      
> ; X86:       # %bb.0:                                                                
> ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
> ; X86-NEXT:    bswapl %eax ; <--- this becomes LHS
> ; X86-NEXT:    xorl {{[0-9]+}}(%esp), %eax
> -; X86-NEXT:    bswapl %eax <---- this line got removed
> ; X86-NEXT:    movl %eax, %ecx
> ; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F
> ; X86-NEXT:    shll $4, %ecx
> ...
> ```
> 
> Currently I only keep `(bswap (logic (bitreverse a), b))` for this patch, then there's no diff after the optimization as desired, though this assumes the order of bswap and the manual bit ops.
> 
> Another way is moving these test cases into ARM version(need to create new files), which also reduces a lot of FileCheck lines

Putting the test file in the arm backend would be fine.


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

https://reviews.llvm.org/D149782



More information about the llvm-commits mailing list