hasNoAliasAttr is buggy: it checks to see if the called function has
a noalias attribute, which is incorrect since functions are not even
allowed to have the noalias attribute. The comment on its only
caller, llvm::isNoAliasFn, makes it pretty clear that the intention
to do the noalias check on the return value, and not the callee.
Unfortunately I couldn't find a way to test this upstream -- fixing
this does not change the observable behavior of any of the passes that
use this. This is not very surprising, since noalias does not tell
anything about the contents of the allocated memory (so, e.g., you
still cannot fold loads). I'll be happy to be proven wrong though.
Can you add an assert inside the attribute mechanism that would have caught this?