v0.6.4 (2021-09-06)

Fixes:
  • build: fix version.h dependencies

  • fix and complete the evaluation of atomic builtins

  • fix some testcases related to bitfield manipulation

  • llvm: fix crash with llvm-11 / use real phi-nodes

  • fix: OP_INLINE should not use the function symbol

  • fix testing if a OP_CALL’s function is pure

  • warn on all missing parameter types

  • fix init_linearized_builtins()

  • fix usage count in linearize_fma()

  • linearize: fix a couple of ‘selfcheck’ warnings

  • cfg: remove phi-sources when merging BBs

  • cfg: remove phi-nodes when merging BBs

  • cfg: add missing REPEAT_CFG_CLEANUP

  • fix: rebuild dominance tree during CFG cleanup

  • fix: drop qualifiers of casts and comma or statement expressions

  • fix kill_insn(OP_SETVAL)

  • fix trivial_phi() when the target is before the single value

  • memops: fix wrong killing of stores partially dominated by a load

  • memops: kill dead loads before phi-node conversion

  • memops: kill more dead stores

  • fix rem_usage() when the pseudo has a use list but is not PSEUDO_REG

  • shut up a silly -Wmaybe-uninitialized warning

  • fix add_join_conditional() when one of the alternative is VOID

  • asm: fix killing OP_ASM

  • asm: fix a test failure on 32-bit systems

  • asm: output memory operands need their address as input

  • asm: teach dominates() about OP_ASM

  • fix the type in the assignment of 0 to a restricted variable

  • fix SSA conversion of mismatched memops

  • fix and improve the check that protects try_to_simplify_bb()

  • fix remove_merging_phisrc() with duplicated CFG edges.

  • fix null-pointer crash with with ident same as one of the attributes

New:
  • improve CFG simplification

  • teach sparse about -funsigned-bitfields

  • add a symbolic checker

  • expand __builtin_object_size()

  • let plain bitfields default to signed

  • add support for __packed struct

  • handle qualified anonymous structures

  • move check_access() to late_warnings()

  • let phi-sources to directly access to their phi-node

  • small improvements to the ptrlist API

  • warn when taking the address of a built-in function

  • handle more graciously labels with no statement

  • give an explicit type to compare’s operands

  • give a type to OP_SYMADDR

  • add some notes about pseudos being typeless

  • shrink struct basic_block

  • pre-proc: strip leading “./” from include paths

  • pre-proc: do some path normalization

  • linearize __builtin_isdigit()

IR Simplifications:
  • simplify: essential OP_ADD & OP_SUB simplifications

  • simplify and canonicalize unsigned compares

  • simplify: basic unop simplifications

  • simplify SEL(SEL(…), …)

  • simplify SEL(x == y, x, y) and friends

  • simplify SEL(x, x, x) and SEL(x, 0, x)

  • simplify & canonicalize compares

  • simplify CBR-CBR on the same condition

  • simplify unrestricted postop

  • simplification of computed gotos with 1 or 2 targets

  • simplify kill_insn() of unops and unop-ish instructions

  • simplify: put PSEUDO_ARGS and PSEUDO_REGs in canonical order too

  • simplify (~x {&,|,^} x) –> {0,~0,~0}

  • simplify ((x cmp y) {&,|,^} (x !cmp y)) –> {0,1,1}

  • simplify LSR + SEXT into ASR

  • simplify and canonicalize signed compares

  • simplify CMP(AND(x,M), C) and CMP(OR(x,M), C)

  • simplify AND(x >= 0, x < C) –> (unsigned)x < C

  • simplify TRUNC(x) {==,!=} C –> AND(x,M) {==,!=} C

  • simplify of TRUNC(NOT(x)) –> NOT(TRUNC(x))

  • factorize (x OP1 z) OP2 (y OP1 z) into (x OP2 y) OP1 z

  • factorize SHIFT(x, s) OP SHIFT(y, s) into SHIFT((x OP y), s)

  • factorize SEL(x, OP(y,z), y) into OP(SEL(x, z, 0), y)

  • convert SEL(x & BIT1, BIT2, 0) into SHIFT(x & BIT1, S)

  • canonicalize ((x & M) == M) –> ((x & M) != 0) when M is a power-of-2

Testsuite:
  • testsuite: add new tags: check-output-{match,returns}

  • testsuite: fix parsing of tags used in the testcases

  • testsuite: add option ‘-r’ to ‘test-suite format’

Documentation:
  • doc: fix: Sphinx’s option ‘:noindex:’ renamed into ‘:noindexentry:’

  • doc: fix extracted autodoc when short description ends with a ‘?’

  • doc: add some doc about using NULL or VOID in pointer lists

  • doc: add some doc to flowgraph.h

  • doc: extract doc related to simplification

Cleanups:
  • slice: small reorg of OP_SLICE in preparation for some incoming changes

  • cleanup: removed an unused parameter for show_symbol_list()

  • cleanup linearize_cond_branch()

  • cleanup: remove unneeded REPEAT_SYMBOL_CLEANUP

  • cleanup: no needs to use MARK_CURRENT_DELETED() for multi-jumps

  • linearize: remove unneeded forward declarations

  • linearize: only allocate call instructions when needed