ITADN

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

#3404Openkshyatt 创建于 23 天前
K
kshyattcommented
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 条评论