[PATCH] D97244: [SimplifyCFG] Update passingValueIsAlwaysUndefined to check more attributes

Juneyoung Lee via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 16 18:08:53 PDT 2021


aqjune added inline comments.


================
Comment at: llvm/include/llvm/IR/InstrTypes.h:1663
+           paramHasAttr(ArgNo, Attribute::Dereferenceable) ||
+           // dereferenceable implies noundef, and null is a well-defined value.
+           paramHasAttr(ArgNo, Attribute::DereferenceableOrNull);
----------------
Carrot wrote:
> aqjune wrote:
> > Carrot wrote:
> > > It is not true for "this" parameter. It always has dereferenceable and nonnull attribute, if "this" is not used in the function, passing in undef is no problem.
> > > 
> > > It causes wrong code generated for our application.
> > > passing in undef is no problem
> > 
> > This property holds for `nonnull` and `align`, but not for the three attributes listed here. Passing undef to these is UB because LangRef says violation of these is UB. `dereferenceable` paragraph says:
> > 
> > ```
> > The pointer should be well defined, otherwise it is undefined behavior
> > ```
> > 
> > Is your program being transformed from passing valid `this` to passing `undef` by some pass? Then, the pass is the buggy one.
> Since "this" is not used in the function, DeadArgumentElimination pass changes all callers' valid "this" to undef.
> 
> @spatel, what's your opinion on where to fix it?
> Since "this" is not used in the function, DeadArgumentElimination pass changes all callers' valid "this" to undef.

Then DeadArgumentElimination should drop attributes like `dereferenceable`, etc from the argument definition I think, but reviewers may have different ideas about this.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97244/new/

https://reviews.llvm.org/D97244



More information about the llvm-commits mailing list