Starting from LLVM 17, all pointer types are represented by a single opaque type ptr, removing explicit pointee-type information from the IR. This breaks analyses that rely on knowing what a pointer points to.
Existing projects like TAFFO and ASPIS are forced to rely on outdated LLVM versions.
A new LLVM module analysis pass that reconstructs transparent pointer types directly from opaque-pointer IR, without requiring source code or debug information.
Types are represented as ordered trees. Each node belongs to one of three classes:
Single leaf pointer node = opaque
Transparent type: a type whose tree contains no opaque pointer. Opaque pointer: a single leaf pointer node.
Construct an interprocedural def-use graph of the program, linking call sites to function arguments and return values
For each LLVM instruction (alloca, load, store, GEP, global), derive type evidence from how values are used
Progressively merge type evidence across the graph, refining opaque pointers into transparent types
Iterate until a fixed point is reached, guaranteed by the lattice structure of the type domain
Tested on three benchmark suites — PolyBench (30 benchmarks), AxBench (5 benchmarks), and ABSURD (6 benchmarks) — using clang-18 at O0 and O3 optimization levels.
A precision-tuning compiler framework that converts floating-point computations to fixed-point. Requires pointee-type information to identify convertible values, build metadata for ranges and fixed-point formats, and generate correct conversion instructions. Previously limited to LLVM ≤ 15.
A fault-tolerance suite implementing EDDI and REDDI algorithms for data-flow hardening against Single-Event Upsets. Needs type information to compare redundant structured data and to perform temporary argument duplication via memcpy over the correct size.