The regression test gte/20091229-1.c fails for test-s08-stack-auto when enabled in support/regression/MakeList.(for now the test-s08-stack-auto target is only in the next branch, after 4.3.0 in trunk).
I believe this is due to incorrect icode generation.
both:
return v / -0x080000000LL;
and
return v / 0x080000000LL;
generate the exact same icode stream.
in this case:
long long foo (long long v)
{
return v / -0x080000000LL;
}
gte/20091229-1.c fails on multiple architectures.
I believe this is due to incorrect icode generation.
both:
return v / -0x080000000LL;
and
return v / 0x080000000LL;
generate the exact same icode stream.
in this case:
long long foo (long long v)
{
return v / -0x080000000LL;
}
pseudocode:
iTemp0=_foo_PARM_1;
iTemp1=(iTemp0<0);
if(iTemp1) {
iTemp0+=0x7fffffff;
}
iTemp3=iTemp0>>0x1f;
return iTemp3;
for the -0x080000000 the line:
iTemp0+=0x7fffffff;
should be:
iTemp0=-iTemp0;
for the 0x080000000 the entire if should not be in the stream.
full details:
cases/../gte/20091229-1.c: 4: return v / -0x080000000LL;
; [---] ic:2: iTemp0 [k3 lr3:8 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ] := _foo_PARM_1 [k2 lr0:0 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int xdata}
; [---] ic:3: iTemp1 [k4 lr4:5 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{unsigned-char fixed} = iTemp0 [k3 lr3:8 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ] < 0x0 {longlong-int literal}
; [---] ic:4: if iTemp1 [k4 lr4:5 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{unsigned-char fixed} == 0 goto iTempLbl0($3)
; [---] ic:5: iTemp0 [k3 lr3:8 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ] = iTemp0 [k3 lr3:8 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ] + 0x7fffffff {longlong-int literal}
; [---] ic:7: iTempLbl0($3) :
00103$:
; [---] ic:12: __srslonglong_PARM_1 [k7 lr0:0 so:0]{ ia1 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed} := iTemp0 [k3 lr3:8 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ]
; [---] ic:13: __srslonglong_PARM_2 [k8 lr0:0 so:0]{ ia1 a2p0 re0 rm0 nos0 ru0 dp0}{char fixed} := 0x1f {char literal}
; [---] ic:14: iTemp3 [k6 lr10:11 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ] = call __srslonglong [k9 lr0:0 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int function ( longlong-int fixed, char fixed) fixed}
; [---] ic:9: ret iTemp3 [k6 lr10:11 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int fixed}{ sir@ _foo_sloc0_1_0}[_foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 _foo_sloc0_1_0 ]
; [---] ic:10: _return($1) :
; [---] ic:11: eproc _foo [k1 lr0:0 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0}{longlong-int function ( longlong-int xdata) fixed}
Looks like a bug in the front-end optimization of divisions by powers of two.
Fixed in [r15213] in the next branch.
Related
Commit: [r15213]
Fix merged to trunk since.