@@ -313,12 +313,21 @@ symbol_t *arena_alloc_symbol(void)
313
313
314
314
constant_t * arena_alloc_constant (void )
315
315
{
316
- return arena_calloc (GENERAL_ARENA , 1 , sizeof (constant_t ));
316
+ /* constant_t is simple, can avoid zeroing */
317
+ constant_t * c = arena_alloc (GENERAL_ARENA , sizeof (constant_t ));
318
+ c -> alias [0 ] = '\0' ;
319
+ c -> value = 0 ;
320
+ return c ;
317
321
}
318
322
319
323
alias_t * arena_alloc_alias (void )
320
324
{
321
- return arena_calloc (GENERAL_ARENA , 1 , sizeof (alias_t ));
325
+ /* alias_t is simple, can avoid zeroing */
326
+ alias_t * a = arena_alloc (GENERAL_ARENA , sizeof (alias_t ));
327
+ a -> alias [0 ] = '\0' ;
328
+ a -> value [0 ] = '\0' ;
329
+ a -> disabled = false;
330
+ return a ;
322
331
}
323
332
324
333
macro_t * arena_alloc_macro (void )
@@ -328,6 +337,7 @@ macro_t *arena_alloc_macro(void)
328
337
329
338
bb_traversal_args_t * arena_alloc_traversal_args (void )
330
339
{
340
+ /* Keep using calloc for safety */
331
341
return arena_calloc (GENERAL_ARENA , 1 , sizeof (bb_traversal_args_t ));
332
342
}
333
343
@@ -616,11 +626,18 @@ ph2_ir_t *add_existed_ph2_ir(ph2_ir_t *ph2_ir)
616
626
617
627
ph2_ir_t * add_ph2_ir (opcode_t op )
618
628
{
619
- ph2_ir_t * ph2_ir = arena_calloc (BB_ARENA , 1 , sizeof (ph2_ir_t ));
629
+ ph2_ir_t * ph2_ir = arena_alloc (BB_ARENA , sizeof (ph2_ir_t ));
620
630
ph2_ir -> op = op ;
621
- /* Set safe defaults; arch-lowering may annotate later */
631
+ /* Initialize all fields explicitly */
622
632
ph2_ir -> next = NULL ;
623
633
ph2_ir -> is_branch_detached = 0 ;
634
+ ph2_ir -> src0 = 0 ;
635
+ ph2_ir -> src1 = 0 ;
636
+ ph2_ir -> dest = 0 ;
637
+ ph2_ir -> func_name [0 ] = '\0' ;
638
+ ph2_ir -> next_bb = NULL ;
639
+ ph2_ir -> then_bb = NULL ;
640
+ ph2_ir -> else_bb = NULL ;
624
641
return add_existed_ph2_ir (ph2_ir );
625
642
}
626
643
@@ -633,14 +650,17 @@ void set_var_liveout(var_t *var, int end)
633
650
634
651
block_t * add_block (block_t * parent , func_t * func , macro_t * macro )
635
652
{
636
- block_t * blk = arena_calloc (BLOCK_ARENA , 1 , sizeof (block_t ));
653
+ block_t * blk = arena_alloc (BLOCK_ARENA , sizeof (block_t ));
637
654
638
- blk -> parent = parent ;
639
- blk -> func = func ;
640
- blk -> macro = macro ;
655
+ /* Initialize all fields explicitly */
656
+ blk -> locals .size = 0 ;
641
657
blk -> locals .capacity = 16 ;
642
658
blk -> locals .elements =
643
659
arena_alloc (BLOCK_ARENA , blk -> locals .capacity * sizeof (var_t * ));
660
+ blk -> parent = parent ;
661
+ blk -> func = func ;
662
+ blk -> macro = macro ;
663
+ blk -> next = NULL ;
644
664
return blk ;
645
665
}
646
666
@@ -887,15 +907,20 @@ func_t *find_func(char *func_name)
887
907
/* Create a basic block and set the scope of variables to 'parent' block */
888
908
basic_block_t * bb_create (block_t * parent )
889
909
{
910
+ /* Use arena_calloc for basic_block_t as it has many arrays that need
911
+ * zeroing (live_gen, live_kill, live_in, live_out, DF, RDF, dom_next, etc.)
912
+ * This is simpler and safer than manually initializing everything.
913
+ */
890
914
basic_block_t * bb = arena_calloc (BB_ARENA , 1 , sizeof (basic_block_t ));
891
915
892
- for (int i = 0 ; i < MAX_BB_PRED ; i ++ ) {
893
- bb -> prev [i ].bb = NULL ;
894
- bb -> prev [i ].type = NEXT ;
895
- }
916
+ /* Initialize non-zero fields */
896
917
bb -> scope = parent ;
897
918
bb -> belong_to = parent -> func ;
898
919
920
+ /* Initialize prev array with NEXT type */
921
+ for (int i = 0 ; i < MAX_BB_PRED ; i ++ )
922
+ bb -> prev [i ].type = NEXT ;
923
+
899
924
if (dump_ir )
900
925
snprintf (bb -> bb_label_name , MAX_VAR_LEN , ".label.%d" , bb_label_idx ++ );
901
926
@@ -1003,16 +1028,23 @@ void add_insn(block_t *block,
1003
1028
1004
1029
bb -> scope = block ;
1005
1030
1006
- insn_t * n = arena_calloc (INSN_ARENA , 1 , sizeof (insn_t ));
1031
+ insn_t * n = arena_alloc (INSN_ARENA , sizeof (insn_t ));
1032
+ n -> next = NULL ;
1033
+ n -> prev = NULL ;
1007
1034
n -> opcode = op ;
1008
1035
n -> rd = rd ;
1009
1036
n -> rs1 = rs1 ;
1010
1037
n -> rs2 = rs2 ;
1011
1038
n -> sz = sz ;
1039
+ n -> useful = false;
1012
1040
n -> belong_to = bb ;
1041
+ n -> phi_ops = NULL ;
1042
+ n -> idx = 0 ;
1013
1043
1014
1044
if (str )
1015
1045
strcpy (n -> str , str );
1046
+ else
1047
+ n -> str [0 ] = '\0' ;
1016
1048
1017
1049
if (!bb -> insn_list .head )
1018
1050
bb -> insn_list .head = n ;
0 commit comments