EnzymeAD / EnzymeAD/Enzyme.jl

Another `LLVM error: function failed verification (4)`

Open
#3,404 7 comments 0 reactions 0 assignees View on GitHub
Dominant language
Julia
Stars
586
Forks
108
Avg merge
1d 5h
Merged PRs (30d)
44

Description

I went through previous issues about this but didn't see much. Here's another somewhat heavy (sorry!!!) MWE:

```
using TensorKit, TupleTools
using TensorOperations
using VectorInterface: Zero, One
using Enzyme, EnzymeTestUtils
using Random

function randcircshift(N₁::Int, N₂::Int, k::Int = rand(0:(N₁ + N₂)))
N = N₁ + N₂
@assert 0 ≤ k ≤ N
p = TupleTools.vcat(ntuple(identity, N₁), reverse(ntuple(identity, N₂) .+ N₁))
n = rand(0:N)
_p = TupleTools.circshift(p, n)
return (tuple(_p[1:k]...), reverse(tuple(_p[(k + 1):end]...)))
end

trivtuple(N) = ntuple(identity, N)

Base.@constprop :aggressive function _repartition(p::IndexTuple, N₁::Int)
length(p) >= N₁ ||
throw(ArgumentError("cannot repartition $(typeof(p)) to $N₁, $(length(p) - N₁)"))
return TupleTools.getindices(p, trivtuple(N₁)),
TupleTools.getindices(p, trivtuple(length(p) - N₁) .+ N₁)
end
Base.@constprop :aggressive function _repartition(p::Index2Tuple, N₁::Int)
return _repartition(linearize(p), N₁)
end
function _repartition(p::Union{IndexTuple, Index2Tuple}, ::Index2Tuple{N₁}) where {N₁}
return _repartition(p, N₁)
end
function _repartition(p::Union{IndexTuple, Index2Tuple}, t::AbstractTensorMap)
return _repartition(p, TensorKit.numout(t))
end

# Float32 and finite differences don't mix well
default_tol(::Type{<:Union{Float32, Complex{Float32}}}) = 1.0e-2
default_tol(::Type{<:Union{Float64, Complex{Float64}}}) = 1.0e-5

I_A4Z4 = A4Irrep ⊠ Z4Element{2}
VRepA4Twistedℤ₄ = (
Vect[I_A4Z4]((0, 0) => 2, (1, 1) => 1, (2, 3) => 0, (3, 2) => 1),
Vect[I_A4Z4]((0, 0) => 1, (1, 1) => 1, (2, 3) => 1, (3, 2) => 0)',
Vect[I_A4Z4]((0, 0) => 2, (1, 1) => 1, (2, 3) => 1, (3, 2) => 1),
Vect[I_A4Z4]((0, 0) => 0, (1, 1) => 1, (2, 3) => 1, (3, 2) => 1)',
Vect[I_A4Z4]((0, 0) => 0, (1, 1) => 2, (2, 3) => 0, (3, 2) => 1),
)

T = ComplexF64
V = VRepA4Twistedℤ₄
atol = default_tol(T)
rtol = default_tol(T)

Random.seed!(456)
for _ in 1:5
k1 = rand(0:2)
k2 = rand(0:1)
V1 = map(v -> rand(Bool) ? v' : v, rand(V, k1))
V2 = map(v -> rand(Bool) ? v' : v, rand(V, k2))
V3 = prod(x -> x ⊗ x', V2[1:k2]; init = one(V[1]))
V4 = prod(x -> x ⊗ x', V2[(k2 + 1):end]; init = one(V[1]))

k′ = rand(0:(k1 + 2k2))
(_p, _q) = randcircshift(k′, k1 + 2k2 - k′, k1)
p = _repartition(_p, rand(0:k1))
q = (tuple(_q[1:2:end]...), tuple(_q[2:2:end]...))
ip = _repartition(invperm(linearize((_p, _q))), k′)
A = randn(T, permute(prod(V1) ⊗ V3 ← V4, ip))
if !all(isempty, p) && !all(isempty, q)
α = randn(T)
β = randn(T)
C = randn!(TensorOperations.tensoralloc_add(T, A, p, false, Val(false)))
EnzymeTestUtils.test_reverse(TensorKit.planartrace!, Duplicated, (C, Duplicated), (A, Duplicated), (p, Const), (q, Const), (α, Const), (β, Const), (TensorOperations.DefaultBackend(), Const), (TensorOperations.DefaultAllocator(), Const); atol, rtol)
end
```

