rust/tests/codegen-llvm
Matthias Krüger c29fb2e57e
Rollup merge of #144197 - KMJ-007:type-tree, r=ZuseZ4
TypeTree support in autodiff

# TypeTrees for Autodiff

## What are TypeTrees?
Memory layout descriptors for Enzyme. Tell Enzyme exactly how types are structured in memory so it can compute derivatives efficiently.

## Structure
```rust
TypeTree(Vec<Type>)

Type {
    offset: isize,  // byte offset (-1 = everywhere)
    size: usize,    // size in bytes
    kind: Kind,     // Float, Integer, Pointer, etc.
    child: TypeTree // nested structure
}
```

## Example: `fn compute(x: &f32, data: &[f32]) -> f32`

**Input 0: `x: &f32`**
```rust
TypeTree(vec![Type {
    offset: -1, size: 8, kind: Pointer,
    child: TypeTree(vec![Type {
        offset: -1, size: 4, kind: Float,
        child: TypeTree::new()
    }])
}])
```

**Input 1: `data: &[f32]`**
```rust
TypeTree(vec![Type {
    offset: -1, size: 8, kind: Pointer,
    child: TypeTree(vec![Type {
        offset: -1, size: 4, kind: Float,  // -1 = all elements
        child: TypeTree::new()
    }])
}])
```

**Output: `f32`**
```rust
TypeTree(vec![Type {
    offset: -1, size: 4, kind: Float,
    child: TypeTree::new()
}])
```

## Why Needed?
- Enzyme can't deduce complex type layouts from LLVM IR
- Prevents slow memory pattern analysis
- Enables correct derivative computation for nested structures
- Tells Enzyme which bytes are differentiable vs metadata

## What Enzyme Does With This Information:

Without TypeTrees (current state):
```llvm
; Enzyme sees generic LLVM IR:
define float ``@distance(ptr*`` %p1, ptr* %p2) {
; Has to guess what these pointers point to
; Slow analysis of all memory operations
; May miss optimization opportunities
}
```

With TypeTrees (our implementation):
```llvm
define "enzyme_type"="{[]:Float@float}" float ``@distance(``
    ptr "enzyme_type"="{[]:Pointer}" %p1,
    ptr "enzyme_type"="{[]:Pointer}" %p2
) {
; Enzyme knows exact type layout
; Can generate efficient derivative code directly
}
```

# TypeTrees - Offset and -1 Explained

## Type Structure

```rust
Type {
    offset: isize, // WHERE this type starts
    size: usize,   // HOW BIG this type is
    kind: Kind,    // WHAT KIND of data (Float, Int, Pointer)
    child: TypeTree // WHAT'S INSIDE (for pointers/containers)
}
```

## Offset Values

### Regular Offset (0, 4, 8, etc.)
**Specific byte position within a structure**

```rust
struct Point {
    x: f32, // offset 0, size 4
    y: f32, // offset 4, size 4
    id: i32, // offset 8, size 4
}
```

TypeTree for `&Point` (internal representation):
```rust
TypeTree(vec![
    Type { offset: 0, size: 4, kind: Float },   // x at byte 0
    Type { offset: 4, size: 4, kind: Float },   // y at byte 4
    Type { offset: 8, size: 4, kind: Integer }  // id at byte 8
])
```

Generates LLVM:
```llvm
"enzyme_type"="{[]:Float@float}"
```

### Offset -1 (Special: "Everywhere")
**Means "this pattern repeats for ALL elements"**

#### Example 1: Array `[f32; 100]`
```rust
TypeTree(vec![Type {
    offset: -1, // ALL positions
    size: 4,    // each f32 is 4 bytes
    kind: Float, // every element is float
}])
```

Instead of listing 100 separate Types with offsets `0,4,8,12...396`

#### Example 2: Slice `&[i32]`
```rust
// Pointer to slice data
TypeTree(vec![Type {
    offset: -1, size: 8, kind: Pointer,
    child: TypeTree(vec![Type {
        offset: -1, // ALL slice elements
        size: 4,    // each i32 is 4 bytes
        kind: Integer
    }])
}])
```

#### Example 3: Mixed Structure
```rust
struct Container {
    header: i64,        // offset 0
    data: [f32; 1000],  // offset 8, but elements use -1
}
```

