<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
As soon as the module contains instructions operating on < 8 x float > the ORC JIT refuses to work.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Here's the module that provokes the error given further below: <br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
; ModuleID = 'module'
<div>source_filename = "module"</div>
<div>target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"</div>
<div><br>
</div>
<div>define private void @eval0_intern(i32 %arg0, i32 %arg1, <8 x float>* %arg2, <8 x float>* %arg3, <8 x float>* %arg4) {</div>
<div>stack:</div>
<div> br label %afterstack</div>
<div><br>
</div>
<div>afterstack: ; preds = %stack</div>
<div> %0 = add nsw i32 %arg0, %arg1</div>
<div> %1 = add nsw i32 0, %0</div>
<div> %2 = mul i32 %1, 1</div>
<div> %3 = add nsw i32 %2, 0</div>
<div> %4 = mul i32 %3, 1</div>
<div> %5 = add nsw i32 %4, 0</div>
<div> %6 = mul i32 %5, 1</div>
<div> %7 = add nsw i32 %6, 0</div>
<div> %8 = mul i32 %7, 8</div>
<div> %9 = getelementptr <8 x float>, <8 x float>* %arg3, i32 %8</div>
<div> %10 = load <8 x float>, <8 x float>* %9, align 32</div>
<div> %11 = add nsw i32 0, %0</div>
<div> %12 = mul i32 %11, 1</div>
<div> %13 = add nsw i32 %12, 0</div>
<div> %14 = mul i32 %13, 1</div>
<div> %15 = add nsw i32 %14, 0</div>
<div> %16 = mul i32 %15, 1</div>
<div> %17 = add nsw i32 %16, 0</div>
<div> %18 = mul i32 %17, 8</div>
<div> %19 = getelementptr <8 x float>, <8 x float>* %arg4, i32 %18</div>
<div> %20 = load <8 x float>, <8 x float>* %19, align 32</div>
<div> %21 = mul <8 x float> %20, %10</div>
<div> %22 = add nsw i32 0, %0</div>
<div> %23 = mul i32 %22, 1</div>
<div> %24 = add nsw i32 %23, 0</div>
<div> %25 = mul i32 %24, 1</div>
<div> %26 = add nsw i32 %25, 0</div>
<div> %27 = mul i32 %26, 1</div>
<div> %28 = add nsw i32 %27, 0</div>
<div> %29 = mul i32 %28, 8</div>
<div> %30 = getelementptr <8 x float>, <8 x float>* %arg2, i32 %29</div>
<div> store <8 x float> %21, <8 x float>* %30, align 32</div>
<div> ret void</div>
<div>}</div>
<div><br>
</div>
<div>define void @eval0(i32 %idx, [8 x i8]* %arg_ptr) {</div>
<div>entrypoint:</div>
<div> %0 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 0</div>
<div> %1 = bitcast [8 x i8]* %0 to i32*</div>
<div> %2 = load i32, i32* %1, align 4</div>
<div> %3 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 1</div>
<div> %4 = bitcast [8 x i8]* %3 to <8 x float>**</div>
<div> %5 = load <8 x float>*, <8 x float>** %4, align 8</div>
<div> %6 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 2</div>
<div> %7 = bitcast [8 x i8]* %6 to <8 x float>**</div>
<div> %8 = load <8 x float>*, <8 x float>** %7, align 8</div>
<div> %9 = getelementptr [8 x i8], [8 x i8]* %arg_ptr, i32 3</div>
<div> %10 = bitcast [8 x i8]* %9 to <8 x float>**</div>
<div> %11 = load <8 x float>*, <8 x float>** %10, align 8</div>
<div> call void @eval0_intern(i32 %idx, i32 %2, <8 x float>* %5, <8 x float>* %8, <8 x float>* %11)</div>
<div> ret void</div>
<div>}</div>
<div>--------------------------</div>
<div><br>
</div>
<div><br>
</div>
<div>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:<br>
</div>
<div><br>
</div>
Lookup
<div>LLVM ERROR: Cannot select: 0x562e8bb6c268: v4f32 = mul 0x562e8bb6bab0, 0x562e8bb6b6a0</div>
<div> 0x562e8bb6bab0: v4f32,ch = load<(load 16 from %ir.19 + 16, basealign 32)> 0x562e8baf8ca8, 0x562e8bb6c130, undef:i64</div>
<div> 0x562e8bb6c130: i64 = add nuw 0x562e8bb6bcb8, Constant:i64<16></div>
<div> 0x562e8bb6bcb8: i64 = add 0x562e8bb6bc50, 0x562e8bb6b9e0</div>
<div> 0x562e8bb6bc50: i64,ch = CopyFromReg 0x562e8baf8ca8, Register:i64 %4</div>
<div> 0x562e8bb6bbe8: i64 = Register %4</div>
<div> 0x562e8bb6b9e0: i64 = shl 0x562e8bb6b910, Constant:i8<5></div>
<div> 0x562e8bb6b910: i64 = sign_extend 0x562e8bb6b770</div>
<div> 0x562e8bb6b770: i32 = shl 0x562e8bb6b500, Constant:i8<3></div>
<div> 0x562e8bb6b500: i32 = add nsw 0x562e8bb6b3c8, 0x562e8bb6b498</div>
<div> 0x562e8bb6b3c8: i32,ch = CopyFromReg 0x562e8baf8ca8, Register:i32 %0</div>
<div> 0x562e8bb6b360: i32 = Register %0</div>
<div> 0x562e8bb6b498: i32,ch = CopyFromReg 0x562e8baf8ca8, Register:i32 %1</div>
<div> 0x562e8bb6b430: i32 = Register %1</div>
<div> 0x562e8bb6ea28: i8 = Constant<3></div>
<div> 0x562e8bb6c2d0: i8 = Constant<5></div>
<div> 0x562e8bb6b638: i64 = Constant<16></div>
<div> 0x562e8bb6bb18: i64 = undef</div>
<div> 0x562e8bb6b6a0: v4f32,ch = load<(load 16 from %ir.9 + 16, basealign 32)> 0x562e8baf8ca8, 0x562e8bb6c198, undef:i64</div>
<div> 0x562e8bb6c198: i64 = add nuw 0x562e8bb6ba48, Constant:i64<16></div>
<div> 0x562e8bb6ba48: i64 = add 0x562e8bb6b8a8, 0x562e8bb6b9e0</div>
<div> 0x562e8bb6b8a8: i64,ch = CopyFromReg 0x562e8baf8ca8, Register:i64 %3</div>
<div> 0x562e8bb6b840: i64 = Register %3</div>
<div> 0x562e8bb6b9e0: i64 = shl 0x562e8bb6b910, Constant:i8<5></div>
<div> 0x562e8bb6b910: i64 = sign_extend 0x562e8bb6b770</div>
<div> 0x562e8bb6b770: i32 = shl 0x562e8bb6b500, Constant:i8<3></div>
<div> 0x562e8bb6b500: i32 = add nsw 0x562e8bb6b3c8, 0x562e8bb6b498</div>
<div> 0x562e8bb6b3c8: i32,ch = CopyFromReg 0x562e8baf8ca8, Register:i32 %0</div>
<div> 0x562e8bb6b360: i32 = Register %0</div>
<div> 0x562e8bb6b498: i32,ch = CopyFromReg 0x562e8baf8ca8, Register:i32 %1</div>
<div> 0x562e8bb6b430: i32 = Register %1</div>
<div> 0x562e8bb6ea28: i8 = Constant<3></div>
<div> 0x562e8bb6c2d0: i8 = Constant<5></div>
<div> 0x562e8bb6b638: i64 = Constant<16></div>
<span> 0x562e8bb6bb18: i64 = undef</span><br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The module compiles fine with LLC. So, I assume that's not the problem.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
What might go wrong? Is there a way to initialize the ORC JIT with the AVX2 option somehow?<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
This is using LLVM release 12.<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Best,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Frank</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
</body>
</html>