I am observing unexpected behavior when passing an LLVM IR to Vitis. The synthesis process arrives to the end with no errors, but in the reports everything is zero (0 cycles, 0 DSP, etc). So I traced back in the log to the first pass that is applied to the custom LLVM input, and found this:
INFO: [HLS 200-1022] Running custom LLVM hook 'HLS_HOOKS::opt'
//// get_config commands
INFO-FLOW: Doing LTO.
Execute ap_eval exec -ignorestderr /opt/Xilinx/Vitis_HLS/2021.1/lnx64/tools/clang-3.9-csynth/bin/clang
//// rest of the options
-o proj/solution1/.autopilot/db/a.g.lto.bc
Then I disassembled a.g.lto.bc, and it looks like all the input code has disappeared (it was >1800 lines in the LLVM IR):
; ModuleID = 'a.g.lto.bc'
source_filename = "a.g.lto.bc"
target datalayout = "e-m:e-i64:64-i128:128-i256:256-i512:512-i1024:1024-i2048:2048-i4096:4096-n8:16:32:64-S128-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
target triple = "fpga64-xilinx-none"
@0 = private unnamed_addr constant [8 x i8] c"ap_auto\00"
@1 = private unnamed_addr constant [1 x i8] zeroinitializer
@2 = private unnamed_addr constant [15 x i8] c"atax_16_kernel\00"
define void @atax_16_kernel(i32* noalias nocapture %arg_2, i32* noalias nocapture %arg_3, i32* noalias %arg_4, i32* noalias nocapture %arg_5) {
bb_0:
call void (...) @_ssdm_op_SpecTopModule([15 x i8]* @2)
call void (...) @_ssdm_op_SpecBitsMap(i32* %arg_2), !map !2
call void (...) @_ssdm_op_SpecInterface(i32* %arg_2, [8 x i8]* @0, i32 0, i32 0, [1 x i8]* @1, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1, [1 x i8]* @1, i32 0, i32 0, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1)
call void (...) @_ssdm_op_SpecBitsMap(i32* %arg_3), !map !2
call void (...) @_ssdm_op_SpecInterface(i32* %arg_3, [8 x i8]* @0, i32 0, i32 0, [1 x i8]* @1, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1, [1 x i8]* @1, i32 0, i32 0, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1)
call void (...) @_ssdm_op_SpecBitsMap(i32* %arg_4), !map !2
call void (...) @_ssdm_op_SpecInterface(i32* %arg_4, [8 x i8]* @0, i32 0, i32 0, [1 x i8]* @1, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1, [1 x i8]* @1, i32 0, i32 0, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1)
call void (...) @_ssdm_op_SpecBitsMap(i32* %arg_5), !map !2
call void (...) @_ssdm_op_SpecInterface(i32* %arg_5, [8 x i8]* @0, i32 0, i32 0, [1 x i8]* @1, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1, [1 x i8]* @1, i32 0, i32 0, i32 0, i32 0, [1 x i8]* @1, [1 x i8]* @1)
store i32 0, i32* %arg_3, align 4
store i32 0, i32* %arg_2, align 4
ret void
}
declare void @_ssdm_op_SpecBitsMap(...)
declare void @_ssdm_op_SpecInterface(...)
declare void @_ssdm_op_SpecTopModule(...)
!blackbox_cfg = !{!0}
!llvm.module.flags = !{!1}
!0 = !{}
!1 = !{i32 7, !"reflow.full.lowering", i32 1}
!2 = !{!0}