authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-11 15:44:06-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-11 15:44:06-04:00
loge1d14e73b5f9c7a8d1a92ccd36cb689d625faf57
tree29253dfee7859ccb360887e347f021335cdffaa7
parent60c386180570d9d3830f8375bbad761cf721c6d3
signature Commit is signed but in an unrecognized format.

fix `@bitCast` semantics when there is no parent result loc


4 files changed, 59 insertions(+), 2 deletions(-)

src/all_types.hpp+9
...@@ -44,6 +44,7 @@ struct IrAnalyze;...@@ -44,6 +44,7 @@ struct IrAnalyze;
44struct ResultLoc;44struct ResultLoc;
45struct ResultLocPeer;45struct ResultLocPeer;
46struct ResultLocPeerParent;46struct ResultLocPeerParent;
47struct ResultLocBitCast;
4748
48enum X64CABIClass {49enum X64CABIClass {
49 X64CABIClass_Unknown,50 X64CABIClass_Unknown,
...@@ -2272,6 +2273,7 @@ enum IrInstructionId {...@@ -2272,6 +2273,7 @@ enum IrInstructionId {
2272 IrInstructionIdTestComptime,2273 IrInstructionIdTestComptime,
2273 IrInstructionIdPtrCastSrc,2274 IrInstructionIdPtrCastSrc,
2274 IrInstructionIdPtrCastGen,2275 IrInstructionIdPtrCastGen,
2276 IrInstructionIdBitCastSrc,
2275 IrInstructionIdBitCastGen,2277 IrInstructionIdBitCastGen,
2276 IrInstructionIdWidenOrShorten,2278 IrInstructionIdWidenOrShorten,
2277 IrInstructionIdIntToPtr,2279 IrInstructionIdIntToPtr,
...@@ -3159,6 +3161,13 @@ struct IrInstructionPtrCastGen {...@@ -3159,6 +3161,13 @@ struct IrInstructionPtrCastGen {
3159 bool safety_check_on;3161 bool safety_check_on;
3160};3162};
31613163
3164struct IrInstructionBitCastSrc {
3165 IrInstruction base;
3166
3167 IrInstruction *operand;
3168 ResultLocBitCast *result_loc_bit_cast;
3169};
3170
3162struct IrInstructionBitCastGen {3171struct IrInstructionBitCastGen {
3163 IrInstruction base;3172 IrInstruction base;
31643173
src/codegen.cpp+1
...@@ -5543,6 +5543,7 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,...@@ -5543,6 +5543,7 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
5543 case IrInstructionIdContainerInitList:5543 case IrInstructionIdContainerInitList:
5544 case IrInstructionIdSliceSrc:5544 case IrInstructionIdSliceSrc:
5545 case IrInstructionIdRef:5545 case IrInstructionIdRef:
5546 case IrInstructionIdBitCastSrc:
5546 zig_unreachable();5547 zig_unreachable();
55475548
5548 case IrInstructionIdDeclVarGen:5549 case IrInstructionIdDeclVarGen:
src/ir.cpp+39-2
...@@ -792,6 +792,10 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionPtrCastGen *) {...@@ -792,6 +792,10 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionPtrCastGen *) {
792 return IrInstructionIdPtrCastGen;792 return IrInstructionIdPtrCastGen;
793}793}
794794
795static constexpr IrInstructionId ir_instruction_id(IrInstructionBitCastSrc *) {
796 return IrInstructionIdBitCastSrc;
797}
798
795static constexpr IrInstructionId ir_instruction_id(IrInstructionBitCastGen *) {799static constexpr IrInstructionId ir_instruction_id(IrInstructionBitCastGen *) {
796 return IrInstructionIdBitCastGen;800 return IrInstructionIdBitCastGen;
797}801}
...@@ -2515,6 +2519,18 @@ static IrInstruction *ir_build_load_ptr_gen(IrAnalyze *ira, IrInstruction *sourc...@@ -2515,6 +2519,18 @@ static IrInstruction *ir_build_load_ptr_gen(IrAnalyze *ira, IrInstruction *sourc
2515 return &instruction->base;2519 return &instruction->base;
2516}2520}
25172521
2522static IrInstruction *ir_build_bit_cast_src(IrBuilder *irb, Scope *scope, AstNode *source_node,
2523 IrInstruction *operand, ResultLocBitCast *result_loc_bit_cast)
2524{
2525 IrInstructionBitCastSrc *instruction = ir_build_instruction<IrInstructionBitCastSrc>(irb, scope, source_node);
2526 instruction->operand = operand;
2527 instruction->result_loc_bit_cast = result_loc_bit_cast;
2528
2529 ir_ref_instruction(operand, irb->current_basic_block);
2530
2531 return &instruction->base;
2532}
2533
2518static IrInstruction *ir_build_bit_cast_gen(IrAnalyze *ira, IrInstruction *source_instruction,2534static IrInstruction *ir_build_bit_cast_gen(IrAnalyze *ira, IrInstruction *source_instruction,
2519 IrInstruction *operand, ZigType *ty)2535 IrInstruction *operand, ZigType *ty)
2520{2536{
...@@ -4941,7 +4957,8 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo...@@ -4941,7 +4957,8 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
4941 if (arg1_value == irb->codegen->invalid_instruction)4957 if (arg1_value == irb->codegen->invalid_instruction)
4942 return arg1_value;4958 return arg1_value;
49434959
4944 return ir_lval_wrap(irb, scope, arg1_value, lval, result_loc);4960 IrInstruction *bitcast = ir_build_bit_cast_src(irb, scope, arg1_node, arg1_value, result_loc_bit_cast);
4961 return ir_lval_wrap(irb, scope, bitcast, lval, result_loc);
4945 }4962 }
4946 case BuiltinFnIdIntToPtr:4963 case BuiltinFnIdIntToPtr:
4947 {4964 {
...@@ -14910,9 +14927,15 @@ static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_s...@@ -14910,9 +14927,15 @@ static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_s
14910 return ira->codegen->invalid_instruction;14927 return ira->codegen->invalid_instruction;
14911 }14928 }
1491214929
14930 IrInstruction *bitcasted_value;
14931 if (value != nullptr) {
14932 bitcasted_value = ir_analyze_bit_cast(ira, result_loc->source_instruction, value, dest_type);
14933 } else {
14934 bitcasted_value = nullptr;
14935 }
1491314936
14914 IrInstruction *parent_result_loc = ir_resolve_result(ira, suspend_source_instr, result_bit_cast->parent,14937 IrInstruction *parent_result_loc = ir_resolve_result(ira, suspend_source_instr, result_bit_cast->parent,
14915 dest_type, nullptr);14938 dest_type, bitcasted_value);
14916 if (parent_result_loc == nullptr || type_is_invalid(parent_result_loc->value.type) ||14939 if (parent_result_loc == nullptr || type_is_invalid(parent_result_loc->value.type) ||
14917 parent_result_loc->value.type->id == ZigTypeIdUnreachable)14940 parent_result_loc->value.type->id == ZigTypeIdUnreachable)
14918 {14941 {
...@@ -24168,6 +24191,17 @@ static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstruct...@@ -24168,6 +24191,17 @@ static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstruct
24168 return ir_const_void(ira, &instruction->base);24191 return ir_const_void(ira, &instruction->base);
24169}24192}
2417024193
24194static IrInstruction *ir_analyze_instruction_bit_cast_src(IrAnalyze *ira, IrInstructionBitCastSrc *instruction) {
24195 IrInstruction *operand = instruction->operand->child;
24196 if (type_is_invalid(operand->value.type) || instr_is_comptime(operand) ||
24197 instruction->result_loc_bit_cast->parent->gen_instruction == nullptr)
24198 {
24199 return operand;
24200 }
24201
24202 return instruction->result_loc_bit_cast->parent->gen_instruction;
24203}
24204
24171static IrInstruction *ir_analyze_instruction_base(IrAnalyze *ira, IrInstruction *instruction) {24205static IrInstruction *ir_analyze_instruction_base(IrAnalyze *ira, IrInstruction *instruction) {
24172 switch (instruction->id) {24206 switch (instruction->id) {
24173 case IrInstructionIdInvalid:24207 case IrInstructionIdInvalid:
...@@ -24472,6 +24506,8 @@ static IrInstruction *ir_analyze_instruction_base(IrAnalyze *ira, IrInstruction...@@ -24472,6 +24506,8 @@ static IrInstruction *ir_analyze_instruction_base(IrAnalyze *ira, IrInstruction
24472 return nullptr;24506 return nullptr;
24473 case IrInstructionIdEndExpr:24507 case IrInstructionIdEndExpr:
24474 return ir_analyze_instruction_end_expr(ira, (IrInstructionEndExpr *)instruction);24508 return ir_analyze_instruction_end_expr(ira, (IrInstructionEndExpr *)instruction);
24509 case IrInstructionIdBitCastSrc:
24510 return ir_analyze_instruction_bit_cast_src(ira, (IrInstructionBitCastSrc *)instruction);
24475 }24511 }
24476 zig_unreachable();24512 zig_unreachable();
24477}24513}
...@@ -24663,6 +24699,7 @@ bool ir_has_side_effects(IrInstruction *instruction) {...@@ -24663,6 +24699,7 @@ bool ir_has_side_effects(IrInstruction *instruction) {
24663 case IrInstructionIdTestComptime:24699 case IrInstructionIdTestComptime:
24664 case IrInstructionIdPtrCastSrc:24700 case IrInstructionIdPtrCastSrc:
24665 case IrInstructionIdPtrCastGen:24701 case IrInstructionIdPtrCastGen:
24702 case IrInstructionIdBitCastSrc:
24666 case IrInstructionIdBitCastGen:24703 case IrInstructionIdBitCastGen:
24667 case IrInstructionIdWidenOrShorten:24704 case IrInstructionIdWidenOrShorten:
24668 case IrInstructionIdPtrToInt:24705 case IrInstructionIdPtrToInt:
src/ir_print.cpp+10
...@@ -1046,6 +1046,13 @@ static void ir_print_ptr_cast_gen(IrPrint *irp, IrInstructionPtrCastGen *instruc...@@ -1046,6 +1046,13 @@ static void ir_print_ptr_cast_gen(IrPrint *irp, IrInstructionPtrCastGen *instruc
1046 fprintf(irp->f, ")");1046 fprintf(irp->f, ")");
1047}1047}
10481048
1049static void ir_print_bit_cast_src(IrPrint *irp, IrInstructionBitCastSrc *instruction) {
1050 fprintf(irp->f, "@bitCast(");
1051 ir_print_other_instruction(irp, instruction->operand);
1052 fprintf(irp->f, ")result=");
1053 ir_print_result_loc(irp, &instruction->result_loc_bit_cast->base);
1054}
1055
1049static void ir_print_bit_cast_gen(IrPrint *irp, IrInstructionBitCastGen *instruction) {1056static void ir_print_bit_cast_gen(IrPrint *irp, IrInstructionBitCastGen *instruction) {
1050 fprintf(irp->f, "@bitCast(");1057 fprintf(irp->f, "@bitCast(");
1051 ir_print_other_instruction(irp, instruction->operand);1058 ir_print_other_instruction(irp, instruction->operand);
...@@ -1860,6 +1867,9 @@ static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {...@@ -1860,6 +1867,9 @@ static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {
1860 case IrInstructionIdPtrCastGen:1867 case IrInstructionIdPtrCastGen:
1861 ir_print_ptr_cast_gen(irp, (IrInstructionPtrCastGen *)instruction);1868 ir_print_ptr_cast_gen(irp, (IrInstructionPtrCastGen *)instruction);
1862 break;1869 break;
1870 case IrInstructionIdBitCastSrc:
1871 ir_print_bit_cast_src(irp, (IrInstructionBitCastSrc *)instruction);
1872 break;
1863 case IrInstructionIdBitCastGen:1873 case IrInstructionIdBitCastGen:
1864 ir_print_bit_cast_gen(irp, (IrInstructionBitCastGen *)instruction);1874 ir_print_bit_cast_gen(irp, (IrInstructionBitCastGen *)instruction);
1865 break;1875 break;