; start of dump from pass_vrp (../../src/gcc/tree-vrp.c:10459) ;; Function ravif2 (ravif2, funcdef_no=0, decl_uid=364, cgraph_uid=0, symbol_order=0) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 ;; 2 succs { 3 4 } ;; 3 succs { 4 } ;; 4 succs { 1 } ASSERT_EXPRs to be inserted Assertions to be inserted for L_3(D) _4 = L_3(D)->ci; BB #2 PREDICATE: L_3(D) ne_expr 0B Assertions to be inserted for _4 _5 = _4->func; BB #2 PREDICATE: _4 ne_expr 0B Assertions to be inserted for cl_6 _10 = cl_6->p; BB #2 PREDICATE: cl_6 ne_expr 0B Assertions to be inserted for base_9 MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; BB #2 PREDICATE: base_9 ne_expr 0B Assertions to be inserted for _11 _12 = _11->value_.i; BB #2 PREDICATE: _11 ne_expr 0B Updating SSA: Registering new PHI nodes in block #2 Updating SSA information for statement _4 = L_3(D)->ci; Updating SSA information for statement L_17 = ASSERT_EXPR ; Updating SSA information for statement _5 = _4->func; Updating SSA information for statement _28 = ASSERT_EXPR <_4, _4 != 0B>; Updating SSA information for statement cl_6 = _5->value_.gc; Updating SSA information for statement raviV_op_loadnil (_4, 0, 0); Updating SSA information for statement _8 = L_3(D)->ci; Updating SSA information for statement base_9 = _8->u.l.base; Updating SSA information for statement _10 = cl_6->p; Updating SSA information for statement cl_29 = ASSERT_EXPR ; Updating SSA information for statement _11 = _10->k; Updating SSA information for statement _12 = _11->value_.i; Updating SSA information for statement _31 = ASSERT_EXPR <_11, _11 != 0B>; Updating SSA information for statement MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; Updating SSA information for statement base_30 = ASSERT_EXPR ; Updating SSA information for statement MEM[(struct ravi_TValue *)base_9 + 16B].tt_ = 1; Updating SSA information for statement _15 = _11->value_.i; Updating SSA information for statement MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _15; Updating SSA information for statement _19 = L_3(D)->ci; Updating SSA information for statement L_3(D)->top = _21; Updating SSA information for statement _23 = cl_6->p; Registering new PHI nodes in block #3 Updating SSA information for statement luaF_close (L_3(D), base_20); Registering new PHI nodes in block #4 Updating SSA information for statement luaD_poscall (L_3(D), _26); SSA replacement table N_i -> { O_1 ... O_j } means that N_i replaces O_1, ..., O_j L_17 -> { L_3(D) } _28 -> { _4 } cl_29 -> { cl_6 } base_30 -> { base_9 } _31 -> { _11 } Incremental SSA update started at block: 2 Number of blocks in CFG: 5 Number of blocks to update: 3 ( 60%) Affected blocks: 2 3 4 SSA form after inserting ASSERT_EXPRs ravif2 (struct ravi_lua_State * L) { struct ravi_TValue * base; struct ravi_LClosure * cl; struct ravi_CallInfo * _4; struct ravi_TValue * _5; struct ravi_CallInfo * _8; struct ravi_Proto * _10; struct ravi_TValue * _11; signed long _12; signed long _15; struct ravi_CallInfo * _19; struct ravi_TValue * _21; struct ravi_Proto * _23; signed int _24; struct ravi_TValue * _26; struct ravi_CallInfo * _28; struct ravi_TValue * _31; entry: _4 = L_3(D)->ci; L_17 = ASSERT_EXPR ; _5 = _4->func; _28 = ASSERT_EXPR <_4, _4 != 0B>; cl_6 = _5->value_.gc; raviV_op_loadnil (_28, 0, 0); _8 = L_17->ci; base_9 = _8->u.l.base; _10 = cl_6->p; cl_29 = ASSERT_EXPR ; _11 = _10->k; _12 = _11->value_.i; _31 = ASSERT_EXPR <_11, _11 != 0B>; MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; base_30 = ASSERT_EXPR ; MEM[(struct ravi_TValue *)base_30 + 16B].tt_ = 1; _15 = _31->value_.i; MEM[(struct ravi_TValue *)base_30 + 16B].value_.i = _15; printf ("OP_RETURN(pc=%d) return %d args", 13, 1); _19 = L_17->ci; base_20 = _19->u.l.base; _21 = base_20 + 32; L_17->top = _21; _23 = cl_29->p; _24 = _23->sizep; if (_24 > 0) goto (OP_RETURN_if_sizep_gt_0_12_23); else goto (OP_RETURN_else_sizep_gt_0_12_24); OP_RETURN_if_sizep_gt_0_12_23: luaF_close (L_17, base_20); OP_RETURN_else_sizep_gt_0_12_24: _26 = base_20 + 16; luaD_poscall (L_17, _26); return 1; } Immediate_uses: .MEM_1 : --> single use. # .MEM_27 = VDEF <.MEM_1> luaD_poscall (L_17, _26); .MEM_2(D) : -->4 uses. # .MEM_7 = VDEF <.MEM_2(D)> raviV_op_loadnil (_28, 0, 0); # VUSE <.MEM_2(D)> cl_6 = _5->value_.gc; # VUSE <.MEM_2(D)> _5 = _4->func; # VUSE <.MEM_2(D)> _4 = L_3(D)->ci; L_3(D) : -->3 uses. L_17 = ASSERT_EXPR ; L_17 = ASSERT_EXPR ; _4 = L_3(D)->ci; _4 : -->3 uses. _28 = ASSERT_EXPR <_4, _4 != 0B>; _28 = ASSERT_EXPR <_4, _4 != 0B>; _5 = _4->func; _5 : --> single use. cl_6 = _5->value_.gc; cl_6 : -->3 uses. cl_29 = ASSERT_EXPR ; cl_29 = ASSERT_EXPR ; _10 = cl_6->p; .MEM_7 : -->6 uses. # .MEM_13 = VDEF <.MEM_7> MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; # VUSE <.MEM_7> _12 = _11->value_.i; # VUSE <.MEM_7> _11 = _10->k; # VUSE <.MEM_7> _10 = cl_6->p; # VUSE <.MEM_7> base_9 = _8->u.l.base; # VUSE <.MEM_7> _8 = L_17->ci; _8 : --> single use. base_9 = _8->u.l.base; base_9 : -->3 uses. base_30 = ASSERT_EXPR ; base_30 = ASSERT_EXPR ; MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; _10 : --> single use. _11 = _10->k; _11 : -->3 uses. _31 = ASSERT_EXPR <_11, _11 != 0B>; _31 = ASSERT_EXPR <_11, _11 != 0B>; _12 = _11->value_.i; _12 : --> single use. MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; .MEM_13 : --> single use. # .MEM_14 = VDEF <.MEM_13> MEM[(struct ravi_TValue *)base_30 + 16B].tt_ = 1; .MEM_14 : -->2 uses. # VUSE <.MEM_14> _15 = _31->value_.i; # .MEM_16 = VDEF <.MEM_14> MEM[(struct ravi_TValue *)base_30 + 16B].value_.i = _15; _15 : --> single use. MEM[(struct ravi_TValue *)base_30 + 16B].value_.i = _15; .MEM_16 : --> single use. # .MEM_18 = VDEF <.MEM_16> printf ("OP_RETURN(pc=%d) return %d args", 13, 1); L_17 : -->5 uses. luaD_poscall (L_17, _26); luaF_close (L_17, base_20); L_17->top = _21; _19 = L_17->ci; _8 = L_17->ci; .MEM_18 : -->3 uses. # .MEM_22 = VDEF <.MEM_18> L_17->top = _21; # VUSE <.MEM_18> base_20 = _19->u.l.base; # VUSE <.MEM_18> _19 = L_17->ci; _19 : --> single use. base_20 = _19->u.l.base; base_20 : -->3 uses. _26 = base_20 + 16; _21 = base_20 + 32; luaF_close (L_17, base_20); _21 : --> single use. L_17->top = _21; .MEM_22 : -->4 uses. # .MEM_25 = VDEF <.MEM_22> luaF_close (L_17, base_20); .MEM_1 = PHI <.MEM_22(2), .MEM_25(3)> # VUSE <.MEM_22> _24 = _23->sizep; # VUSE <.MEM_22> _23 = cl_29->p; _23 : --> single use. _24 = _23->sizep; _24 : --> single use. if (_24 > 0) .MEM_25 : --> single use. .MEM_1 = PHI <.MEM_22(2), .MEM_25(3)> _26 : --> single use. luaD_poscall (L_17, _26); .MEM_27 : --> single use. # VUSE <.MEM_27> return 1; _28 : --> single use. raviV_op_loadnil (_28, 0, 0); cl_29 : --> single use. _23 = cl_29->p; base_30 : -->2 uses. MEM[(struct ravi_TValue *)base_30 + 16B].value_.i = _15; MEM[(struct ravi_TValue *)base_30 + 16B].tt_ = 1; _31 : --> single use. _15 = _31->value_.i; Adding Destination of edge (0 -> 2) to worklist Simulating block 2 Visiting statement: L_17 = ASSERT_EXPR ; Intersecting ~[0B, 0B] EQUIVALENCES: { L_3(D) } (1 elements) and VARYING to ~[0B, 0B] EQUIVALENCES: { L_3(D) } (1 elements) Found new range for L_17: ~[0B, 0B] marking stmt to be not simulated again Visiting statement: _28 = ASSERT_EXPR <_4, _4 != 0B>; Intersecting ~[0B, 0B] EQUIVALENCES: { _4 } (1 elements) and VARYING to ~[0B, 0B] EQUIVALENCES: { _4 } (1 elements) Found new range for _28: ~[0B, 0B] marking stmt to be not simulated again Visiting statement: cl_29 = ASSERT_EXPR ; Intersecting ~[0B, 0B] EQUIVALENCES: { cl_6 } (1 elements) and VARYING to ~[0B, 0B] EQUIVALENCES: { cl_6 } (1 elements) Found new range for cl_29: ~[0B, 0B] marking stmt to be not simulated again Visiting statement: _31 = ASSERT_EXPR <_11, _11 != 0B>; Intersecting ~[0B, 0B] EQUIVALENCES: { _11 } (1 elements) and VARYING to ~[0B, 0B] EQUIVALENCES: { _11 } (1 elements) Found new range for _31: ~[0B, 0B] marking stmt to be not simulated again Visiting statement: base_30 = ASSERT_EXPR ; Intersecting ~[0B, 0B] EQUIVALENCES: { base_9 } (1 elements) and VARYING to ~[0B, 0B] EQUIVALENCES: { base_9 } (1 elements) Found new range for base_30: ~[0B, 0B] marking stmt to be not simulated again Visiting statement: _21 = base_20 + 32; Found new range for _21: VARYING Visiting statement: if (_24 > 0) Visiting conditional with predicate: if (_24 > 0) With known ranges _24: VARYING Predicate evaluates to: DON'T KNOW Adding Destination of edge (2 -> 3) to worklist Adding Destination of edge (2 -> 4) to worklist Simulating block 3 Simulating block 4 Visiting statement: _26 = base_20 + 16; Found new range for _26: VARYING Visiting statement: return 1; Value ranges after VRP: .MEM_1: VARYING L_3(D): VARYING _4: VARYING _5: VARYING cl_6: VARYING _8: VARYING base_9: VARYING _10: VARYING _11: VARYING _12: VARYING _15: VARYING L_17: ~[0B, 0B] EQUIVALENCES: { L_3(D) } (1 elements) _19: VARYING base_20: VARYING _21: VARYING _23: VARYING _24: VARYING _26: VARYING _28: ~[0B, 0B] EQUIVALENCES: { _4 } (1 elements) cl_29: ~[0B, 0B] EQUIVALENCES: { cl_6 } (1 elements) base_30: ~[0B, 0B] EQUIVALENCES: { base_9 } (1 elements) _31: ~[0B, 0B] EQUIVALENCES: { _11 } (1 elements) Substituting values and folding statements Folding statement: entry: Not folded Folding statement: _4 = L_3(D)->ci; Not folded Folding statement: _5 = _4->func; Not folded Folding statement: cl_6 = _5->value_.gc; Not folded Folding statement: raviV_op_loadnil (_28, 0, 0); Not folded Folding statement: _8 = L_17->ci; Not folded Folding statement: base_9 = _8->u.l.base; Not folded Folding statement: _10 = cl_6->p; Not folded Folding statement: _11 = _10->k; Not folded Folding statement: _12 = _11->value_.i; Not folded Folding statement: MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; Not folded Folding statement: MEM[(struct ravi_TValue *)base_30 + 16B].tt_ = 1; Not folded Folding statement: _15 = _31->value_.i; Not folded Folding statement: MEM[(struct ravi_TValue *)base_30 + 16B].value_.i = _15; Not folded Folding statement: printf ("OP_RETURN(pc=%d) return %d args", 13, 1); Not folded Folding statement: _19 = L_17->ci; Not folded Folding statement: base_20 = _19->u.l.base; Not folded Folding statement: _21 = base_20 + 32; Not folded Folding statement: L_17->top = _21; Not folded Folding statement: _23 = cl_29->p; Not folded Folding statement: _24 = _23->sizep; Not folded Folding statement: if (_24 > 0) Not folded Folding statement: OP_RETURN_if_sizep_gt_0_12_23: Not folded Folding statement: luaF_close (L_17, base_20); Not folded Folding statement: OP_RETURN_else_sizep_gt_0_12_24: Not folded Folding statement: _26 = base_20 + 16; Not folded Folding statement: luaD_poscall (L_17, _26); Not folded Folding statement: return 1; Not folded ravif2 (struct ravi_lua_State * L) { struct ravi_TValue * base; struct ravi_LClosure * cl; struct ravi_CallInfo * _4; struct ravi_TValue * _5; struct ravi_CallInfo * _8; struct ravi_Proto * _10; struct ravi_TValue * _11; signed long _12; signed long _15; struct ravi_CallInfo * _19; struct ravi_TValue * _21; struct ravi_Proto * _23; signed int _24; struct ravi_TValue * _26; entry: _4 = L_3(D)->ci; _5 = _4->func; cl_6 = _5->value_.gc; raviV_op_loadnil (_4, 0, 0); _8 = L_3(D)->ci; base_9 = _8->u.l.base; _10 = cl_6->p; _11 = _10->k; _12 = _11->value_.i; MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _12; MEM[(struct ravi_TValue *)base_9 + 16B].tt_ = 1; _15 = _11->value_.i; MEM[(struct ravi_TValue *)base_9 + 16B].value_.i = _15; printf ("OP_RETURN(pc=%d) return %d args", 13, 1); _19 = L_3(D)->ci; base_20 = _19->u.l.base; _21 = base_20 + 32; L_3(D)->top = _21; _23 = cl_6->p; _24 = _23->sizep; if (_24 > 0) goto (OP_RETURN_if_sizep_gt_0_12_23); else goto (OP_RETURN_else_sizep_gt_0_12_24); OP_RETURN_if_sizep_gt_0_12_23: luaF_close (L_3(D), base_20); OP_RETURN_else_sizep_gt_0_12_24: _26 = base_20 + 16; luaD_poscall (L_3(D), _26); return 1; } ; end of dump from pass_vrp (../../src/gcc/tree-vrp.c:10459)