This testcase, compiled with -O1 aborts:
% cat t.c
extern void abort(void);
long long __attribute__((noinline)) get(void)
{
return -2;
}
long long __attribute__((noinline)) get(void);
int __attribute__((noinline)) check(void)
{
long long lcn;
lcn = get();
if (lcn >= 0 || lcn == -1)
return 0;
return -1;
}
int main()
{
if (check() == 0)
abort();
return 0;
}
Reason is ix86_expand_branch, the committ for PR target/29978 misses breaks
in the switch statement, hence falls through into the wrong branch.
Obvious patch:
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 132470)
+++ config/i386/i386.c (working copy)
@@ -12148,6 +12152,7 @@ ix86_expand_branch (enum rtx_code code,
ix86_expand_branch (code, label);
return;
}
+ break;
case LE: case LEU: case GT: case GTU:
if (lo[1] == constm1_rtx)
{
@@ -12156,6 +12161,7 @@ ix86_expand_branch (enum rtx_code code,
ix86_expand_branch (code, label);
return;
}
+ break;
default:
break;
}
Richi already preapproved this patch for 4.3, I'm opening this PR anyway, to
have a reference for the testcase.
--
Summary: [4.3 regression] ntfs-3g miscompiled
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: matz at gcc dot gnu dot org
GCC target triplet: i386
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35264