@@ -141,15 +141,16 @@ static struct location NO_LOCATION = {-1, -1, -1, -1};
141
141
142
142
typedef struct jump_target_label_ {
143
143
int id ;
144
+ struct basicblock_ * block ;
144
145
} jump_target_label ;
145
146
146
- static struct jump_target_label_ NO_LABEL = {-1 };
147
+ static struct jump_target_label_ NO_LABEL = {-1 , NULL };
147
148
148
149
#define SAME_LABEL (L1 , L2 ) ((L1).id == (L2).id)
149
150
#define IS_LABEL (L ) (!SAME_LABEL((L), (NO_LABEL)))
150
151
151
152
#define NEW_JUMP_TARGET_LABEL (C , NAME ) \
152
- jump_target_label NAME = {cfg_new_label_id(CFG_BUILDER(C))}; \
153
+ jump_target_label NAME = {cfg_new_label_id(CFG_BUILDER(C)), cfg_builder_new_block(CFG_BUILDER(C)) }; \
153
154
if (!IS_LABEL(NAME)) { \
154
155
return 0; \
155
156
}
@@ -1321,12 +1322,18 @@ static int
1321
1322
cfg_builder_maybe_start_new_block (cfg_builder * g )
1322
1323
{
1323
1324
if (cfg_builder_current_block_is_terminated (g )) {
1324
- basicblock * b = cfg_builder_new_block (g );
1325
+ basicblock * b ;
1326
+ if (IS_LABEL (g -> g_current_label )) {
1327
+ b = g -> g_current_label .block ;
1328
+ b -> b_label = g -> g_current_label .id ;
1329
+ g -> g_current_label = NO_LABEL ;
1330
+ }
1331
+ else {
1332
+ b = cfg_builder_new_block (g );
1333
+ }
1325
1334
if (b == NULL ) {
1326
1335
return -1 ;
1327
1336
}
1328
- b -> b_label = g -> g_current_label .id ;
1329
- g -> g_current_label = NO_LABEL ;
1330
1337
cfg_builder_use_next_block (g , b );
1331
1338
}
1332
1339
return 0 ;
@@ -7403,15 +7410,16 @@ push_cold_blocks_to_end(cfg_builder *g, int code_flags) {
7403
7410
if (explicit_jump == NULL ) {
7404
7411
return -1 ;
7405
7412
}
7406
- jump_target_label next_label = {b -> b_next -> b_label };
7413
+ jump_target_label next_label = {b -> b_next -> b_label , b -> b_next };
7407
7414
basicblock_addop (explicit_jump , JUMP , 0 , next_label , NO_LOCATION );
7408
7415
explicit_jump -> b_cold = 1 ;
7409
7416
explicit_jump -> b_next = b -> b_next ;
7410
7417
b -> b_next = explicit_jump ;
7411
7418
7412
- /* set target */
7419
+ /* calculate target from target_label */
7420
+ /* TODO: formalize an API for adding jumps in the backend */
7413
7421
struct instr * last = basicblock_last_instr (explicit_jump );
7414
- last -> i_target = b -> b_next ;
7422
+ last -> i_target = last -> i_target_label . block ;
7415
7423
last -> i_target_label = NO_LABEL ;
7416
7424
}
7417
7425
}
0 commit comments