[PATCH] D111500: [InstSimplify] Simplify intrinsic comparisons with domain knoweldge
Artem Belevich via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 11 12:39:02 PDT 2021
tra added inline comments.
================
Comment at: llvm/lib/Analysis/InstructionSimplify.cpp:609
+ // fold %cmp = icmp slt i32 %tid, %ntid to true.
+ if (Inst0->getIntrinsicID() == Intrinsic::nvvm_read_ptx_sreg_tid_x &&
+ Inst1->getIntrinsicID() == Intrinsic::nvvm_read_ptx_sreg_ntid_x)
----------------
nikic wrote:
> jhuber6 wrote:
> > tra wrote:
> > > What if LLVM has been compiled without NVPTX back-end? I'm not sure that NVVM intrinsics will be available then.
> > >
> > > Perhaps we should re-visit enabling NVVMIntrRange.cpp pass, again. This should make it possible for LLVM to figure this optimization, and more.
> > Ranges would only give us an upper bound right? Maybe we could insert `llvm.assume` calls as wall as the ranges there, then .
> >
> >
> > I think intrinsic functions are available, but I haven't checked. We use them in OpenMPOpt which is in the default pipeline and I haven't heard any complains so maybe it's probably fine.
> I believe intrinsics are always included, even if the target is disabled. But I also don't think we have precedent for target intrinsic handling in InstSimplify, so adding @spatel and @lebedev.ri for that. Though I don't really see a problem with it.
>
> We do provide InstCombine hooks (instCombineIntrinsic in TTI), but those work directly on the intrinsic. You could use that to replace NVVMIntrRange I believe. Though I don't think that would cover the particular use-case here, because range metadata is not sufficient to derive this result.
> Ranges would only give us an upper bound right?
Yes, they do not provide any info about relationship between launch grid parameters.
> Maybe we could insert llvm.assume calls as wall as the ranges there, then .
Something like that.
================
Comment at: llvm/lib/Analysis/InstructionSimplify.cpp:611
+ Inst1->getIntrinsicID() == Intrinsic::nvvm_read_ptx_sreg_ntid_x)
+ if (ICmpInst::isLE(Pred) || ICmpInst::isLT(Pred))
+ return ConstantInt::getTrue(RetTy);
----------------
We could also return false for `threadIdx.x == blockSize.x` and true for `!=`.
Also, the optimization should apply to `blockIdx` and `gridDim` comparisons, too.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111500/new/
https://reviews.llvm.org/D111500
More information about the llvm-commits
mailing list