[PATCH] D124118: [Peephole-Opt] For one kind of test-after-add pattern, eliminates test if it's correct to do so.
Mingming Liu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 28 12:38:28 PDT 2022
mingmingl marked an inline comment as done.
mingmingl added a comment.
thanks for reviews!
================
Comment at: llvm/lib/Target/X86/X86InstrInfo.cpp:970
+// Returns true if SF is known to be zero after AndInstr executes.
+inline static bool isSFZero(const MachineInstr &AndInstr) {
----------------
craig.topper wrote:
> I don't know if this is necessary. If the SUBREG_TO_REG was used, the sign bit of the full 64 bit value was provably zero during SelectionDAG. I hope any branch, setcc, cmov would have been folded away based on it.
>
> Can't we just set NoSignFlag=true?
`isSFZero` is used to tell the difference of following two scenarios, and (if I read correctly) `NoSignFlag` (as well as `ClearsOverflowFlag`) indicate whether the EFLAG bit is set (as opposed to the value of bit), so for `AND` operation, we want to set `NoSignFlag` to false.
1)
```
AND32ri8 reg, 0x9 # signed bit is 1, so after sign extension, the SF bit could be 1 or 0 depending on reg value
SUBREG_TO_REG 0, extended_reg, reg , sub_32bit
TEST64rr extended_reg, extended_reg, # SF bit is 0 since higher 32 bit of extended_reg is 0
```
2)
```
AND32ri8 reg, 0x7 # signed bit is 0, so after sign extension, the SF bit is known to be 0
SUBREG_TO_REG 0, extended_reg, reg , sub_32bit
TEST64rr extended_reg, extended_reg, # SF bit is 0 since higher 32 bit of extended_reg is 0
```
We want to optimize away `test` for 2) but keep `test` for 1).
Let me know if I miss anything!
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124118/new/
https://reviews.llvm.org/D124118
More information about the llvm-commits
mailing list