[LLVMdev] Adding an intrinsic that requires a constant parameter
Reid Kleckner
rnk at google.com
Thu May 1 08:44:20 PDT 2014
Looks like LLVM won't tolerate that optimization. There are a bunch of
intrinsics that require constant args. The verifier checks that they are
constant args in Verifier::visitIntrinsicFunctionCall(), and this fails
verification:
define void @myprefetch(i8* nocapture %p, i32 %rw) {
tail call void @llvm.prefetch(i8* %p, i32 %rw, i32 3, i32 1)
ret void
}
We should probably note which args have to be constant in the .td file so
passes can avoid breaking these intrinsics in exactly this way.
On Thu, May 1, 2014 at 5:10 AM, Justin Holewinski <
justin.holewinski at gmail.com> wrote:
> My understanding of intrinsics in LLVM is that an optimization pass cannot
> touch an intrinsic unless it (1) is specifically programmed to have
> knowledge of the intrinsic, or (2) uses only declared properties of the
> intrinsic, like IntrNoMem. So, for example, a pass may move an unknown
> intrinsic around memory ops if its defined IntrNoMem, but it cannot hoist
> constants for arbitrary intrinsics. Is this correct? I can't find this
> codified anywhere in the documentation.
>
> The context for this question is adding an intrinsic that requires a
> constant parameter. There is no way to define this property in the
> tablegen description currently. I want to verify that if I add such an
> intrinsic, it would be illegal for any existing optimization pass to hoist
> the constant parameter. For example, if I add a target intrinsic llvm.foo
> that takes two parameters: i32 and i1, where the i1 parameter must be a
> constant (same as llvm.cttz), I want to verify that the following
> optimization is illegal without having to change any LLVM passes:
>
> Input:
>
> define i32 @f0(i32 %a, i1 %pred) {
> br i1 %pred, label %first, label %second
> first:
> %r0 = tail call i32 @llvm.foo.i32(i32 %a, i1 true)
> br label %end
> second:
> %r1 = tail call i32 @llvm.foo.i32(i32 %a, i1 false)
> br label %end
> end:
> %r = phi i32 [%r0, %first], [%r1, %second]
> ret i32 %r
> }
>
> Output:
>
> define i32 @f1(i32 %a, i1 %pred) {
> %r = tail call i32 @llvm.foo.i32(i32 %a, i1 %pred)
> ret i32 %r
> }
>
> --
>
> Thanks,
>
> Justin Holewinski
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140501/81f9cb97/attachment.html>
More information about the llvm-dev
mailing list