nikic wrote:

> > It occurs to me that the current return attribute propagation is currently 
> > buggy for poison-generating attributes: https://llvm.godbolt.org/z/x8n18q9Mj
> > In this case the argument to use() will now be poison as well, while before 
> > inlining only the return value was poison.
> > This code needs to distinguish poison and UB generating attributes.
> 
> Good catch. I think this means basically `nonnull`, `noundef`, and `align` 
> can only be propagated if there are no other uses in to-be-inlined function. 
> That sound right or do you see any more robust way forward?

Limiting poison-generating attributes to one-use while keeping the rest of the 
logic (with guarantee-to-transfer) would be the simplest way to make the 
existing code correct. There are two additional ways to generalize:

 * If the return is also noundef, we don't need one-use.
 * Just one-use is enough for poison-generating, we don't need 
guaranteed-to-transfer, BUT: we need to be careful about an implicit "use" in 
the call itself. That is, if the call we're transfering to is noundef and we 
only check one-use but not guaranteed-to-transfer, we would convert poison into 
UB at that point.

https://github.com/llvm/llvm-project/pull/66036
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to