aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/simplify.c
AgeCommit message (Expand)AuthorFilesLines
2023-12-28reassoc: fix infinite loop during reassociationLuc Van Oostenryck1-4/+6
2021-07-27fix missing itype in SEL(x, 0/1, 1/0) --> (x ==/!= 0)Luc Van Oostenryck1-0/+1
2021-04-20Merge branches misc, cmp-pow2, optim-and-cmp, cmp-and-or and optim-cast-eval ...Luc Van Oostenryck1-7/+73
2021-04-19simplify TRUNC(NOT(x)) --> NOT(TRUNC(x))Luc Van Oostenryck1-0/+15
2021-04-18TRUNC(x) {==,!=} C --> AND(x,M) {==,!=} CLuc Van Oostenryck1-0/+14
2021-04-18simplify AND(x >= 0, x < C) --> (unsigned)x < CLuc Van Oostenryck1-0/+11
2021-04-18canonicalize constant signed compares toward zeroLuc Van Oostenryck1-6/+28
2021-04-18Merge branches 'fix-phisrc' and 'insert-last-insn' into memops-prepLuc Van Oostenryck1-25/+9
2021-03-19use convert_to_jump() when converting a CBR with same targetsLuc Van Oostenryck1-11/+2
2021-03-19rename insert_branch() to convert_to_jump()Luc Van Oostenryck1-4/+4
2021-03-19let insert_branch() return a statusLuc Van Oostenryck1-14/+7
2021-03-19remove insert_branch() redundant argLuc Van Oostenryck1-4/+4
2021-03-13canonicalize ((x & M) == M) --> ((x & M) != 0) when M is a power-of-2Luc Van Oostenryck1-0/+4
2021-03-10no needs to use MARK_CURRENT_DELETED() for multi-jumpsLuc Van Oostenryck1-1/+1
2021-03-10simplify (x | M) cmpu CLuc Van Oostenryck1-0/+16
2021-03-10simplify (x | M) cmps CLuc Van Oostenryck1-0/+14
2021-03-10simplify (x | M) {==,!=} CLuc Van Oostenryck1-0/+15
2021-03-10simplify (x & M) {==,!=} CLuc Van Oostenryck1-0/+8
2021-03-10simplify (x & M) cmps 0Luc Van Oostenryck1-0/+4
2021-03-10simplify (x & M) cmpu CLuc Van Oostenryck1-0/+16
2021-03-10simplify (x & M) cmps CLuc Van Oostenryck1-0/+25
2021-03-08ptrlist: change return value of linearize_ptr_list()/ptr_list_to_array()Luc Van Oostenryck1-2/+2
2021-03-06ptrlist: make linearize_ptr_list() genericLuc Van Oostenryck1-2/+2
2021-01-26cmps: canonicalize SEL(x > 0, a, -a) --> SEL(x >= 0, a, -a)Luc Van Oostenryck1-0/+14
2021-01-26cmps: canonicalize SEL(x {<,<=} y, a, b) --> SEL(x {>=,>} y, b, a)Luc Van Oostenryck1-0/+7
2021-01-26cmps: canonicalize signed compares with constantLuc Van Oostenryck1-0/+2
2021-01-26cmps: canonicalize SMIN/SMAX +- 1 --> EQ/NELuc Van Oostenryck1-0/+8
2021-01-26cmps: canonicalize signed compares with SMIN/SMAXLuc Van Oostenryck1-0/+8
2021-01-26cmps: simplify signed compares with SMIN or SMAXLuc Van Oostenryck1-0/+17
2021-01-26cmpu: fix canonicalization of unsigned (x {<,>=} C) --> (x {<=,>} C-1)Luc Van Oostenryck1-2/+2
2021-01-26cmps: fix simplification of sext(x) + signed compare of {SMAX,SMIN}Luc Van Oostenryck1-2/+2
2021-01-26cmps: make clearer we're using the operands' sizeLuc Van Oostenryck1-4/+5
2021-01-25Merge branches 'fix-can-move-to' and 'asr-synth' into nextLuc Van Oostenryck1-1/+12
2021-01-24simplify LSR + SEXT into ASRLuc Van Oostenryck1-1/+12
2021-01-24fix possible circular definition with can_move_to()Luc Van Oostenryck1-0/+2
2021-01-17fix type of canonicalization of sext + unsigned compareLuc Van Oostenryck1-0/+2
2021-01-02shut up a silly -Wmaybe-uninitialized warningLuc Van Oostenryck1-1/+1
2020-12-29fix rem_usage()Luc Van Oostenryck1-1/+1
2020-12-04fix killing OP_ASMLuc Van Oostenryck1-0/+15
2020-12-02Merge branch 'kill-replace' into nextLuc Van Oostenryck1-18/+3
2020-11-28make replace_with_pseudo() externLuc Van Oostenryck1-1/+1
2020-11-28make a header for simplificationLuc Van Oostenryck1-0/+1
2020-11-28let replace_with_pseudo() use kill_instruction()Luc Van Oostenryck1-17/+1
2020-11-28Merge branch 'bit-trans' into nextLuc Van Oostenryck1-17/+264
2020-11-27convert SEL(x & BIT1, BIT2, 0) into SHIFT(x & BIT1, S)Luc Van Oostenryck1-0/+15
2020-11-27add helper is_pow2()Luc Van Oostenryck1-0/+9
2020-11-27factorize SEL(x, OP(y,z), y) into OP(SEL(x, z, 0), y)Luc Van Oostenryck1-0/+40
2020-11-27factorize SHIFT(x, s) OP SHIFT(y, s) into SHIFT((x OP y), s)Luc Van Oostenryck1-0/+27
2020-11-27factorize (x OP1 z) OP2 (y OP1 z) into (x OP2 y) OP1 zLuc Van Oostenryck1-0/+78
2020-11-27refactor simplify_add() to avoid code duplicationLuc Van Oostenryck1-13/+9
2020-11-27refactor simplify_add() to avoid code duplication (preparation)Luc Van Oostenryck1-5/+2
2020-11-27add helper replace_binop()Luc Van Oostenryck1-0/+17
2020-11-27add helper make_insn_pair() & swap_insn()Luc Van Oostenryck1-0/+31
2020-11-27reassoc: add helper can_move_to()Luc Van Oostenryck1-0/+37
2020-11-26fix trivial_phi() when the target is before the single valueLuc Van Oostenryck1-2/+2
2020-11-24Merge branch 'optim-not' into nextLuc Van Oostenryck1-10/+108
2020-11-22Merge branch 'cleanup' into nextLuc Van Oostenryck1-18/+7
2020-11-22Merge branch 'optim-cgoto' into nextLuc Van Oostenryck1-1/+65
2020-11-22not: simplify ((x cmp y) {&,|,^} (x !cmp y)) --> {0,1,1}Luc Van Oostenryck1-3/+21
2020-11-22not: simplify (~x {&,|,^} x) --> {0,~0,~0}Luc Van Oostenryck1-3/+63
2020-11-22canon: simplify calculation of canonical orderLuc Van Oostenryck1-13/+27
2020-11-22canon: put PSEUDO_REGs in canonical order tooLuc Van Oostenryck1-0/+3
2020-11-22canon: put PSEUDO_ARGs in canonical order tooLuc Van Oostenryck1-0/+3
2020-11-21add a new instruction for label-as-valueLuc Van Oostenryck1-11/+23
2020-11-21simplify CGOTO(SEL(x, L1, L2)) into CBR x, L1, L2Luc Van Oostenryck1-0/+22
2020-11-21simplify OP_COMPUTEDGOTO with unique and known targetLuc Van Oostenryck1-0/+30
2020-11-21simplify kill_insn() of unops and unop-ish instructionsLuc Van Oostenryck1-13/+5
2020-11-21remove unneeded REPEAT_SYMBOL_CLEANUPLuc Van Oostenryck1-5/+2
2020-11-21fix kill_insn(OP_SETVAL)Luc Van Oostenryck1-1/+1
2020-11-17cfg: add missing REPEAT_CFG_CLEANUPLuc Van Oostenryck1-1/+1
2020-11-11Merge branch 'debug'Luc Van Oostenryck1-3/+0
2020-11-09Merge branch 'optim-cmp' into nextLuc Van Oostenryck1-41/+199
2020-11-08select: simplify select(x, x, 0) --> xLuc Van Oostenryck1-0/+2
2020-11-08select: simplify handling of select(x, 0, x) --> 0Luc Van Oostenryck1-5/+2
2020-11-08cmp: simplify compares and sign/zero extendLuc Van Oostenryck1-10/+42
2020-11-08cmp: simplify zext(x) cmpu CLuc Van Oostenryck1-0/+4
2020-11-08cmp: simplify zext(x) cmps CLuc Van Oostenryck1-0/+14
2020-11-08cmp: canonicalize sext(x) cmpu C (with C >= SMAX)Luc Van Oostenryck1-0/+12
2020-11-08cmp: simplify sext(x) cmps {SMAX,SMIN}Luc Van Oostenryck1-0/+14
2020-11-08cmp: simplify zext(x) cmp C --> x cmp CLuc Van Oostenryck1-0/+11
2020-11-08cmp: simplify sext(x) cmp C --> x cmp CLuc Van Oostenryck1-0/+24
2020-11-08cmp: canonicalize unsigned (x {<=,>} SMAX)Luc Van Oostenryck1-0/+4
2020-11-08cmp: canonicalize unsigned compare with UMAX or UMAX-1Luc Van Oostenryck1-0/+8
2020-11-08cmp: simplify unsigned (x {<=,>} UMAX) into {1,0}Luc Van Oostenryck1-0/+5
2020-11-08cmp: canonicalize unsigned (x {<,>=} C) --> (x {<=,>} C-1)Luc Van Oostenryck1-1/+7
2020-11-08cmp: use a few helpers for the simplification of comparesLuc Van Oostenryck1-20/+32
2020-11-08cmp: move some code in a separate function: simplify_compare_constant()Luc Van Oostenryck1-31/+43
2020-11-07simplify SEL(x == y, x, y) and friendsLuc Van Oostenryck1-0/+12
2020-11-07select: simplify handling of constant cond or src1 == src2Luc Van Oostenryck1-8/+6
2020-11-07select: simplify SEL(SEL(x, C1, C2), y, z) --> y (with C1, C2 != 0)Luc Van Oostenryck1-0/+3
2020-11-07select: simplify SEL(SEL(x, C, 0), C, 0) --> SEL(x, C, 0) == condLuc Van Oostenryck1-0/+3
2020-11-07select: simplify SEL(SEL(x, C, 0), y, z) --> SEL(x, y, z) and its dualLuc Van Oostenryck1-0/+20
2020-11-01do not call simplify_instruction() if already removedLuc Van Oostenryck1-3/+0
2020-11-01eval_insn: give an explicit type to compare's operandsLuc Van Oostenryck1-1/+13
2020-10-27Merge branch 'one_use'Luc Van Oostenryck1-9/+9
2020-10-27replace nbr_users() & multi_users() by one_use()Luc Van Oostenryck1-9/+9
2020-10-27Merge branches 'cleanup-linearize', 'inline-use', 'inline-def', 'pure-call', ...Luc Van Oostenryck1-49/+8
2020-10-25fix testing if a OP_CALL's function is pureLuc Van Oostenryck1-3/+3
2020-10-25kill dead instructions before any other simplificationsLuc Van Oostenryck1-46/+5
2020-10-24Merge branches 'optim-setuimm' and 'optim-unop' into nextLuc Van Oostenryck1-5/+78
2020-10-24unop: simplify ~(-x) --> x - 1Luc Van Oostenryck1-0/+4
2020-10-24unop: simplify ~(x ^ C) --> x ^ ~CLuc Van Oostenryck1-0/+6
2020-10-24unop: simplify ~(C - x) --> x + ~CLuc Van Oostenryck1-0/+6
2020-10-24unop: simplify ~(x + C) --> ~C - xLuc Van Oostenryck1-0/+7
2020-10-24unop: simplify -(~x) --> x + 1Luc Van Oostenryck1-0/+4
2020-10-24unop: simplify -(x - y) --> y - xLuc Van Oostenryck1-0/+4
2020-10-24unop: simplify -(x + C) --> -C - xLuc Van Oostenryck1-0/+7
2020-10-24unop: prepare simplify_unop() to handle more casesLuc Van Oostenryck1-5/+10
2020-10-23canonicalize unsigned compares against 0 or 1Luc Van Oostenryck1-0/+20
2020-10-23simplify unsigned compares against 0Luc Van Oostenryck1-0/+10
2020-10-20sub: simplify x + (y - x) --> yLuc Van Oostenryck1-0/+4
2020-10-20sub: simplify (x - y) + y --> xLuc Van Oostenryck1-0/+5
2020-10-20sub: simplify x - (y + x) --> -yLuc Van Oostenryck1-0/+2
2020-10-20sub: simplify x - (x + y) --> -yLuc Van Oostenryck1-0/+4
2020-10-20sub: simplify (x + y) - y --> xLuc Van Oostenryck1-0/+2
2020-10-20sub: simplify (x + y) - x --> yLuc Van Oostenryck1-0/+8
2020-10-20add: simplify (-x + y) --> (y - x)Luc Van Oostenryck1-0/+8
2020-10-20add: simplify (x + -y) --> (x - y)Luc Van Oostenryck1-1/+15
2020-10-20sub: simplify (x - -y) --> (x + y)Luc Van Oostenryck1-1/+15
2020-10-20sub: simplify (C - y) + D --> eval(C+D) - yLuc Van Oostenryck1-0/+20
2020-10-20sub: simplify C - (D - z) --> z + eval(C-D)Luc Van Oostenryck1-0/+8
2020-10-20sub: simplify C - (y + D) --> eval(C-D) - yLuc Van Oostenryck1-0/+18
2020-10-20sub: canonicalize (0 - x) into -xLuc Van Oostenryck1-0/+4
2020-10-20sub: reorganize handling of OP_{ADD,SUB}s with constant rightsideLuc Van Oostenryck1-9/+11
2020-10-20reassoc: simplify (x # C) # K --> x # eval(C # K)Luc Van Oostenryck1-0/+5
2020-10-20constants must be truncated to the operation's sizeLuc Van Oostenryck1-1/+1
2020-10-20add a flag to identify commutative & associative opsLuc Van Oostenryck1-23/+46
2020-10-20unop: add helper replace_with_unop()Luc Van Oostenryck1-0/+14
2020-10-20unop: add helper eval_unop()Luc Van Oostenryck1-0/+12
2020-10-20extract eval_op() from eval_insn()Luc Van Oostenryck1-5/+9
2020-10-20let switch_pseudo() return REPEAT_CSELuc Van Oostenryck1-1/+2
2020-10-06unop: fix access to defining instruction in simplify_unop()Luc Van Oostenryck1-4/+2
2020-09-05replace_with_{pseudo,value}() can be tail-callsLuc Van Oostenryck1-8/+4
2020-09-05use replace_with_value()Luc Van Oostenryck1-8/+8
2020-09-05add helper replace_with_value()Luc Van Oostenryck1-0/+5
2020-08-06bad-shift: wait dead code elimination to warn about bad shiftsLuc Van Oostenryck1-15/+5
2018-12-22doc: fix list formattingLuc Van Oostenryck1-2/+3
2018-09-06Merge branch 'rem-trivial-phi' into tipLuc Van Oostenryck1-19/+44
2018-09-01trivial-phi: remove more complex trivial phi-nodesLuc Van Oostenryck1-2/+17
2018-09-01trivial-phi: directly return the unique valueLuc Van Oostenryck1-17/+9
2018-09-01trivial-phi: use a temp var for the real sourceLuc Van Oostenryck1-2/+7
2018-09-01trivial-phi: early returnLuc Van Oostenryck1-1/+1
2018-09-01trivial-phi: extract trivial_phi() from clean_up_phi()Luc Van Oostenryck1-3/+22
2018-09-01trivial-phi: make clean_up_phi() more sequentialLuc Van Oostenryck1-4/+5
2018-09-01move DEF_OPCODE() to header fileLuc Van Oostenryck1-7/+0
2018-08-31Merge branch 'opcode' into tipLuc Van Oostenryck1-3/+25
2018-08-26add a function to remove deadborn instructionsLuc Van Oostenryck1-0/+22
2018-08-25add a flag for volatile memopsLuc Van Oostenryck1-1/+1
2018-08-25symaddr: s/insn->symbol/insn->src/Luc Van Oostenryck1-3/+3
2018-08-24Merge branches 'optim-trunc-or' and 'optim-mask-shift-or' into tipLuc Van Oostenryck1-18/+61
2018-08-24simplify TRUNC(SHIFT(a | b, S), N)Luc Van Oostenryck1-0/+6
2018-08-24simplify AND(SHIFT(a | b, S), M)Luc Van Oostenryck1-0/+18
2018-08-23prepare simplification of MASK(SHIFT(a | b, S), M)Luc Van Oostenryck1-4/+22
2018-08-23doc: extend simplification notationLuc Van Oostenryck1-13/+15
2018-08-22simplify TRUNC((x & M') | y, N)Luc Van Oostenryck1-0/+8
2018-08-22Merge branches 'optim-shift-and' and 'optim-bitfield' into tipLuc Van Oostenryck1-45/+95
2018-08-22simplify ((x & M) << S) when (M << S) == (-1 << S)Luc Van Oostenryck1-0/+2
2018-08-22simplify ((x & M) << S) when (M << S) == 0Luc Van Oostenryck1-0/+11
2018-08-22simplify ((x & M) >> S) when (M >> S) == (-1 >> S)Luc Van Oostenryck1-0/+2
2018-08-22simplify ((x & M) >> S) when (M >> S) == 0Luc Van Oostenryck1-1/+5
2018-08-22use an intermediate mask in simplify_shift()Luc Van Oostenryck1-3/+3
2018-08-22simplify SHL((x & M') | y, S)Luc Van Oostenryck1-0/+4
2018-08-22simplify OP((x | C), K) when (C & M) != CLuc Van Oostenryck1-0/+4
2018-08-22simplify OP((x | C), K) when (C & M) == MLuc Van Oostenryck1-0/+4
2018-08-22simplify OP((x | C), K) when (C & M) == 0Luc Van Oostenryck1-0/+9
2018-08-22simplify OP(((x & M') | y), K) when (M' & M) != M'Luc Van Oostenryck1-0/+5
2018-08-22simplify OP(((x & M') | y), K) when (M' & M) == MLuc Van Oostenryck1-0/+8
2018-08-22move opcode test inside simplify_mask_or_and()Luc Van Oostenryck1-3/+7
2018-08-22allow simplification of OP(((x & y) | (a & M')), K)Luc Van Oostenryck1-2/+5
2018-08-22switch return order in simplify_mask_or_and()Luc Van Oostenryck1-6/+5
2018-08-22document simplify_mask_or() & simplify_mask_or_and()Luc Van Oostenryck1-0/+21
2018-08-22use better names for simplify_mask_or_and() varsLuc Van Oostenryck1-3/+4
2018-08-22add simplify_mask_or()Luc Van Oostenryck1-16/+14
2018-08-22unify simplify_lsr_or() & simplify_and_or_mask()Luc Van Oostenryck1-33/+23
2018-08-21doc: add doc for simplification notationLuc Van Oostenryck1-0/+24
2018-08-21doc: reword doc for replace_pseudo()Luc Van Oostenryck1-1/+1
2018-08-21doc: convert existing simplify.c doc into ReST autodocLuc Van Oostenryck1-36/+43
2018-08-17Merge branches 'optim-shl-lsr' and 'optim-trunc-trunc' into tipLuc Van Oostenryck1-2/+7
2018-08-17simplify TRUNC(TRUNC(x))Luc Van Oostenryck1-0/+3
2018-08-17reorganize simplification of ZEXT(TRUNC(x))Luc Van Oostenryck1-2/+4
2018-08-17simplify ((x >> S) << S)Luc Van Oostenryck1-0/+7
2018-08-17reorganize shift-shift simplificationLuc Van Oostenryck1-6/+8
2018-08-17simpler guard in LSR-SHL simplificationLuc Van Oostenryck1-3/+1
2018-08-08Merge branches 'fix-inc-dec-size' and 'optim-mask' into tipLuc Van Oostenryck1-7/+85
2018-08-08simplify (x & M) >> S to (x >> S) & (M >> S)Luc Van Oostenryck1-0/+14
2018-08-08simplify (x << S) >> S into x & (-1 >> S)Luc Van Oostenryck1-0/+11
2018-08-08simplify ((x & M) | y) >> S to (y >> S) when (M >> S) == 0Luc Van Oostenryck1-0/+24
2018-08-08simplify ((x & M') | y ) & M into (y & M) when (M' & M) == 0Luc Van Oostenryck1-0/+23
2018-08-08reorg code for shift-shift simplificationLuc Van Oostenryck1-5/+10
2018-08-07use multi_users() instead on nbr_users()Luc Van Oostenryck1-3/+3
2018-08-07Merge branch 'fix-logical-extra' into tipLuc Van Oostenryck1-1/+52
2018-08-07avoid infinite simplification loops of the second kindLuc Van Oostenryck1-2/+3
2018-08-06simplify AND(SETCC(x,y), M)Luc Van Oostenryck1-0/+5
2018-08-06simplify TRUNC(SETCC(x,y), N)Luc Van Oostenryck1-0/+2
2018-08-06simplify SEXT(SETCC(x,y), N)Luc Van Oostenryck1-0/+4
2018-08-06simplify ZEXT(SETCC(x,y), N)Luc Van Oostenryck1-0/+13
2018-08-06simplify SETNE(TRUNC(x,N),{0,1})Luc Van Oostenryck1-0/+17
2018-08-06simplify SETNE(AND(X,1),0) to AND(X,1)Luc Van Oostenryck1-0/+10
2018-08-06fix size corruption when simplifing 'x != 0' to 'x'Luc Van Oostenryck1-1/+1
2018-08-04Merge branch 'list-optims' (early part) into tipLuc Van Oostenryck1-2/+2