[llvm-dev] [RFC] Should we add isa_or_null<>?

Don Hinton via llvm-dev llvm-dev at lists.llvm.org
Thu Apr 4 08:44:02 PDT 2019


On Thu, Apr 4, 2019 at 10:30 AM David Greene <dag at cray.com> wrote:

> I don't think that's a correct replacement.
>
> if (var && isa<T>(var)) {
>   ...
> }
>
> is not the same as:
>
> if (isa_or_null<T>(var)) {
>   ...
> }
>
> at least according to what "isa_or_null" conveys to me.
>

This is the same convention used by the existing "_or_null" varieties,
i.e., "cast_or_null" and "dyn_cast_or_null".   They accept a null and
propagate it.  In the "isa" case, it would accept a null and propagate it
as false.


>
> not_null_and_isa<T> would seem a better fit, or maybe exists_and_isa<T>.
>
> That said, I'm not sure sure we need a special API for this.  Are
> expensive calls used in the way you describe really common?
>

I've only been looking at the ones involving method calls, but it's not too
common.  Perhaps a dozen in clang/lib -- haven't run it against the rest of
the code base.


>
>                    -David
>
> Don Hinton via llvm-dev <llvm-dev at lists.llvm.org> writes:
>
> > I'd like to propose adding `isa_or_null<>` to replace the following
> usage pattern that's relatively common in conditionals:
> >
> >   var && isa<T>(var)  =>>  isa_or_null<T>(var)
> >
> > And in particular when `var` is a method call which might be expensive,
> e.g.:
> >
> >   X->foo() && isa<T>(X->foo())  =>>  isa_or_null<T>(X->foo())
> >
> > The implementation could be a simple wrapper around isa<>, and while the
> IR produced is only slightly more efficient, the elimination of an extra
> call could be
> > worthwhile.
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190404/245976fd/attachment.html>


More information about the llvm-dev mailing list