Go to file
Roland Paterson-Jones c2ff93e75e Global Value Numbering / Global Code Motion
More or less as proposed in its ninth iteration with the
addition of a gcmmove() functionality to restore coherent
local schedules.

Changes since RFC 8:

Features:

 - generalization of phi 1/0 detection
 - collapse linear jmp chains before GVN; simplifies if-graph
     detection used in 0/non-0 value inference and if-elim...
 - infer 0/non-0 values from dominating blk jnz; eliminates
     redundant cmp eq/ne 0 and associated jnz/blocks, for example
     redundant null pointer checks (hare codebase likes this)
 - remove (emergent) empty if-then-else graphlets between GVN and
     GCM; improves GCM instruction placement, particularly cmps.
 - merge %addr =l add %addr1, N sequences - reduces tmp count,
     register pressure.
 - squash consecutive associative ops with constant args, e.g.
     t1 = add t, N ... t2 = add t2, M -> t2 = add t, N+M

Bug Fixes:

 - remove "cmp eq/ne of non-identical RCon's " in copyref().
   RCon's are not guaranteed to be dedup'ed, and symbols can
   alias.

Codebase:

  - moved some stuff into cfg.c including blkmerge()
  - some refactoring in gvn.c
  - simplification of reassoc.c - always reassoc all cmp ops
      and Kl add %t, N. Better on coremark, smaller codebase.
  - minor simplification of movins() - use vins

Testing - standard QBE, cproc, hare, harec, coremark
          [still have Rust build issues with latest roland]

Benchmark
- coremark is ~15%+ faster than master
- hare "HARETEST_INCLUDE='slow' make check" ~8% faster
    (crypto::sha1::sha1_1gb is biggest obvious win - ~25% faster)

Changes since RFC 7:

Bug fixes:

- remove isbad4gcm() in GVN/GCM - it is unsound due to different state
    at GVN vs GCM time; replace with "reassociation" pass after GCM
- fix intra-blk use-before-def after GCM
- prevent GVN from deduping trapping instructions cos GCM will not
    move them
- remove cmp eq/ne identical arg copy detection for floating point, it
    is not valid for NaN
- fix cges/cged flagged as commutative in ops.h instead of cnes/cned
    respectively; just a typo

Minor features:

- copy detection handles cmp le/lt/ge/gt with identical args
- treat (integer) div/rem by non-zero constant as non-trapping
- eliminate add N/sub N pairs in copy detection
- maintain accurate tmp use in GVN; not strictly necessary but enables
    interim global state sanity checking
- "reassociation" of trivial constant offset load/store addresses, and
    cmp ops with point-of-use in pass after GCM
- normalise commutative op arg order - e.g. op con, tmp -> op tmp, con
    to simplify copy detection and GVN instruction dedup

Codebase:

- split out core copy detection and constant folding (back) out into
    copy.c, fold.c respectively; gvn.c was getting monolithic
- generic support for instruction moving in ins.c - used by GCM and
    reassoc
- new reassociation pass in reassoc.c
- other minor clean-up/refactor

Changes since RFC 6:

- More ext elimination in GVN by examination of def and use bit width
- elimination of redundant and mask by bit width examination
- Incorporation of Song's patch

Changes since RFC 5:

- avoidance of "bad" candidates for GVN/GCM - trivial address offset
    calculations, and comparisons
- more copy detection mostly around boolean values
- allow elimination of unused load, alloc, trapping instructions
- detection of trivial boolean v ? 1 : 0 phi patterns
- bug fix for (removal of) "chg" optimisation in ins recreation - it
    was missing removal of unused instructions in some cases

ifelim() between GVN and GCM; deeper nopunused()
2025-03-14 09:58:37 +01:00
amd64 Re-use (vgrow) b->ins vector in backend xxx_abi() fn's. 2025-03-14 09:47:05 +01:00
arm64 Re-use (vgrow) b->ins vector in backend xxx_abi() fn's. 2025-03-14 09:47:05 +01:00
doc function params must be unique 2024-04-27 10:52:03 +02:00
minic Makefile: POSIXify 2022-06-14 13:58:01 +02:00
rv64 Re-use (vgrow) b->ins vector in backend xxx_abi() fn's. 2025-03-14 09:47:05 +01:00
test Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
tools qbe has its own magic 2024-06-17 13:17:39 +02:00
.gitignore Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
abi.c add new target-specific abi0 pass 2022-10-03 10:41:03 +02:00
alias.c fix bug in alias analysis 2024-03-07 16:40:51 +01:00
all.h Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
cfg.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
copy.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
emit.c drop unnecessary check 2024-04-12 11:37:35 +02:00
fold.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
gcm.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
gvn.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
ins.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
LICENSE update copyright years 2024-03-07 16:45:22 +01:00
live.c refine assertion in liveness analysis 2022-06-14 09:11:44 +02:00
load.c idup(Ins **, Ins *, ulong) -> idup(Blk *, Ins *, ulong) 2025-03-14 09:47:05 +01:00
main.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
Makefile Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
mem.c relax one assert 2024-06-05 12:50:36 +02:00
ops.h Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
parse.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
README Makefile: POSIXify 2022-06-14 13:58:01 +02:00
reassoc.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
rega.c idup(Ins **, Ins *, ulong) -> idup(Blk *, Ins *, ulong) 2025-03-14 09:47:05 +01:00
simpl.c idup(Ins **, Ins *, ulong) -> idup(Blk *, Ins *, ulong) 2025-03-14 09:47:05 +01:00
spill.c idup(Ins **, Ins *, ulong) -> idup(Blk *, Ins *, ulong) 2025-03-14 09:47:05 +01:00
ssa.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00
util.c Global Value Numbering / Global Code Motion 2025-03-14 09:58:37 +01:00

QBE - Backend Compiler              http://c9x.me/compile/

doc/    Documentation.
minic/  An example C frontend for QBE.
tools/  Miscellaneous tools (testing).
test/   Tests.
amd64/
arm64/
rv64/   Architecture-specific code.

The LICENSE file applies to all files distributed.

- Compilation and Installation

Invoke make in this directory to create the executable
file qbe.  Install using 'make install', the standard
DESTDIR and PREFIX environment variables are supported.
Alternatively, you may simply copy the qbe binary manually.