https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89497
--- Comment #19 from Martin Liška <marxin at gcc dot gnu.org> --- (In reply to Richard Biener from comment #18) > GIMPLE testcase that doesn't fail, possibly because of NOPs or because of > missing range info or whatever... > > typedef struct { > char array[81]; > } container; > container *get(); > int guard = 0; > container c; > > void __GIMPLE (startwith("vrp1")) > d () > { > long unsigned int len2; > container * a; > char * _1; > int _18; > int i_19; > > bb_2: > a_6 = get (); > if (a_6 != _Literal (struct container *) 0) > goto bb_3; > else > goto bb_8; > > bb_3: > _18 = guard; > if (_18 != 0) > goto bb_5; > else > goto bb_4; > > bb_4: > ; > > bb_5: > i_19 = __PHI (bb_3: 0, bb_4: 1); > _1 = &a_6->array[0]; > len2_15 = __builtin_strlen (&c.array); > if (len2_15 > 81ul) > goto bb_6; > else > goto bb_7; > > bb_6: > ; > > bb_7: > len2_17 = __PHI (bb_5: len2_15, bb_6: 81ul); > __builtin_memmove (_1, &c.array, len2_17); > > bb_8: > return; > > } Who knows, I can see the jump threading happens: Visiting statement: _1_23 = &a_25->array[0]; LKUP STMT len2_15 = __builtin_strlen (&c.array) with .MEM_22 <<<< COPY i_19_19 = 1 Registering jump thread: (4, 5) incoming edge; (5, 9) normal; 1>>> STMT 1 = len2_15 le_expr 81 1>>> STMT 0 = len2_15 gt_expr 81 0>>> COPY len2_27 = len2_15 <<<< STMT 0 = len2_15 gt_expr 81 <<<< STMT 1 = len2_15 le_expr 81 <<<< COPY len2_27 = len2_15 0>>> COPY i_19_19 = 0 LKUP STMT _1_23 = &a_25->array[0] Visiting statement: _1_23 = &a_25->array[0]; LKUP STMT len2_15 = __builtin_strlen (&c.array) with .MEM_22 <<<< COPY i_19_19 = 0 Registering jump thread: (3, 5) incoming edge; (5, 9) normal; Threaded jump 4 --> 5 to 10 Threaded jump 3 --> 5 to 10 Removing basic block 5 ;; basic block 5, loop depth 0 ;; pred: # i_19_19 = PHI <> bb_5: _1_23 = &a_6->array[0]; len2_15 = __builtin_strlen (&c.array); if (0 != 0) goto <bb 6>; [INV] else goto <bb 9>; [INV] ;; succ: 6 ;; 9 and the BB is removed, but I can't see the ICE.