@@ -1343,10 +1343,28 @@ static LLVMValueRef gen_div(CodeGen *g, bool want_debug_safety, bool want_fast_m
1343
1343
return result;
1344
1344
case DivKindTrunc:
1345
1345
{
1346
- LLVMValueRef floored = gen_floor (g, result, type_entry);
1347
- LLVMValueRef ceiled = gen_ceil (g, result, type_entry);
1346
+ LLVMBasicBlockRef ltz_block = LLVMAppendBasicBlock (g->cur_fn_val , " DivTruncLTZero" );
1347
+ LLVMBasicBlockRef gez_block = LLVMAppendBasicBlock (g->cur_fn_val , " DivTruncGEZero" );
1348
+ LLVMBasicBlockRef end_block = LLVMAppendBasicBlock (g->cur_fn_val , " DivTruncEnd" );
1348
1349
LLVMValueRef ltz = LLVMBuildFCmp (g->builder , LLVMRealOLT, val1, zero, " " );
1349
- return LLVMBuildSelect (g->builder , ltz, ceiled, floored, " " );
1350
+ LLVMBuildCondBr (g->builder , ltz, ltz_block, gez_block);
1351
+
1352
+ LLVMPositionBuilderAtEnd (g->builder , ltz_block);
1353
+ LLVMValueRef ceiled = gen_ceil (g, result, type_entry);
1354
+ LLVMBasicBlockRef ceiled_end_block = LLVMGetInsertBlock (g->builder );
1355
+ LLVMBuildBr (g->builder , end_block);
1356
+
1357
+ LLVMPositionBuilderAtEnd (g->builder , gez_block);
1358
+ LLVMValueRef floored = gen_floor (g, result, type_entry);
1359
+ LLVMBasicBlockRef floored_end_block = LLVMGetInsertBlock (g->builder );
1360
+ LLVMBuildBr (g->builder , end_block);
1361
+
1362
+ LLVMPositionBuilderAtEnd (g->builder , end_block);
1363
+ LLVMValueRef phi = LLVMBuildPhi (g->builder , type_entry->type_ref , " " );
1364
+ LLVMValueRef incoming_values[] = { ceiled, floored };
1365
+ LLVMBasicBlockRef incoming_blocks[] = { ceiled_end_block, floored_end_block };
1366
+ LLVMAddIncoming (phi, incoming_values, incoming_blocks, 2 );
1367
+ return phi;
1350
1368
}
1351
1369
case DivKindFloor:
1352
1370
return gen_floor (g, result, type_entry);
@@ -4080,7 +4098,7 @@ static void validate_inline_fns(CodeGen *g) {
4080
4098
}
4081
4099
4082
4100
static void do_code_gen (CodeGen *g) {
4083
- if (g->verbose ) {
4101
+ if (g->verbose || g-> verbose_ir ) {
4084
4102
fprintf (stderr, " \n Code Generation:\n " );
4085
4103
fprintf (stderr, " ------------------\n " );
4086
4104
}
@@ -4358,7 +4376,7 @@ static void do_code_gen(CodeGen *g) {
4358
4376
4359
4377
ZigLLVMDIBuilderFinalize (g->dbuilder );
4360
4378
4361
- if (g->verbose ) {
4379
+ if (g->verbose || g-> verbose_ir ) {
4362
4380
LLVMDumpModule (g->module );
4363
4381
}
4364
4382
0 commit comments