aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcov-io.h
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2022-12-28 19:30:17 +0000
committerRoger Sayle <roger@nextmovesoftware.com>2022-12-28 19:30:17 +0000
commit4003e470a7ff8d8cfc94d28f193033fd53cbd1cf (patch)
tree6334bfd3f80afb22540c55d533c9c930a28dddf9 /gcc/gcov-io.h
parent38b649ec16c965733aab9efa6bf61faae3485d92 (diff)
downloadgcc-4003e470a7ff8d8cfc94d28f193033fd53cbd1cf.zip
gcc-4003e470a7ff8d8cfc94d28f193033fd53cbd1cf.tar.gz
gcc-4003e470a7ff8d8cfc94d28f193033fd53cbd1cf.tar.bz2
Provide zero_extend versions/variants of several patterns on x86.
The middle-end doesn't have a preferred canonical form for expressing zero-extension, sometimes using an AND, sometimes pairs of SHIFTs, and sometimes using zero_extend. Pending changes to RTL simplification will/may alter some of these representations, so a few additional patterns are required to recognize these alternate representations and avoid any testsuite regressions. As an example, *popcountsi2_zext is currently represented as: [(set (match_operand:DI 0 "register_operand" "=r") (and:DI (subreg:DI (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm")) 0) (const_int 63))) (clobber (reg:CC FLAGS_REG))] this patch adds an alternate/equivalent pattern that matches: [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))) (clobber (reg:CC FLAGS_REG))] Another example is *popcounthi2 which is currently represented as: [(set (match_operand:SI 0 "register_operand") (popcount:SI (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand")))) (clobber (reg:CC FLAGS_REG))] this patch adds an alternate/equivalent pattern that matches: [(set (match_operand:SI 0 "register_operand") (zero_extend:SI (popcount:HI (match_operand:HI 1 "nonimmediate_operand")))) (clobber (reg:CC FLAGS_REG))] The contents of the machine description definitions remain the same. it's just the expected RTL is slightly different but equivalent. Providing both forms makes the backend more robust to middle-end changes [and possibly catches some missed optimizations]. 2022-12-28 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * config/i386/i386.md (*clzsi2_lzcnt_zext_2): define_insn_and_split to match ZERO_EXTEND form of *clzsi2_lzcnt_zext. (*clzsi2_lzcnt_zext_2_falsedep): Likewise, new define_insn to match ZERO_EXTEND form of *clzsi2_lzcnt_zext_falsedep. (*bmi2_bzhi_zero_extendsidi_5): Likewise, new define_insn to match ZERO_EXTEND form of *bmi2_bzhi_zero_extendsidi. (*popcountsi2_zext_2): Likewise, new define_insn_and_split to match ZERO_EXTEND form of *popcountsi2_zext. (*popcountsi2_zext_2_falsedep): Likewise, new define_insn to match ZERO_EXTEND form of *popcountsi2_zext_falsedep. (*popcounthi2_2): Likewise, new define_insn_and_split to match ZERO_EXTEND form of *popcounthi2. (define_peephole2): ZERO_EXTEND variant of HImode popcount&1 using parity flag peephole2.
Diffstat (limited to 'gcc/gcov-io.h')
0 files changed, 0 insertions, 0 deletions