[PATCH] D84733: [Attributor] Check nonnull attribute violation in AAUndefinedBehavior

Johannes Doerfert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 3 00:02:07 PDT 2020


jdoerfert accepted this revision.
jdoerfert added a comment.
This revision is now accepted and ready to land.

LGTM. Some minor nits below. I guess this doesn't affect other tests because of the `noundef` restriction. We should really derive that one as well.



================
Comment at: llvm/lib/Transforms/IPO/AttributorAttributes.cpp:1993
+      unsigned ArgNum =
+          std::min(CB->getNumArgOperands(), (unsigned)Callee->arg_size());
+      for (unsigned idx = 0; idx < ArgNum; idx++) {
----------------
okura wrote:
> jdoerfert wrote:
> > You don't need a callee, just use the call base.
> Do you mean that I don't have to be aware of  `Callee->arg_size()` anywhere?
> In the case of callbacks, `CB.getNumArgOperands() > Callee->arg_size()` holds and I got segfault when `getArg` is called.
> Can I get the callee argument position directly from `CallBase`?
Oh, OK. For any variadic function the call can have more operands than the callee arguments. I guess what you really want are the abstract call sites you can get from the call base. Let's keep it like this for now.


================
Comment at: llvm/lib/Transforms/IPO/AttributorAttributes.cpp:2007
+          break;
+        Value *ArgVal = CB.getArgOperand(idx);
+        IRPosition CalleeArgumentIRP =
----------------
I guess the easiest is to check if it is a pointer early on. That should avoid running the code below in case it can never trigger.


================
Comment at: llvm/lib/Transforms/IPO/AttributorAttributes.cpp:2021
+        if (!ValueSimplifyAA.isKnown() || !SimplifiedVal.hasValue())
+          continue;
+        if (!isa<ConstantPointerNull>(*SimplifiedVal.getValue()))
----------------
Not having a value and having the value `undef` are also all violations if you will. The former means it is dead anyway, and `undef` can degenerate to `null` whenever you want it to.


================
Comment at: llvm/test/Transforms/Attributor/undefined_behavior.ll:598
+;
+  store i32 0, i32* %a
+  ret void
----------------
Next up, we can derive `noundef` for this case (amongst others), given that we actually access the pointer for sure. An undef value would cause UB so %a cannot be undef. Basically the same way we should already derive `nonnull` for this case. Later ;)


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

https://reviews.llvm.org/D84733



More information about the llvm-commits mailing list