Another `LLVM error: function failed verification (4)`
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.
5 条评论