[LLVMbugs] [Bug 11470] New: clang incorrectly marks all return slot parameters as noalias
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri Dec 2 19:46:13 PST 2011
http://llvm.org/bugs/show_bug.cgi?id=11470
Bug #: 11470
Summary: clang incorrectly marks all return slot parameters as
noalias
Product: clang
Version: unspecified
Platform: PC
OS/Version: Linux
Status: NEW
Keywords: miscompilation
Severity: enhancement
Priority: P
Component: C++
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: richard-llvm at metafoo.co.uk
CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu,
nicholas at mxc.ca
Classification: Unclassified
Consider the following:
struct foo { int a, b; double c, d, e; };
extern foo x;
foo f() { return { 1, x.a }; }
foo x = f();
Depending on what copy elision happens, x is initialized as either {1,0} or
{1,1}. With the double members in struct foo, we elide all the copies and an
-O0 build initializes x as {1,1}. (Without the double members, we return as i64
and get the resulting value {1,0}). However, we define f as:
define void @_Z1fv(%struct.foo* noalias sret %agg.result) nounwind uwtable {
This is wrong! %agg.result is not noalias. This results in us incorrectly
assuming the write to %agg.result.a and the read of @x.a do not alias, and
producing the result {1,0}. This coincidentally happens to be a legal outcome
in this case, but not in general.
Another example:
struct bar {
bar(bar *o) : ok(true) {
o->ok = false;
if (!ok)
ok = true;
}
bool ok;
double make, it, bigger;
};
bar f(bar *p) {
return p;
}
int main() {
bar self_reference = f(&self_reference);
return !self_reference.ok;
}
In a compliant compiler, main must always return 0, whether we elide the copies
or not. But in clang at -O3, it returns 1! This is again because we've
incorrectly marked the return slot in bar as noalias.
Note that, while the above initializations have undefined behaviour for const
objects, by C++11[class.ctor]p14, I believe they have well-defined behaviour in
these cases, since the objects are not const.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list