| ... | @@ -13940,8 +13940,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * | ... | @@ -13940,8 +13940,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * |
| 13940 | uint64_t old_array_len = array_type->data.array.len; | 13940 | uint64_t old_array_len = array_type->data.array.len; |
| 13941 | uint64_t new_array_len; | 13941 | uint64_t new_array_len; |
| 13942 | | 13942 | |
| 13943 | if (mul_u64_overflow(old_array_len, mult_amt, &new_array_len)) | 13943 | if (mul_u64_overflow(old_array_len, mult_amt, &new_array_len)) { |
| 13944 | { | | |
| 13945 | ir_add_error(ira, &instruction->base, buf_sprintf("operation results in overflow")); | 13944 | ir_add_error(ira, &instruction->base, buf_sprintf("operation results in overflow")); |
| 13946 | return ira->codegen->invalid_instruction; | 13945 | return ira->codegen->invalid_instruction; |
| 13947 | } | 13946 | } |
| ... | @@ -13956,6 +13955,15 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * | ... | @@ -13956,6 +13955,15 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * |
| 13956 | return result; | 13955 | return result; |
| 13957 | } | 13956 | } |
| 13958 | | 13957 | |
| | 13958 | switch (type_has_one_possible_value(ira->codegen, result->value.type)) { |
| | 13959 | case OnePossibleValueInvalid: |
| | 13960 | return ira->codegen->invalid_instruction; |
| | 13961 | case OnePossibleValueYes: |
| | 13962 | return result; |
| | 13963 | case OnePossibleValueNo: |
| | 13964 | break; |
| | 13965 | } |
| | 13966 | |
| 13959 | // TODO optimize the buf case | 13967 | // TODO optimize the buf case |
| 13960 | expand_undef_array(ira->codegen, array_val); | 13968 | expand_undef_array(ira->codegen, array_val); |
| 13961 | out_val->data.x_array.data.s_none.elements = create_const_vals(new_array_len); | 13969 | out_val->data.x_array.data.s_none.elements = create_const_vals(new_array_len); |