I'm trying to debug a problem cropping up in value range propagation. Ironically I probably own an original copy 1995 copy of the paper it's based on but that's not going to be much help since I'm lost in the weeds. It's running on some optimization (my structure reorg optimization) generated GIMPLE statements.
Here's the GIMPLE dump: Function max_of_y (max_of_y, funcdef_no=1, decl_uid=4391, cgraph_uid=2, symbol_order=20) (executed once) max_of_y (unsigned long data, size_t len) { double value; double result; size_t i; <bb 2> [local count: 118111600]: field_arry_addr_14 = _reorg_base_var_type_t.y; index_15 = (sizetype) data_27(D); offset_16 = index_15 * 8; field_addr_17 = field_arry_addr_14 + offset_16; field_val_temp_13 = MEM <double> [(void *)field_addr_17]; result_8 = field_val_temp_13; goto <bb 6>; [100.00%] <bb 3> [local count: 955630225]: _1 = i_3 * 16; PPI_rhs1_cast_18 = (unsigned long) data_27(D); PPI_rhs2_cast_19 = (unsigned long) _1; PtrPlusInt_Adj_20 = PPI_rhs2_cast_19 / 16; PtrPlusInt_21 = PPI_rhs1_cast_18 + PtrPlusInt_Adj_20; dedangled_27 = (unsigned long) PtrPlusInt_21; field_arry_addr_23 = _reorg_base_var_type_t.y; index_24 = (sizetype) dedangled_27; offset_25 = index_24 * 8; field_addr_26 = field_arry_addr_23 + offset_25; field_val_temp_22 = MEM <double> [(void *)field_addr_26]; value_11 = field_val_temp_22; if (result_5 < value_11) goto <bb 4>; [50.00%] else goto <bb 5>; [50.00%] <bb 4> [local count: 477815112]: <bb 5> [local count: 955630225]: # result_4 = PHI <result_5(3), value_11(4)> i_12 = i_3 + 1; <bb 6> [local count: 1073741824]: # i_3 = PHI <1(2), i_12(5)> # result_5 = PHI <result_8(2), result_4(5)> if (i_3 < len_9(D)) goto <bb 3>; [89.00%] else goto <bb 7>; [11.00%] <bb 7> [local count: 118111600]: # result_10 = PHI <result_5(6)> return result_10; } The failure in VRP is occurring on offset_16 = data_27(D) * 8; which is the from two adjacent statements above index_15 = (sizetype) data_27(D); offset_16 = index_15 * 8; being merged together. Note, the types of index_15/16 are sizetype and data_27 is unsigned long. The error message is: internal compiler error: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in to_wide, Things only start to look broken in value_range::lower_bound in value-range.cc when return wi::to_wide (t); is passed error_mark_node in t. It's getting it from m_min just above. My observation is that m_min is not always error_mark_node. In fact, I seem to think you need to use set_varying to get this to even happen. Note, the ssa_propagation_engine processed the statement "offset_16 = data..." multiple times before failing on it. What oh what is happening and how in the heck did I cause it??? Please, somebody throw me a life preserver on this. Thanks, Gary CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and contains information that is confidential and proprietary to Ampere Computing or its subsidiaries. It is to be used solely for the purpose of furthering the parties' business relationship. Any review, copying, or distribution of this email (or any attachments thereto) is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently delete the original and any copies of this email and any attachments thereto.