```rust
TypeTree(vec![
    Type { offset: 0, size: 8, kind: Integer }, // header
    Type { offset: 8, size: 4000, kind: Pointer,
        child: TypeTree(vec![Type {
            offset: -1, size: 4, kind: Float // ALL array elements
        }])
    }
])
```
2025-09-28 18:13:11 +02:00
..
asm Rollup merge of #146831 - taiki-e:powerpc-clobber, r=Amanieu 2025-09-22 20:25:14 +10:00
autodiff added typetree support for memcpy 2025-09-19 04:02:20 +00:00
autovec
auxiliary initial implementation of the darwin_objc unstable feature 2025-09-13 16:06:22 -07:00
avr
bounds-checking
cffi c-variadic: check that inline attributes are accepted on c-variadic functions 2025-09-13 21:05:12 +02:00
compiletest-self-test
cross-crate-inlining Ignore intrinsic calls in cross-crate-inlining cost model 2025-09-05 20:44:49 -04:00
debug-accessibility
debuginfo-proc-macro
dllimports
enum Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
ergonomic-clones
float
gpu_offload
hint
instrument-coverage
instrument-xray
intrinsics Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
issues Rollup merge of #146732 - durin42:llvm-22-less-assumes, r=nikic 2025-09-27 21:25:57 +02:00
lib-optimizations
loongarch-abi Rollup merge of #145709 - heiher:issue-145692-1, r=jackh726 2025-09-05 01:53:20 -04:00
macos
meta-filecheck
naked-fn Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
non-terminate
option-niche-unfixed
patchable-function-entry
remap_path_prefix
repr
riscv-abi
sanitizer -Zsanitize and -Zsanitizer-cfi-normalize-integers flags are now target modifiers with custom consistency check function 2025-08-21 16:08:00 +07:00
simd Fix tests/codegen-llvm/simd/extract-insert-dyn.rs test failure on riscv64 2025-07-28 11:58:38 +00:00
simd-intrinsic
src-hash-algorithm
unwind-abis
aarch64-softfloat.rs
aarch64-struct-align-128.rs
abi-efiapi.rs Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
abi-main-signature-16bit-c-int.rs
abi-main-signature-32bit-c-int.rs
abi-repr-ext.rs
abi-sysv64.rs
abi-win64-zst.rs
abi-x86-interrupt.rs Enforce correct number of arguments for "x86-interrupt" functions 2025-08-20 18:03:57 +03:00
abi-x86-sse.rs
abi-x86_64_sysv.rs
addr-of-mutate.rs Use captures(address) instead of captures(none) for indirect args 2025-08-26 16:16:23 +02:00
adjustments.rs
align-byval-alignment-mismatch.rs llvm: Accept new LLVM lifetime format 2025-08-11 22:00:41 +00:00
align-byval-vector.rs
align-byval.rs
align-enum.rs
align-fn.rs
align-offset.rs
align-static.rs allow #[rustc_align_static(N)] on statics 2025-09-09 21:54:54 +02:00
align-struct.rs
alloc-optimisation.rs
amdgpu-addrspacecast.rs Add test for addrspacecasting global vars 2025-09-03 08:40:51 +02:00
array-clone.rs
array-cmp.rs
array-codegen.rs
array-equality.rs
array-from_fn.rs
array-map.rs
array-optimized.rs
array-repeat.rs stabilize array repeat 2025-08-15 16:42:21 +00:00
ascii-char.rs
assign-desugar-debuginfo.rs
async-closure-debug.rs
async-fn-debug-awaitee-field.rs pub async fn implementation coroutine (func::{closure#0}) is monomorphized, when func itself is monomorphized 2025-09-01 13:45:00 +07:00
async-fn-debug-msvc.rs
async-fn-debug.rs
atomic-operations.rs
atomicptr.rs stabilize strict provenance atomic ptr 2025-08-15 16:56:11 +00:00
autovectorize-f32x4.rs
become-musttail.rs Implement support for explicit tail calls in the MIR block builders and the LLVM codegen backend. 2025-07-26 01:02:29 +02:00
bigint-helpers.rs Stop using uadd.with.overflow 2025-08-08 21:59:28 -07:00
binary-heap-peek-mut-pop-no-panic.rs
binary-search-index-no-bound-check.rs Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
bool-cmp.rs
bounds-check-elision-slice-min.rs Multiple bounds checking elision failures 2025-08-01 18:38:22 +01:00
box-default-debug-copies.rs
box-uninit-bytes.rs
bpf-alu32.rs
branch-protection.rs Extends branch protection tests to include GCS 2025-09-22 11:29:54 +01:00
c-variadic-lifetime.rs tests: update new test to accept new lifetime format 2025-09-12 14:31:08 -04:00
call-llvm-intrinsics.rs
call-tmps-lifetime.rs llvm: Accept new LLVM lifetime format 2025-08-11 22:00:41 +00:00
cast-optimized.rs
cast-target-abi.rs Fix LoongArch C function ABI when passing/returning structs containing floats 2025-08-21 18:00:26 +08:00
catch-unwind.rs
cdylib-external-inline-fns.rs
cf-protection.rs Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
cfguard-checks.rs
cfguard-disabled.rs
cfguard-nochecks.rs
cfguard-non-msvc.rs
char-ascii-branchless.rs
char-escape-debug-no-bounds-check.rs
checked_ilog.rs
checked_math.rs
clone-shims.rs
clone_as_copy.rs
codemodels.rs Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
coercions.rs
cold-call-declare-and-call.rs
common_prim_int_ptr.rs
comparison-operators-2-struct.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
comparison-operators-2-tuple.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
comparison-operators-newtype.rs
const-array.rs
const-vector.rs Fix tests/codegen-llvm/const-vector.rs test failure on riscv64 2025-07-23 11:23:36 +00:00
const_scalar_pair.rs
constant-branch.rs
consts.rs
coroutine-debug-msvc.rs
coroutine-debug.rs
darwin-no-objc.rs initial implementation of the darwin_objc unstable feature 2025-09-13 16:06:22 -07:00
darwin-objc-abi-v1.rs initial implementation of the darwin_objc unstable feature 2025-09-13 16:06:22 -07:00
darwin-objc-abi-v2.rs initial implementation of the darwin_objc unstable feature 2025-09-13 16:06:22 -07:00
darwin-objc-cross-crate.rs initial implementation of the darwin_objc unstable feature 2025-09-13 16:06:22 -07:00
dead_on_return.rs Set dead_on_return attribute for indirect arguments 2025-08-11 12:39:23 +02:00
dealloc-no-unwind.rs
debug-alignment.rs
debug-column-msvc.rs
debug-column.rs
debug-compile-unit-path.rs
debug-fndef-size.rs
debug-limited.rs
debug-line-directives-only.rs
debug-line-tables-only.rs
debug-linkage-name.rs
debug-vtable.rs
debuginfo-constant-locals.rs
debuginfo-cyclic-structure.rs fix(debuginfo): disable overflow check for 2025-07-27 14:42:07 +03:00
debuginfo-generic-closure-env-names.rs
debuginfo-inline-callsite-location.rs
deduced-param-attrs.rs
default-requires-uwtable.rs
default-visibility.rs Ignore intrinsic calls in cross-crate-inlining cost model 2025-09-05 20:44:49 -04:00
direct-access-external-data.rs
diverging-function-call-debuginfo.rs tests: Test line number in debuginfo for diverging function calls 2025-07-29 18:59:09 +02:00
dont_codegen_private_const_fn_only_used_in_const_eval.rs
drop-in-place-noalias.rs
drop.rs
dst-offset.rs
dst-vtable-align-nonzero.rs
dst-vtable-size-range.rs
ehcontguard_disabled.rs Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
ehcontguard_enabled.rs
emscripten-catch-unwind-js-eh.rs
emscripten-catch-unwind-wasm-eh.rs
enable-lto-unit-splitting.rs
error-provide.rs
export-no-mangle.rs
external-no-mangle-fns.rs
external-no-mangle-statics.rs
f128-wasm32-callconv.rs
fastcall-inreg.rs
fatptr.rs
fewer-names.rs
fixed-x18.rs
float_math.rs
fn-impl-trait-self.rs
fn-parameters-on-different-lines-debuginfo.rs
force-frame-pointers.rs
force-no-unwind-tables.rs
force-unwind-tables.rs
frame-pointer-cli-control.rs
frame-pointer.rs
function-arguments-noopt.rs
function-arguments.rs Use captures(address) instead of captures(none) for indirect args 2025-08-26 16:16:23 +02:00
function-return.rs
gdb_debug_script_load.rs Revert "Preserve the .debug_gdb_scripts section" 2025-08-06 18:01:07 +00:00
generic-debug.rs
gep-index.rs
global-allocator-attributes.rs Add attributes for #[global_allocator] functions 2025-09-23 10:21:17 +02:00
gpu-kernel-abi.rs Add amdgpu to gpu-kernel test 2025-09-03 08:40:58 +02:00
i128-wasm32-callconv.rs
i128-x86-align.rs
i128-x86-callconv.rs
indirect-branch-cs-prefix.rs Add -Zindirect-branch-cs-prefix option 2025-08-17 16:51:42 +02:00
infallible-unwrap-in-opt-z.rs
inherit_overflow.rs
inline-always-works-always.rs
inline-debuginfo.rs
inline-function-args-debug-info.rs
inline-hint.rs
instrument-mcount.rs
integer-cmp.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
integer-overflow.rs Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
internalize-closures.rs
intrinsic-no-unnamed-attr.rs Mark float intrinsics with no preconditions as safe 2025-09-21 20:37:51 -04:00
is_val_statically_known.rs
issue-97217.rs
iter-repeat-n-trivial-drop.rs stabilize array repeat 2025-08-15 16:42:21 +00:00
layout-size-checks.rs
lifetime_start_end.rs llvm: Accept new LLVM lifetime format 2025-08-11 22:00:41 +00:00
link-dead-code.rs
link_section.rs
llvm-ident.rs
llvm_module_flags.rs
loads.rs
local-generics-in-exe-internalized.rs
lto-removes-invokes.rs
mainsubprogram.rs
match-optimized.rs
match-optimizes-away.rs
match-unoptimized.rs
maybeuninit-rvo.rs
mem-replace-big-type.rs
mem-replace-simple-type.rs
merge-functions.rs
method-declaration.rs
min-function-alignment.rs
mir-aggregate-no-alloca.rs
mir-inlined-line-numbers.rs
mir_zst_stores.rs
move-before-nocapture-ref-arg.rs
move-operands.rs
naked-asan.rs Enforce correct number of arguments for "x86-interrupt" functions 2025-08-20 18:03:57 +03:00
no-alloca-inside-if-false.rs
no-assumes-on-casts.rs
no-dllimport-w-cross-lang-lto.rs
no-jump-tables.rs
no-plt.rs
no-redundant-item-monomorphization.rs
no_builtins-at-crate.rs
noalias-box-off.rs
noalias-box.rs
noalias-flag.rs
noalias-freeze.rs
noalias-refcell.rs
noalias-rwlockreadguard.rs
noalias-unpin.rs
noreturn-uninhabited.rs
noreturnflag.rs
nounwind.rs
nrvo.rs
optimize-attr-1.rs
option-as-slice.rs
option-niche-eq.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
overaligned-constant.rs
packed.rs
panic-abort-windows.rs
panic-in-drop-abort.rs
panic-unwind-default-uwtable.rs
pattern_type_symbols.rs Add proper name mangling for pattern types 2025-09-23 10:59:29 +00:00
personality_lifetimes.rs
pgo-counter-bias.rs
pgo-instrumentation.rs
pic-relocation-model.rs
pie-relocation-model.rs
placement-new.rs
powerpc64le-struct-align-128.rs
precondition-checks.rs
ptr-arithmetic.rs
ptr-read-metadata.rs
range-attribute.rs Tell LLVM about read-only captures 2025-08-20 19:08:16 +02:00
range-loop.rs
range_to_inclusive.rs
read-only-capture-opt.rs Tell LLVM about read-only captures 2025-08-20 19:08:16 +02:00
README.md
refs.rs
reg-struct-return.rs
regparm-inreg.rs
repeat-operand-zero-len.rs tests: fix RISC-V failures and adjust transmute-scalar.rs target 2025-08-18 19:37:13 +00:00
repeat-operand-zst-elem.rs
repeat-trusted-len.rs
retpoline.rs
riscv-target-abi.rs
rust-abi-arch-specific-adjustment.rs tests/codegen-llvm: Make rust-abi-arch-specific-adjustment portable 2025-09-08 20:23:52 +02:00
s390x-simd.rs update some s390x codegen tests 2025-08-20 16:35:33 +02:00
scalar-pair-bool.rs
set-discriminant-invalid.rs
skip-mono-inside-if-false.rs
slice-as_chunks.rs
slice-indexing.rs
slice-init.rs
slice-is-ascii.rs
slice-iter-fold.rs
slice-iter-len-eq-zero.rs
slice-iter-nonnull.rs
slice-last-elements-optimization.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
slice-pointer-nonnull-unwrap.rs
slice-position-bounds-check.rs
slice-ref-equality.rs
slice-reverse.rs Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
slice-split-at.rs
slice-windows-no-bounds-check.rs
slice_as_from_ptr_range.rs
some-abis-do-extend-params-to-32-bits.rs
some-global-nonnull.rs
sparc-struct-abi.rs
split-lto-unit.rs
sroa-fragment-debuginfo.rs
sse42-implies-crc32.rs
stack-probes-inline.rs
stack-protector.rs
static-relocation-model-msvc.rs
staticlib-external-inline-fns.rs
step_by-overflow-checks.rs
stores.rs
string-push.rs
swap-large-types.rs
swap-small-types.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
target-cpu-on-functions.rs
target-feature-inline-closure.rs
target-feature-negative-implication.rs
target-feature-overrides.rs
terminating-catchpad.rs
thread-local.rs
tied-features-strength.rs
to_vec.rs
trailing_zeros.rs
transmute-optimized.rs
transmute-scalar.rs tests: fix RISC-V failures and adjust transmute-scalar.rs target 2025-08-18 19:37:13 +00:00
try_question_mark_nop.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
tune-cpu-on-functions.rs
tuple-layout-opt.rs
ub-checks.rs Verify llvm-needs-components are not empty and match the --target value 2025-07-29 11:20:23 -07:00
unchecked-float-casts.rs
unchecked_shifts.rs
uninhabited-transparent-return-abi.rs tests: fix RISC-V failures and adjust transmute-scalar.rs target 2025-08-18 19:37:13 +00:00
uninit-consts.rs
uninit-repeat-in-aggregate.rs
union-abi.rs
union-aggregate.rs Update the minimum external LLVM to 20 2025-09-16 11:49:20 -07:00
unwind-and-panic-abort.rs
unwind-extern-exports.rs
unwind-extern-imports.rs
unwind-landingpad-cold.rs
unwind-landingpad-inline.rs
used_with_arg.rs
var-names.rs
vec-as-ptr.rs
vec-calloc.rs Pass alloc-variant-zeroed to LLVM 2025-08-20 17:08:46 +01:00
vec-in-place.rs
vec-iter-collect-len.rs
vec-iter.rs
vec-len-invariant.rs
vec-optimizes-away.rs
vec-reserve-extend.rs
vec-shrink-panik.rs
vec-with-capacity.rs
vec_pop_push_noop.rs tests: use max-llvm-major-version instead of ignore-llvm-version 2025-09-26 13:32:03 -04:00
vecdeque-drain.rs
vecdeque-nonempty-get-no-panic.rs
vecdeque_no_panic.rs
vecdeque_pop_push.rs tests: use max-llvm-major-version instead of ignore-llvm-version 2025-09-26 13:32:03 -04:00
virtual-call-attrs-issue-137646.rs
virtual-function-elimination-32bit.rs
virtual-function-elimination.rs
vtable-loads.rs
vtable-upcast.rs
wasm_casts_trapping.rs
wasm_exceptions.rs Don't special-case llvm.* as nounwind 2025-07-23 02:17:54 +03:00
zip.rs
zst-offset.rs

The files here use the LLVM FileCheck framework, documented at https://llvm.org/docs/CommandGuide/FileCheck.html.

One extension worth noting is the use of revisions as custom prefixes for FileCheck. If your codegen test has different behavior based on the chosen target or different compiler flags that you want to exercise, you can use a revisions annotation, like so:

// revisions: aaa bbb
// [bbb] compile-flags: --flags-for-bbb

After specifying those variations, you can write different expected, or explicitly unexpected output by using <prefix>-SAME: and <prefix>-NOT:, like so:

// CHECK: expected code
// aaa-SAME: emitted-only-for-aaa
// aaa-NOT:                        emitted-only-for-bbb
// bbb-NOT:  emitted-only-for-aaa
// bbb-SAME:                       emitted-only-for-bbb