When I run this with:

```
Enzyme v0.13.185
Enzyme_jll v0.0.289+0
TensorKit v0.17.1
Julia v1.12.6
```

I get this very exciting dump:

```
Instruction does not dominate all uses!
%704 = call token (...) @llvm.julia.gc_preserve_begin(ptr addrspace(10) @"ejl_inserted$jl_global_20935$false$4853528752"), !dbg !117892
call void @llvm.julia.gc_preserve_end(token %704), !dbg !117713
; Function Attrs: mustprogress willreturn
define internal fastcc nonnull "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Integer, [-1,0,1]:Integer, [-1,0,2]:Integer, [-1,0,3]:Integer, [-1,0,4]:Integer, [-1,0,5]:Integer, [-1,0,6]:Integer, [-1,0,7]:Integer, [-1,0,8]:Pointer, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Integer, [-1,16]:Pointer, [-1,16,0]:Integer, [-1,16,1]:Integer, [-1,16,2]:Integer, [-1,16,3]:Integer, [-1,16,4]:Integer, [-1,16,5]:Integer, [-1,16,6]:Integer, [-1,16,7]:Integer, [-1,16,8]:Pointer, [-1,16,8,-1]:Float@double, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer, [-1,48]:Integer, [-1,49]:Integer, [-1,50]:Integer, [-1,51]:Integer, [-1,52]:Integer, [-1,53]:Integer, [-1,54]:Integer, [-1,55]:Integer, [-1,56]:Integer, [-1,57]:Integer, [-1,58]:Integer, [-1,59]:Integer, [-1,60]:Integer, [-1,61]:Integer, [-1,62]:Integer, [-1,63]:Integer}" ptr addrspace(10) @preprocess_julia_planar_trace_23173(ptr addrspace(11) nocapture noundef nonnull readonly align 8 dereferenceable(32) "enzyme_inactive" "enzyme_type"="{[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Anything, [-1,14]:Anything, [-1,15]:Anything, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}" "enzymejl_parmtype"="5252307792" "enzymejl_parmtype_ref"="1" "enzymejl_parmtype_str"="FusionTree{ProductSector{Tuple{A4Irrep, Z4Element{2}}}, 3, 1, 2}" %"f::FusionTree", ptr addrspace(11) nocapture noundef nonnull readonly align 8 dereferenceable(16) "enzyme_inactive" "enzyme_type"="{[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer}" "enzymejl_parmtype"="4826318528" "enzymejl_parmtype_ref"="1" "enzymejl_parmtype_str"="Tuple{Tuple{Int64}, Tuple{Int64}}" %"#3::Tuple") unnamed_addr #529 !dbg !58529 {
top:
%0 = call noalias nonnull dereferenceable(5) dereferenceable_or_null(5) ptr @malloc(i64 5), !enzyme_fromstack !57905
%1 = call noalias nonnull dereferenceable(5) dereferenceable_or_null(5) ptr @malloc(i64 5), !enzyme_fromstack !57905
%"new::Complex" = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) ptr @malloc(i64 16), !enzyme_fromstack !57903
%pgcstack = call ptr @julia.get_pgcstack() #609
%ptls_field = getelementptr inbounds i8, ptr %pgcstack, i64 16
%ptls_load = load ptr, ptr %ptls_field, align 8, !tbaa !581
%2 = getelementptr inbounds i8, ptr %ptls_load, i64 16
%safepoint = load ptr, ptr %2, align 8, !tbaa !585
fence syncscope("singlethread") seq_cst
call void @julia.safepoint(ptr %safepoint) #609, !dbg !58530
fence syncscope("singlethread") seq_cst
%3 = call token (...) @llvm.julia.gc_preserve_begin(ptr addrspace(10) @"ejl_inserted$jl_global_20935$false$4853528752") #609, !dbg !58531
call void @llvm.julia.gc_preserve_end(token %3) #609, !dbg !58534
%current_task1 = getelementptr inbounds i8, ptr %pgcstack, i64 -152, !dbg !58535
%"new::Dict" = call noalias nonnull align 8 dereferenceable(64) "enzyme_ReadOnlyOrThrow" "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Integer, [-1,0,1]:Integer, [-1,0,2]:Integer, [-1,0,3]:Integer, [-1,0,4]:Integer, [-1,0,5]:Integer, [-1,0,6]:Integer, [-1,0,7]:Integer, [-1,0,8]:Pointer, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Integer, [-1,16]:Pointer, [-1,16,0]:Integer, [-1,16,1]:Integer, [-1,16,2]:Integer, [-1,16,3]:Integer, [-1,16,4]:Integer, [-1,16,5]:Integer, [-1,16,6]:Integer, [-1,16,7]:Integer, [-1,16,8]:Pointer, [-1,16,8,-1]:Float@double, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer, [-1,48]:Integer, [-1,49]:Integer, [-1,50]:Integer, [-1,51]:Integer, [-1,52]:Integer, [-1,53]:Integer, [-1,54]:Integer, [-1,55]:Integer, [-1,56]:Integer, [-1,57]:Integer, [-1,58]:Integer, [-1,59]:Integer, [-1,60]:Integer, [-1,61]:Integer, [-1,62]:Integer, [-1,63]:Integer}" ptr addrspace(10) @julia.gc_alloc_obj(ptr nonnull %current_task1, i64 64, ptr addrspace(10) @"ejl_inserted$_Main_Base_Dict_23175$false$5567133456") #610, !dbg !58535, !enzymejl_gc_alloc_rt !8987
%4 = addrspacecast ptr addrspace(10) %"new::Dict" to ptr addrspace(11), !dbg !58535
store ptr addrspace(10) null, ptr addrspace(11) %4, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
%5 = getelementptr inbounds i8, ptr addrspace(11) %4, i64 8, !dbg !58535
store ptr addrspace(10) null, ptr addrspace(11) %5, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
%6 = getelementptr inbounds i8, ptr addrspace(11) %4, i64 16, !dbg !58535
store ptr addrspace(10) null, ptr addrspace(11) %6, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
store atomic ptr addrspace(10) @"ejl_inserted$jl_global_20935$false$4853528752", ptr addrspace(11) %4 release, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
store atomic ptr addrspace(10) @"ejl_inserted$jl_global_23039$false$5058645680", ptr addrspace(11) %5 release, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
store atomic ptr addrspace(10) @"ejl_inserted$jl_global_20431$false$4665833968", ptr addrspace(11) %6 release, align 8, !dbg !58535, !tbaa !592, !alias.scope !596, !noalias !58536
%"new::Dict.ndel_ptr" = getelementptr inbounds i8, ptr addrspace(11) %4, i64 24, !dbg !58535
%"new::Dict.idxfloor_ptr" = getelementptr inbounds i8, ptr addrspace(11) %4, i64 48, !dbg !58535
call void @llvm.memset.p11.i64(ptr addrspace(11) noundef align 8 dereferenceable(24) %"new::Dict.ndel_ptr", i8 0, i64 24, i1 false) #609, !dbg !58535, !enzyme_truetype !1007
store i64 1, ptr addrspace(11) %"new::Dict.idxfloor_ptr", align 8, !dbg !58535, !tbaa !1008, !alias.scope !596, !noalias !58536
%"new::Dict.maxprobe_ptr" = getelementptr inbounds i8, ptr addrspace(11) %4, i64 56, !dbg !58535
store i64 0, ptr addrspace(11) %"new::Dict.maxprobe_ptr", align 8, !dbg !58535, !tbaa !1008, !alias.scope !596, !noalias !58536
%"#3::Tuple.unbox" = load i64, ptr addrspace(11) %"#3::Tuple", align 8, !dbg !58539, !tbaa !920, !alias.scope !1046, !noalias !1047, !enzyme_inactive !0, !enzyme_type !617, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0
%"#3::Tuple.unbox.fr" = freeze i64 %"#3::Tuple.unbox", !dbg !58541
%7 = add i64 %"#3::Tuple.unbox.fr", -1, !dbg !58539
%boundscheck = icmp ult i64 %7, 3, !dbg !58539
br i1 %boundscheck, label %pass, label %fail, !dbg !58539

L41: ; preds = %pass5
%8 = sext i8 %.unbox to i16, !dbg !58543
%.lhs.trunc741 = sub nsw i16 3, %8, !dbg !58548
%9 = srem i16 %.lhs.trunc741, 3, !dbg !58550
%10 = icmp sgt i16 %9, -1, !dbg !58551
br i1 %10, label %L62, label %L64, !dbg !58552

L62: ; preds = %L41
%11 = trunc i16 %9 to i8, !dbg !58553
br label %L68, !dbg !58557

L64: ; preds = %L41
%12 = call fastcc [1 x ptr addrspace(10)] @julia_ArgumentError_20454(ptr addrspace(10) addrspacecast (ptr inttoptr (i64 4730608640 to ptr) to ptr addrspace(10))) #609, !dbg !58552
%"box::ArgumentError455" = call noalias nonnull align 8 dereferenceable(8) "enzyme_ReadOnlyOrThrow" "enzyme_inactive" "enzyme_type"="{[-1]:Pointer, [-1,-1]:Pointer}" ptr addrspace(10) @julia.gc_alloc_obj(ptr nonnull %current_task1, i64 8, ptr addrspace(10) @"ejl_inserted$_Core_ArgumentError_20403$false$4906584048") #610, !dbg !58552, !enzymejl_gc_alloc_rt !1125
%13 = addrspacecast ptr addrspace(10) %"box::ArgumentError455" to ptr addrspace(11), !dbg !58552, !enzyme_inactive !0
%14 = extractvalue [1 x ptr addrspace(10)] %12, 0, !dbg !58552, !enzyme_type !903
store ptr addrspace(10) %14, ptr addrspace(11) %13, align 8, !dbg !58552, !tbaa !1126, !alias.scope !596, !noalias !58536
%15 = addrspacecast ptr addrspace(10) %"box::ArgumentError455" to ptr addrspace(12), !dbg !58552, !enzyme_inactive !0
call void @ijl_throw(ptr addrspace(12) %15) #609, !dbg !58552
unreachable, !dbg !58552
...
ERROR: LoadError: Some tests did not pass: 0 passed, 0 failed, 1 errored, 0 broken.
in expression starting at /Users/khyatt/.julia/dev/TensorKit/planar_mwe.jl:54
test_reverse: planartrace! with return activity Duplicated on (::Tensor{ComplexF64, GradedSpace{ProductSector{Tuple{A4Irrep, Z4Element{2}}}, NTuple{16, Int64}}, 1, Vector{ComplexF64}}, Duplicated), (::TensorMap{ComplexF64, GradedSpace{ProductSector{Tuple{A4Irrep, Z4Element{2}}}, NTuple{16, Int64}}, 0, 3, Vector{ComplexF64}}, Duplicated), (::Tuple{Tuple{Int64}, Tuple{}}, Const), (::Tuple{Tuple{Int64}, Tuple{Int64}}, Const), (::ComplexF64, Const), (::ComplexF64, Const), (::TensorOperations.DefaultBackend, Const), (::TensorOperations.DefaultAllocator, Const): Error During Test at /Users/khyatt/.julia/packages/EnzymeTestUtils/fNmYk/src/test_reverse.jl:84
Got exception outside of a @test
LLVM error: function failed verification (4)
```

The full thing is too big even for a Gist, but you should be able to recreate it with the MWE.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.