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.