https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126658
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
<bb 6> [local count: 105119324]:
+ _13 = (unsigned long) g_33;
+ _1 = (unsigned long) p1_20(D);
+ _49 = _13 - _1;
+ ivtmp.19_28 = _49 + 18446744073709551608;
<bb 7> [local count: 955630224]:
- # g_34 = PHI <g_22(14), g_33(6)>
# c_lsm.11_3 = PHI <c_lsm.11_8(14), _14(D)(6)>
# c_lsm_flag.12_7 = PHI <c_lsm_flag.12_15(14), 0(6)>
- g_22 = g_34 + 18446744073709551608;
- _5 = g_22 - p1_20(D);
+ # ivtmp.19_41 = PHI <ivtmp.19_29(14), ivtmp.19_28(6)>
+ _5 = (long int) ivtmp.19_41;
_6 = _5 /[ex] 8;
b = _6;
- _9 = (long unsigned int) _5;
- _10 = p3_24(D) + _9;
- _11 = *_10;
+ _50 = (void *) ivtmp.19_41;
+ _51 = (sizetype) p3_24(D);
+ _11 = MEM[(long long int *)_50 + _51 * 1];
if (_11 != 0)
goto <bb 8>; [50.00%]
else
@@ -91,7 +103,8 @@
<bb 9> [local count: 955630224]:
# c_lsm.11_8 = PHI <c_lsm.11_3(7), 3(8)>
# c_lsm_flag.12_15 = PHI <c_lsm_flag.12_7(7), 1(8)>
- if (p1_20(D) != g_22)
+ ivtmp.19_29 = ivtmp.19_41 - 8;
+ if (ivtmp.19_29 != 18446744073709551608)
goto <bb 14>; [89.00%]
else
goto <bb 10>; [11.00%]
and segfaults at
=> 0x0000000000400614 <+148>: cmpq $0x0,(%rdx,%rax,1)
(gdb) p p3
$5 = (long long *) 0x7fffffffdd68
(gdb) p/x $rdx
$4 = 0x7fffffffdd68
(gdb) p/x $rax
$6 = 0xffffffffff801290
(get_scalar_evolution
(scalar = _10)
(scalar_evolution = {p3_24(D) + (((unsigned long) g_33 - (unsigned long)
p1_20(D)) + 18446744073709551608), +, 18446744073709551608}_2))
)
IV struct:
SSA_NAME: _10
Type: long long int *
Base: (long long int *) ((((unsigned long) p3_24(D) + (unsigned long) g_33) -
(unsigned long) p1_20(D)) + 18446744073709551608)
Step: 18446744073709551608
Object: 0
Biv: N
Overflowness wrto loop niter: No-overflow
So in the end IVOPTs choses a base object that isn't the base but that
should be OK here. So something goes wrong elsewhere - on RTL?