https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114700
--- Comment #20 from Hu Lin <lin1.hu at intel dot com> --- Created attachment 57967 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57967&action=edit A new version When I tested this patch, I met another question. g++.dg/ubsan/vla-1.C will raise a ICE without (TREE_TYPE (@2) == ssizetype at match.pd:3497. In the original step, GCC generates the intermediate language using variables declared in other blocks. Like _5 = _1 + 1, this led to the ICE in 022t.ssa. I don't know if it is a bug, and I didn't find a test to raise this ICE on trunk. So I add a condition to avoid this optimization in this case, any other comments on my newly added conditions? I paste some information that I think is important. vla-1.C.005t.original: The original line 12 is __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, (unsigned long) ((ssizetype) SAVE_EXPR <i>)); The current is __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, (unsigned long) (((ssizetype) SAVE_EXPR <i> - 1) + 1)); vla-1.C.006t.gimple original: 22 i.0 = i; 23 if (i.0 <= 0) goto <D.3270>; else goto <D.3271>; 24 <D.3270>: 25 _1 = (unsigned long) i.0; 26 __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, _1); 27 goto <D.3272>; 28 <D.3271>: 29 <D.3272>: 30 _2 = (ssizetype) i.0; 31 _3 = _2 - 1; current: 22 i.0 = i; 23 if (i.0 <= 0) goto <D.3270>; else goto <D.3271>; 24 <D.3270>: 25 _1 = (ssizetype) i.0; 26 _2 = _1 - 1; 27 _3 = _2 + 1; 28 _4 = (unsigned long) _3; 29 __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, _4); 30 goto <D.3272>; 31 <D.3271>: 32 <D.3272>: 33 _5 = _1 - 1; vla-1.C.015t.cfg original: 37 int i.0; 38 39 <bb 2> : 40 saved_stack.5 = __builtin_stack_save (); 41 i.0 = i; 42 if (i.0 <= 0) 43 goto <bb 3>; [INV] 44 else 45 goto <bb 4>; [INV] 46 47 <bb 3> : 48 _1 = (unsigned long) i.0; 49 __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, _1); 50 51 <bb 4> : 52 _2 = (ssizetype) i.0; 53 _3 = _2 - 1; current: 37 int i.0; 38 39 <bb 2> : 40 saved_stack.5 = __builtin_stack_save (); 41 i.0 = i; 42 if (i.0 <= 0) 43 goto <bb 3>; [INV] 44 else 45 goto <bb 4>; [INV] 46 47 <bb 3> : 48 _1 = (ssizetype) i.0; 49 _2 = _1 - 1; 50 _3 = _2 + 1; 51 _4 = (unsigned long) _3; 52 __builtin___ubsan_handle_vla_bound_not_positive (&*.Lubsan_data0, _4); 53 54 <bb 4> : 55 _5 = _1 - 1; 56 _6 = (sizetype) _5; 57 D.3273 = _6;