[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