[llvm-dev] ORC JIT error when using AVX2 vector instructions

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 30 12:20:46 PDT 2021


This is an illegal instruction. mul is an integer operation, but that has
floating point types. The correct operation would be fmul.

%21 = mul <8 x float> %20, %10

~Craig


On Mon, Aug 30, 2021 at 12:08 PM Frank Winter via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi.
>
> As soon as the module contains instructions operating on < 8 x float > the
> ORC JIT refuses to work.
>
> Here's the module that provokes the error given further below:
>
> ; ModuleID = 'module'
> source_filename = "module"
> target datalayout =
> "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
>
> define private void @eval0_intern(i32 %arg0, i32 %arg1, <8 x float>*
> %arg2, <8 x float>* %arg3, <8 x float>* %arg4) {
> stack:
>   br label %afterstack
>
> afterstack:                                       ; preds = %stack
>   %0 = add nsw i32 %arg0, %arg1
>   %1 = add nsw i32 0, %0
>   %2 = mul i32 %1, 1
>   %3 = add nsw i32 %2, 0
>   %4 = mul i32 %3, 1
>   %5 = add nsw i32 %4, 0
>   %6 = mul i32 %5, 1
>   %7 = add nsw i32 %6, 0
>   %8 = mul i32 %7, 8
>   %9 = getelementptr <8 x float>, <8 x float>* %arg3, i32 %8
>   %10 = load <8 x float>, <8 x float>* %9, align 32
>   %11 = add nsw i32 0, %0
>   %12 = mul i32 %11, 1
>   %13 = add nsw i32 %12, 0
>   %14 = mul i32 %13, 1
>   %15 = add nsw i32 %14, 0
>   %16 = mul i32 %15, 1
>   %17 = add nsw i32 %16, 0
>   %18 = mul i32 %17, 8
>   %19 = getelementptr <8 x float>, <8 x float>* %arg4, i32 %18
>   %20 = load <8 x float>, <8 x float>* %19, align 32
>   %21 = mul <8 x float> %20, %10
>   %22 = add nsw i32 0, %0
>   %23 = mul i32 %22, 1
>   %24 = add nsw i32 %23, 0
>   %25 = mul i32 %24, 1
>   %26 = add nsw i32 %25, 0
>   %27 = mul i32 %26, 1
>   %28 = add nsw i32 %27, 0
>   %29 = mul i32 %28, 8
>   %30 = getelementptr <8 x float>, <8 x float>* %arg2, i32 %29
>   store <8 x float> %21, <8 x float>* %30, align 32
>   ret void
> }
>
> define void @eval0(i32 %idx, [8 x i8]* %arg_ptr) {
> entrypoint:
>   %0 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 0
>   %1 = bitcast [8 x i8]* %0 to i32*
>   %2 = load i32, i32* %1, align 4
>   %3 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 1
>   %4 = bitcast [8 x i8]* %3 to <8 x float>**
>   %5 = load <8 x float>*, <8 x float>** %4, align 8
>   %6 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 2
>   %7 = bitcast [8 x i8]* %6 to <8 x float>**
>   %8 = load <8 x float>*, <8 x float>** %7, align 8
>   %9 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 3
>   %10 = bitcast [8 x i8]* %9 to <8 x float>**
>   %11 = load <8 x float>*, <8 x float>** %10, align 8
>   call void @eval0_intern(i32 %idx, i32 %2, <8 x float>* %5, <8 x float>*
> %8, <8 x float>* %11)
>   ret void
> }
> --------------------------
>
>
> For the JIT part I'm using the Kaleidoscope ORC JIT as given in the LLVM
> examples. However, when it comes to the symbol lookup the program stops
> with output like this:
>
> Lookup
> LLVM ERROR: Cannot select: 0x562e8bb6c268: v4f32 = mul 0x562e8bb6bab0,
> 0x562e8bb6b6a0
>   0x562e8bb6bab0: v4f32,ch = load<(load 16 from %ir.19 + 16, basealign
> 32)> 0x562e8baf8ca8, 0x562e8bb6c130, undef:i64
>     0x562e8bb6c130: i64 = add nuw 0x562e8bb6bcb8, Constant:i64<16>
>       0x562e8bb6bcb8: i64 = add 0x562e8bb6bc50, 0x562e8bb6b9e0
>         0x562e8bb6bc50: i64,ch = CopyFromReg 0x562e8baf8ca8, Register:i64
> %4
>           0x562e8bb6bbe8: i64 = Register %4
>         0x562e8bb6b9e0: i64 = shl 0x562e8bb6b910, Constant:i8<5>
>           0x562e8bb6b910: i64 = sign_extend 0x562e8bb6b770
>             0x562e8bb6b770: i32 = shl 0x562e8bb6b500, Constant:i8<3>
>               0x562e8bb6b500: i32 = add nsw 0x562e8bb6b3c8, 0x562e8bb6b498
>                 0x562e8bb6b3c8: i32,ch = CopyFromReg 0x562e8baf8ca8,
> Register:i32 %0
>                   0x562e8bb6b360: i32 = Register %0
>                 0x562e8bb6b498: i32,ch = CopyFromReg 0x562e8baf8ca8,
> Register:i32 %1
>                   0x562e8bb6b430: i32 = Register %1
>               0x562e8bb6ea28: i8 = Constant<3>
>           0x562e8bb6c2d0: i8 = Constant<5>
>       0x562e8bb6b638: i64 = Constant<16>
>     0x562e8bb6bb18: i64 = undef
>   0x562e8bb6b6a0: v4f32,ch = load<(load 16 from %ir.9 + 16, basealign 32)>
> 0x562e8baf8ca8, 0x562e8bb6c198, undef:i64
>     0x562e8bb6c198: i64 = add nuw 0x562e8bb6ba48, Constant:i64<16>
>       0x562e8bb6ba48: i64 = add 0x562e8bb6b8a8, 0x562e8bb6b9e0
>         0x562e8bb6b8a8: i64,ch = CopyFromReg 0x562e8baf8ca8, Register:i64
> %3
>           0x562e8bb6b840: i64 = Register %3
>         0x562e8bb6b9e0: i64 = shl 0x562e8bb6b910, Constant:i8<5>
>           0x562e8bb6b910: i64 = sign_extend 0x562e8bb6b770
>             0x562e8bb6b770: i32 = shl 0x562e8bb6b500, Constant:i8<3>
>               0x562e8bb6b500: i32 = add nsw 0x562e8bb6b3c8, 0x562e8bb6b498
>                 0x562e8bb6b3c8: i32,ch = CopyFromReg 0x562e8baf8ca8,
> Register:i32 %0
>                   0x562e8bb6b360: i32 = Register %0
>                 0x562e8bb6b498: i32,ch = CopyFromReg 0x562e8baf8ca8,
> Register:i32 %1
>                   0x562e8bb6b430: i32 = Register %1
>               0x562e8bb6ea28: i8 = Constant<3>
>           0x562e8bb6c2d0: i8 = Constant<5>
>       0x562e8bb6b638: i64 = Constant<16>
>     0x562e8bb6bb18: i64 = undef
>
>
> The module compiles fine with LLC. So, I assume that's not the problem.
>
> What might go wrong? Is there a way to initialize the ORC JIT with the
> AVX2 option somehow?
>
> This is using LLVM release 12.
>
> Best,
> Frank
>
> _______________________________________________
> 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/20210830/fce99599/attachment.html>


More information about the llvm-dev mailing list