Enzyme
Enzyme copied to clipboard
Could not deduce type of integer error
Using the kalman
library, with a somewhat minified version of https://github.com/mherb/kalman/blob/master/examples/Robot1/main.cpp:
// this MUST be first, otherwise there might be problems on windows
// see: https://stackoverflow.com/questions/6563810/m-pi-works-with-math-h-but-not-with-cmath-in-visual-studio/6563891#6563891
#define _USE_MATH_DEFINES
#include <cmath>
#define EIGEN_USE_BLAS
#include "SystemModel.hpp"
#include <kalman/ExtendedKalmanFilter.hpp>
#include <iostream>
#include <random>
#include <chrono>
#include <Eigen/Core>
extern double __enzyme_autodiff(void *, double);
using namespace KalmanExamples;
typedef float T;
// Some type shortcuts
typedef Robot1::State<T> State;
typedef Robot1::Control<T> Control;
typedef Robot1::SystemModel<T> SystemModel;
double simulate(double input) {
State x;
x.setZero();
Control u;
SystemModel sys;
Kalman::ExtendedKalmanFilter<State> ekf;
ekf.init(x);
double ekfy_sum = 0.0;
auto x_ekf = ekf.predict(sys, u);
return 0.0;
}
int main(int argc, char **argv) {
double df_dx1 = __enzyme_autodiff((void *)simulate, 1.0);
return 0;
}
The error is could not deduce type of integer %5 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 1, !dbg !20902 num:32 q:{[]:Pointer
.
Error dump: https://gist.github.com/gaurav-arya/3009232d6b24844ec49de4b8e4942081
@ZuseZ4 tells me this is innocuous (only ran into this after significant minimization)
Here is a full application where we still run into the same error.
// this MUST be first, otherwise there might be problems on windows
// see: https://stackoverflow.com/questions/6563810/m-pi-works-with-math-h-but-not-with-cmath-in-visual-studio/6563891#6563891
#define _USE_MATH_DEFINES
#include <cmath>
#define EIGEN_USE_BLAS
#include "SystemModel.hpp"
#include "OrientationMeasurementModel.hpp"
#include "PositionMeasurementModel.hpp"
#include <kalman/ExtendedKalmanFilter.hpp>
#include <kalman/UnscentedKalmanFilter.hpp>
#include <iostream>
#include <random>
#include <chrono>
#include <Eigen/Core>
int enzyme_dup;
int enzyme_dupnoneed;
int enzyme_out;
int enzyme_const;
extern double __enzyme_autodiff(void *, double);
using namespace KalmanExamples;
typedef float T;
// Some type shortcuts
typedef Robot1::State<T> State;
typedef Robot1::Control<T> Control;
typedef Robot1::SystemModel<T> SystemModel;
typedef Robot1::PositionMeasurement<T> PositionMeasurement;
typedef Robot1::OrientationMeasurement<T> OrientationMeasurement;
typedef Robot1::PositionMeasurementModel<T> PositionModel;
typedef Robot1::OrientationMeasurementModel<T> OrientationModel;
double simulate(double input) {
State x;
x.setZero();
Control u;
SystemModel sys;
PositionModel pm(-10, -10, 30, 75);
OrientationModel om;
Kalman::ExtendedKalmanFilter<State> predictor;
Kalman::ExtendedKalmanFilter<State> ekf;
predictor.init(x);
ekf.init(x);
T systemNoise = 0.1;
T orientationNoise = 0.025;
T distanceNoise = 0.25;
double ekfy_sum = 0.0;
const size_t N = 100;
for (size_t i = 1; i <= N; i++) {
u.v() = input;
u.dtheta() = 1.0;
x = sys.f(x, u);
x.x() += systemNoise * 0.5;
x.y() += systemNoise * 0.5;
x.theta() += systemNoise * 0.5;
auto x_pred = predictor.predict(sys, u);
auto x_ekf = ekf.predict(sys, u);
{
OrientationMeasurement orientation = om.h(x);
orientation.theta() = 0.1;
orientation.theta() += orientationNoise * 0.5;
x_ekf = ekf.update(om, orientation);
}
{
PositionMeasurement position = pm.h(x);
position.d1() += distanceNoise * 0.5;
position.d2() += distanceNoise * 0.5;
x_ekf = ekf.update(pm, position);
}
ekfy_sum += x_ekf.y();
std::cout << x.x() << "," << x.y() << "," << x.theta() << "," << x_pred.x()
<< "," << x_pred.y() << "," << x_pred.theta() << "," << x_ekf.x()
<< "," << x_ekf.y() << "," << x_ekf.theta() << std::endl;
}
return ekfy_sum / (double)N;
}
int main(int argc, char **argv) {
double fx1 = simulate(1.0);
double fx2 = simulate(1.1);
std::cout << "fx1: " << fx1 << ", fx2: " << fx2 << std::endl;
double df_dx1 = __enzyme_autodiff((void *)simulate, 1.0);
double df_dx2 = __enzyme_autodiff((void *)simulate, 1.1);
printf("x = %f, f(x) = %f, f'(x) = %f\n", 1.0, fx1, df_dx1);
printf("x = %f, f(x) = %f, f'(x) = %f", 1.1, fx2, df_dx2);
return 0;
}
We can verify that the function does depend on the input and probably has a meaningful gradient by commenting out the Enzyme lines in main
.
This should now no longer result in an assertion, but nice a compile time error.
Compile time error:
: && /home/gridsan/aryag/llvm-project/build/bin/clang++ -std=c++11 -Wall -pedantic -g --save-temps -O2 -DEIGEN_NO_DEBUG -fuse-ld=lld -Wl,-mllvm -Wl,-load=/home/gridsan/aryag/Enzyme/enzyme/build_debug/Enzyme/LLDEnzyme-16.so -Wl,--load-pass-plugin=/home/gridsan/aryag/Enzyme/enzyme/build_debug/Enzyme/LLDEnzyme-16.so CMakeFiles/example_robot1.dir/examples/Robot1/main_original.cpp.o -o example_robot1 /usr/lib/x86_64-linux-gnu/libopenblas.so && :
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
freeing without malloc ptr %0
freeing without malloc ptr %0
freeing without malloc ptr %0
freeing without malloc ptr %0
freeing without malloc ptr %0
freeing without malloc ptr %0
ld.lld: error: /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_algobase.h:922:11: in function preprocess__ZN14KalmanExamples6Robot111SystemModelIfN6Kalman12StandardBaseEE15updateJacobiansERKNS0_5StateIfEERKNS0_7ControlIfEE void (ptr, ptr, ptr): Enzyme: Cannot deduce type of memset tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(36) %5, i8 0, i64 32, i1 false) #27, !dbg !104048
<analysis>
<4 x float> <float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00>: {[-1]:Anything}, intvals: {}
float 1.000000e+00: {[-1]:Float@float}, intvals: {}
float 0.000000e+00: {[-1]:Anything}, intvals: {}
<4 x float> <float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00>: {[-1]:Anything}, intvals: {}
<2 x float> <float 0.000000e+00, float 1.000000e+00>: {[-1]:Anything}, intvals: {}
%15 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 6, !dbg !104156: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%16 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 4, !dbg !104165: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%17 = load float, ptr %6, align 4, !dbg !104175, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%18 = load float, ptr %8, align 4, !dbg !104184, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%19 = fadd float %17, %18, !dbg !104185: {[-1]:Float@float}, intvals: {}
%20 = tail call float @cosf(float noundef %19) #28, !dbg !104191: {[-1]:Float@float}, intvals: {}
%21 = load float, ptr %2, align 4, !dbg !104194, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%22 = fmul float %20, %21, !dbg !104195: {[-1]:Float@float}, intvals: {}
%5 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 1, !dbg !104048: {[-1]:Pointer}, intvals: {}
%6 = getelementptr inbounds float, ptr %1, i64 2, !dbg !104105: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%8 = getelementptr inbounds float, ptr %2, i64 1, !dbg !104133: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%10 = fadd float %7, %9, !dbg !104135: {[-1]:Float@float}, intvals: {}
%11 = tail call float @sinf(float noundef %10) #28, !dbg !104141: {[-1]:Float@float}, intvals: {}
%12 = fneg float %11, !dbg !104142: {[-1]:Float@float}, intvals: {}
%13 = load float, ptr %2, align 4, !dbg !104148, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%14 = fmul float %13, %12, !dbg !104149: {[-1]:Float@float}, intvals: {}
%4 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, !dbg !103881: {[-1]:Pointer, [-1,0]:Float@float, [-1,16]:Float@float, [-1,24]:Float@float, [-1,28]:Float@float, [-1,32]:Float@float}, intvals: {}
%9 = load float, ptr %8, align 4, !dbg !104134, !tbaa !104075: {[-1]:Float@float}, intvals: {}
ptr %0: {[-1]:Pointer, [-1,44]:Float@float, [-1,60]:Float@float, [-1,68]:Float@float, [-1,72]:Float@float, [-1,76]:Float@float, [-1,80]:Float@float, [-1,84]:Float@float, [-1,88]:Float@float, [-1,92]:Float@float, [-1,96]:Float@float, [-1,100]:Float@float, [-1,104]:Float@float, [-1,108]:Float@float, [-1,112]:Float@float}, intvals: {}
ptr %1: {[-1]:Pointer, [-1,8]:Float@float}, intvals: {}
ptr %2: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float}, intvals: {}
%26 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 2, i32 0, i32 0, i32 0, i32 0, i64 7, !dbg !104443: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float}, intvals: {}
%23 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 7, !dbg !104202: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%24 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 8, !dbg !104210: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float, [-1,8]:Float@float, [-1,12]:Float@float}, intvals: {}
%25 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 2, i32 0, i32 0, i32 0, i32 0, i64 3, !dbg !104389: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float, [-1,8]:Float@float, [-1,12]:Float@float}, intvals: {}
%7 = load float, ptr %6, align 4, !dbg !104106, !tbaa !104075: {[-1]:Float@float}, intvals: {}
</analysis>
ld.lld: error: /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_algobase.h:922:11: in function preprocess__ZN14KalmanExamples6Robot111SystemModelIfN6Kalman12StandardBaseEE15updateJacobiansERKNS0_5StateIfEERKNS0_7ControlIfEE void (ptr, ptr, ptr): Enzyme: Cannot deduce type of memset tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(36) %5, i8 0, i64 32, i1 false) #27, !dbg !104048
<analysis>
<4 x float> <float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00>: {[-1]:Anything}, intvals: {}
float 1.000000e+00: {[-1]:Float@float}, intvals: {}
float 0.000000e+00: {[-1]:Anything}, intvals: {}
<4 x float> <float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00>: {[-1]:Anything}, intvals: {}
<2 x float> <float 0.000000e+00, float 1.000000e+00>: {[-1]:Anything}, intvals: {}
%15 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 6, !dbg !104156: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%16 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 4, !dbg !104165: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%17 = load float, ptr %6, align 4, !dbg !104175, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%18 = load float, ptr %8, align 4, !dbg !104184, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%19 = fadd float %17, %18, !dbg !104185: {[-1]:Float@float}, intvals: {}
%20 = tail call float @cosf(float noundef %19) #28, !dbg !104191: {[-1]:Float@float}, intvals: {}
%21 = load float, ptr %2, align 4, !dbg !104194, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%22 = fmul float %20, %21, !dbg !104195: {[-1]:Float@float}, intvals: {}
%5 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 1, !dbg !104048: {[-1]:Pointer}, intvals: {}
%6 = getelementptr inbounds float, ptr %1, i64 2, !dbg !104105: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%8 = getelementptr inbounds float, ptr %2, i64 1, !dbg !104133: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%10 = fadd float %7, %9, !dbg !104135: {[-1]:Float@float}, intvals: {}
%11 = tail call float @sinf(float noundef %10) #28, !dbg !104141: {[-1]:Float@float}, intvals: {}
%12 = fneg float %11, !dbg !104142: {[-1]:Float@float}, intvals: {}
%13 = load float, ptr %2, align 4, !dbg !104148, !tbaa !104075: {[-1]:Float@float}, intvals: {}
%14 = fmul float %13, %12, !dbg !104149: {[-1]:Float@float}, intvals: {}
%4 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, !dbg !103881: {[-1]:Pointer, [-1,0]:Float@float, [-1,16]:Float@float, [-1,24]:Float@float, [-1,28]:Float@float, [-1,32]:Float@float}, intvals: {}
%9 = load float, ptr %8, align 4, !dbg !104134, !tbaa !104075: {[-1]:Float@float}, intvals: {}
ptr %0: {[-1]:Pointer, [-1,44]:Float@float, [-1,60]:Float@float, [-1,68]:Float@float, [-1,72]:Float@float, [-1,76]:Float@float, [-1,80]:Float@float, [-1,84]:Float@float, [-1,88]:Float@float, [-1,92]:Float@float, [-1,96]:Float@float, [-1,100]:Float@float, [-1,104]:Float@float, [-1,108]:Float@float, [-1,112]:Float@float}, intvals: {}
ptr %1: {[-1]:Pointer, [-1,8]:Float@float}, intvals: {}
ptr %2: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float}, intvals: {}
%26 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 2, i32 0, i32 0, i32 0, i32 0, i64 7, !dbg !104443: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float}, intvals: {}
%23 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 7, !dbg !104202: {[-1]:Pointer, [-1,0]:Float@float}, intvals: {}
%24 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 1, i32 0, i32 0, i32 0, i32 0, i64 8, !dbg !104210: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float, [-1,8]:Float@float, [-1,12]:Float@float}, intvals: {}
%25 = getelementptr inbounds %"class.Kalman::LinearizedSystemModel", ptr %0, i64 0, i32 2, i32 0, i32 0, i32 0, i32 0, i64 3, !dbg !104389: {[-1]:Pointer, [-1,0]:Float@float, [-1,4]:Float@float, [-1,8]:Float@float, [-1,12]:Float@float}, intvals: {}
%7 = load float, ptr %6, align 4, !dbg !104106, !tbaa !104075: {[-1]:Float@float}, intvals: {}
</analysis>
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
not handling more than 6 pointer lookups deep dt:{[-1]:Pointer, [0,-1]:Anything, [8,-1]:Pointer, [8,8,-1]:Anything, [8,16,-1]:Pointer, [8,16,8,-1]:Anything, [8,16,16,0]:Pointer, [8,16,16,8]:Pointer, [8,16,16,8,-1]:Anything, [8,16,16,16]:Anything, [8,16,16,17]:Anything, [8,16,16,18]:Anything, [8,16,16,19]:Anything, [8,16,16,20]:Anything, [8,16,16,21]:Anything, [8,16,16,22]:Anything, [8,16,16,23]:Anything, [8,16,16,24]:Pointer, [8,16,16,24,-1]:Pointer, [8,16,16,24,8,-1]:Anything, [8,16,16,32]:Anything, [8,16,16,33]:Anything, [8,16,16,34]:Anything, [8,16,16,35]:Anything, [8,16,16,36]:Anything, [8,16,16,37]:Anything, [8,16,16,38]:Anything, [8,16,16,39]:Anything} only(-1):
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
@wsmoses good old type of memset. So it's a cross-language issue now, is there a clear way on how to make TA stronger? Presumably just look at the TA printing to see where we loose information?
Will keep open to fix, but I assume you can work around this for now with loose type analysis, yes?