import core.stdc.stdio;
import std.algorithm;

static immutable int unSet=-114514;

struct Data{
	int a,l,r,m;
}
Data Comb(const ref Data a,const ref Data b){
	Data r;
	r.a=a.a+b.a;
	r.l=max(a.l,a.a+b.l);
	r.r=max(a.r+b.a,b.r);
	r.m=max(a.m,b.m,a.r+b.l);
	return r;
}

struct Node{
	Node* l,r,p;
	int delay=unSet,size,v;
	Data d;
	bool rev;
	int State(){
		if(p !is null){
			if(p.l==&this) return -1;
			if(p.r==&this) return 1;
		}
		return 0;
	}
	void Propagate(){
		if(rev){
			if(l !is null) l.rev=!l.rev;
			if(r !is null) r.rev=!r.rev;
			swap(l,r);
			swap(d.l,d.r);
			rev=false;
		}
		if(delay!=unSet){
			if(l !is null) l.delay=delay;
			if(r !is null) r.delay=delay;
			int s=delay*(delay<0?1:size);
			d=Data(delay*size,s,s,s);
			v=delay;
			delay=unSet;
		}
	}
	void Prepare(){
		if(State)
			p.Prepare;
		Propagate;
	}
	void Update(){
		Propagate;
		d=Data(v,v,v,v);
		size=1;
		if(l !is null){
			l.Propagate;
			d=Comb(l.d,d);
			size+=l.size;
		}
		if(r !is null){
			r.Propagate;
			d=Comb(d,r.d);
			size+=r.size;
		}
	}
	void Rotate(){
		Node* par=p,ch;
		if(p.l==&this){
			ch=r;
			r=p;
			r.l=ch;
		}else{
			ch=l;
			l=p;
			l.r=ch;
		}
		if(ch) ch.p=p;
		p=par.p;
		par.p=&this;
		if(p !is null){
			if(p.l==par) p.l=&this;
			if(p.r==par) p.r=&this;
		}
		par.Update;
		Update;
	}
	void Splay(){
		Prepare;
		while(State){
			int s=State*p.State;
			if(!s)
				Rotate;
			else if(s==1){
				p.Rotate;
				Rotate;
			}else{
				Rotate;
				Rotate;
			}
		}
	}
	void Expose(){
		Node* x=&this;
		while(x){
			x.Splay;
			x=x.p;
		}
		x=&this;
		while(x.p){
			x.p.r=x;
			x=x.p;
			x.Update;
		}
		Splay;
	}
	void Evert(){
		Expose;
		r=null;
		rev=!rev;
		Update;
	}
	void Link(Node* t){
		Evert;
		t.Expose;
		p=t;
		t.r=&this;
		t.Update;
	}
	void Set(int x){
		Expose;
		r=null;
		delay=x;
		Update;
	}
	int Get(){
		Expose;
		r=null;
		Update;
		return d.m;
	}
}

void main(){
	int n,q;
	scanf("%d%d",&n,&q);
	Node[] ns=new Node[n];
	foreach(ref nd;ns){
		int w;
		scanf("%d",&w);
		nd.v=w;
		nd.d=Data(w,w,w,w);
	}
	foreach(i;0..n-1){
		int s,e;
		scanf("%d%d",&s,&e);
		ns[--s].Link(&ns[--e]);
	}
	foreach(_;0..q){
		int t,a,b,c;
		scanf("%d%d%d%d",&t,&a,&b,&c);
		if(t==1){
			ns[--a].Evert;
			ns[--b].Set(c);
		}else{
			ns[--a].Evert;
			printf("%d\n",ns[--b].Get);
		}
	}
}
; ModuleID = '/data/TheStack_IR/OJ_Samples/Collated/D/Source_11483/source.d'
source_filename = "/data/TheStack_IR/OJ_Samples/Collated/D/Source_11483/source.d"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

%0 = type { i32, i32, [7 x i8] }
%source.Node = type { %source.Node*, %source.Node*, %source.Node*, i32, i32, i32, %source.Data, i8, [3 x i8] }
%source.Data = type { i32, i32, i32, i32 }
%object.TypeInfo_Array = type { [19 x i8*]*, i8*, %object.TypeInfo* }
%object.TypeInfo = type { [19 x i8*]*, i8* }
%object.TypeInfo_Struct = type { [19 x i8*]*, i8*, { i64, i8* }, { i64, i8* }, i64 (i8*)*, i1 (i8*, i8*)*, i32 (i8*, i8*)*, { i64, i8* } (i8*)*, i32, [4 x i8], void (i8*)*, void (i8*)*, i32, [4 x i8], %object.TypeInfo*, %object.TypeInfo*, i8* }
%object.ModuleInfo = type { i32, i32 }

@_D6source5unSetyi = local_unnamed_addr constant i32 -114514, align 4 ; [#uses = 0]
@_D6source4Node6__initZ = constant %source.Node { %source.Node* null, %source.Node* null, %source.Node* null, i32 -114514, i32 0, i32 0, %source.Data zeroinitializer, i8 0, [3 x i8] zeroinitializer }, align 8 ; [#uses = 1]
@.str = private unnamed_addr constant [5 x i8] c"%d%d\00" ; [#uses = 1]
@_D23TypeInfo_AS6source4Node6__initZ = linkonce_odr global %object.TypeInfo_Array { [19 x i8*]* @_D14TypeInfo_Array6__vtblZ, i8* null, %object.TypeInfo* bitcast (%object.TypeInfo_Struct* @_D22TypeInfo_S6source4Node6__initZ to %object.TypeInfo*) } ; [#uses = 1]
@_D14TypeInfo_Array6__vtblZ = external constant [19 x i8*] ; [#uses = 1]
@_D22TypeInfo_S6source4Node6__initZ = linkonce_odr global %object.TypeInfo_Struct { [19 x i8*]* @_D15TypeInfo_Struct6__vtblZ, i8* null, { i64, i8* } { i64 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0) }, { i64, i8* } { i64 56, i8* bitcast (%source.Node* @_D6source4Node6__initZ to i8*) }, i64 (i8*)* null, i1 (i8*, i8*)* null, i32 (i8*, i8*)* null, { i64, i8* } (i8*)* null, i32 1, [4 x i8] zeroinitializer, void (i8*)* null, void (i8*)* null, i32 8, [4 x i8] zeroinitializer, %object.TypeInfo* null, %object.TypeInfo* null, i8* bitcast ([2 x i64]* @_D6object__T10RTInfoImplVAmA2i56i7ZQxyG2m to i8*) } ; [#uses = 1]
@_D15TypeInfo_Struct6__vtblZ = external constant [19 x i8*] ; [#uses = 1]
@.str.1 = private unnamed_addr constant [14 x i8] c"S6source4Node\00" ; [#uses = 1]
@_D6object__T10RTInfoImplVAmA2i56i7ZQxyG2m = weak_odr constant [2 x i64] [i64 56, i64 7], align 8 ; [#uses = 1]
@.str.2 = private unnamed_addr constant [3 x i8] c"%d\00" ; [#uses = 1]
@.str.3 = private unnamed_addr constant [62 x i8] c"/data/TheStack_IR/OJ_Samples/Collated/D/Source_11483/source.d\00" ; [#uses = 1]
@.str.4 = private unnamed_addr constant [9 x i8] c"%d%d%d%d\00" ; [#uses = 1]
@.str.5 = private unnamed_addr constant [4 x i8] c"%d\0A\00" ; [#uses = 1]
@.str.6 = private unnamed_addr constant [28 x i8] c"Swap: lhs internal pointer.\00" ; [#uses = 1]
@.str.7 = private unnamed_addr constant [65 x i8] c"/usr/lib/ldc/x86_64-linux-gnu/include/d/std/algorithm/mutation.d\00" ; [#uses = 1]
@.str.8 = private unnamed_addr constant [28 x i8] c"Swap: rhs internal pointer.\00" ; [#uses = 1]
@.str.9 = private unnamed_addr constant [25 x i8] c"Swap: lhs points to rhs.\00" ; [#uses = 1]
@.str.10 = private unnamed_addr constant [25 x i8] c"Swap: rhs points to lhs.\00" ; [#uses = 1]
@_D6source12__ModuleInfoZ = global %0 { i32 -2147483644, i32 0, [7 x i8] c"source\00" } ; [#uses = 1]
@_D6source11__moduleRefZ = linkonce_odr hidden global %object.ModuleInfo* bitcast (%0* @_D6source12__ModuleInfoZ to %object.ModuleInfo*), section "__minfo" ; [#uses = 1]
@__start___minfo = external hidden global %object.ModuleInfo* ; [#uses = 1]
@__stop___minfo = external hidden global %object.ModuleInfo* ; [#uses = 1]
@ldc.dso_slot = linkonce_odr hidden global i8* null ; [#uses = 1]
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ldc.register_dso, i8* bitcast (void ()* @ldc.register_dso to i8*) }] ; [#uses = 0]
@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ldc.register_dso, i8* bitcast (void ()* @ldc.register_dso to i8*) }] ; [#uses = 0]
@llvm.used = appending global [1 x i8*] [i8* bitcast (%object.ModuleInfo** @_D6source11__moduleRefZ to i8*)], section "llvm.metadata" ; [#uses = 0]

; [#uses = 0]
; Function Attrs: norecurse nounwind readonly uwtable
define { i64, i64 } @_D6source4CombFKxSQq4DataKxQkZSQBdQo(%source.Data* nocapture readonly dereferenceable(16) %b, %source.Data* nocapture readonly dereferenceable(16) %a) local_unnamed_addr #0 {
  %1 = getelementptr inbounds %source.Data, %source.Data* %a, i64 0, i32 0 ; [#uses = 1, type = i32*]
  %2 = load i32, i32* %1, align 4                 ; [#uses = 2]
  %3 = getelementptr inbounds %source.Data, %source.Data* %b, i64 0, i32 0 ; [#uses = 1, type = i32*]
  %4 = load i32, i32* %3, align 4                 ; [#uses = 2]
  %5 = add i32 %4, %2                             ; [#uses = 1]
  %6 = getelementptr inbounds %source.Data, %source.Data* %a, i64 0, i32 1 ; [#uses = 1, type = i32*]
  %7 = load i32, i32* %6, align 4                 ; [#uses = 2]
  %8 = getelementptr inbounds %source.Data, %source.Data* %b, i64 0, i32 1 ; [#uses = 1, type = i32*]
  %9 = load i32, i32* %8, align 4                 ; [#uses = 2]
  %10 = add i32 %9, %2                            ; [#uses = 2]
  %11 = icmp slt i32 %7, %10                      ; [#uses = 1]
  %b_arg.a_arg.i = select i1 %11, i32 %10, i32 %7 ; [#uses = 1]
  %12 = getelementptr inbounds %source.Data, %source.Data* %a, i64 0, i32 2 ; [#uses = 1, type = i32*]
  %13 = load i32, i32* %12, align 4               ; [#uses = 2]
  %14 = add i32 %13, %4                           ; [#uses = 2]
  %15 = getelementptr inbounds %source.Data, %source.Data* %b, i64 0, i32 2 ; [#uses = 1, type = i32*]
  %16 = load i32, i32* %15, align 4               ; [#uses = 2]
  %17 = icmp slt i32 %14, %16                     ; [#uses = 1]
  %b_arg.a_arg.i3 = select i1 %17, i32 %16, i32 %14 ; [#uses = 1]
  %r.sroa.4.8.insert.ext = zext i32 %b_arg.a_arg.i3 to i64 ; [#uses = 1]
  %18 = getelementptr inbounds %source.Data, %source.Data* %a, i64 0, i32 3 ; [#uses = 1, type = i32*]
  %19 = load i32, i32* %18, align 4               ; [#uses = 2]
  %20 = getelementptr inbounds %source.Data, %source.Data* %b, i64 0, i32 3 ; [#uses = 1, type = i32*]
  %21 = load i32, i32* %20, align 4               ; [#uses = 2]
  %22 = add i32 %13, %9                           ; [#uses = 2]
  %23 = icmp slt i32 %19, %21                     ; [#uses = 1]
  %b_arg.a_arg.i.i = select i1 %23, i32 %21, i32 %19 ; [#uses = 2]
  %24 = icmp slt i32 %b_arg.a_arg.i.i, %22        ; [#uses = 1]
  %.sroa.speculated.i = select i1 %24, i32 %22, i32 %b_arg.a_arg.i.i ; [#uses = 1]
  %r.sroa.4.12.insert.ext = zext i32 %.sroa.speculated.i to i64 ; [#uses = 1]
  %r.sroa.4.12.insert.shift = shl nuw i64 %r.sroa.4.12.insert.ext, 32 ; [#uses = 1]
  %r.sroa.4.12.insert.insert = or i64 %r.sroa.4.12.insert.shift, %r.sroa.4.8.insert.ext ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.ext = zext i32 %b_arg.a_arg.i to i64 ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.shift = shl nuw i64 %r.sroa.0.sroa.3.0.insert.ext, 32 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.ext = zext i32 %5 to i64 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.insert = or i64 %r.sroa.0.sroa.3.0.insert.shift, %r.sroa.0.sroa.0.0.insert.ext ; [#uses = 1]
  %.BaseBitcastABIRewrite_arg.fca.0.insert = insertvalue { i64, i64 } undef, i64 %r.sroa.0.sroa.0.0.insert.insert, 0 ; [#uses = 1]
  %.BaseBitcastABIRewrite_arg.fca.1.insert = insertvalue { i64, i64 } %.BaseBitcastABIRewrite_arg.fca.0.insert, i64 %r.sroa.4.12.insert.insert, 1 ; [#uses = 1]
  ret { i64, i64 } %.BaseBitcastABIRewrite_arg.fca.1.insert
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr i32 @_D3std9algorithm10comparison__T3maxTxiTxiZQlFNaNbNiNfxixiZxi(i32 %b_arg, i32 %a_arg) local_unnamed_addr #1 {
condend:
  %0 = icmp slt i32 %a_arg, %b_arg                ; [#uses = 1]
  %b_arg.a_arg = select i1 %0, i32 %b_arg, i32 %a_arg ; [#uses = 1]
  ret i32 %b_arg.a_arg
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr i32 @_D3std9algorithm10comparison__T3maxTxiTxiTxiZQoFNaNbNiNfxixixiZxi(i32 %_param_2_arg, i32 %_param_1_arg, i32 %_param_0_arg) local_unnamed_addr #1 {
condend:
  %0 = icmp slt i32 %_param_0_arg, %_param_1_arg  ; [#uses = 1]
  %b_arg.a_arg.i = select i1 %0, i32 %_param_1_arg, i32 %_param_0_arg ; [#uses = 2]
  %1 = icmp slt i32 %b_arg.a_arg.i, %_param_2_arg ; [#uses = 1]
  %.sroa.speculated = select i1 %1, i32 %_param_2_arg, i32 %b_arg.a_arg.i ; [#uses = 1]
  ret i32 %.sroa.speculated
}

; [#uses = 0]
; Function Attrs: norecurse nounwind readonly uwtable
define i32 @_D6source4Node5StateMFZi(%source.Node* nonnull readonly %.this_arg) local_unnamed_addr #0 {
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not = icmp eq %source.Node* %2, null          ; [#uses = 1]
  br i1 %.not, label %endif, label %if

if:                                               ; preds = %0
  %3 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 0 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 1]
  %5 = icmp eq %source.Node* %4, %.this_arg       ; [#uses = 1]
  br i1 %5, label %if1, label %endif2

if1:                                              ; preds = %endif2, %endif, %if
  %merge = phi i32 [ -1, %if ], [ 0, %endif ], [ 1, %endif2 ] ; [#uses = 1, type = i32]
  ret i32 %merge

endif2:                                           ; preds = %if
  %6 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %7 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 1]
  %8 = icmp eq %source.Node* %7, %.this_arg       ; [#uses = 1]
  br i1 %8, label %if1, label %endif

endif:                                            ; preds = %0, %endif2
  br label %if1
}

; [#uses = 4]
; Function Attrs: uwtable
define void @_D6source4Node9PropagateMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 7 ; [#uses = 2, type = i8*]
  %2 = load i8, i8* %1, align 1, !range !3        ; [#uses = 1]
  %.not = icmp eq i8 %2, 0                        ; [#uses = 1]
  br i1 %.not, label %endif, label %if

if:                                               ; preds = %0
  %3 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not23 = icmp eq %source.Node* %4, null        ; [#uses = 1]
  br i1 %.not23, label %endif2, label %if1

if1:                                              ; preds = %if
  %5 = getelementptr inbounds %source.Node, %source.Node* %4, i64 0, i32 7 ; [#uses = 2, type = i8*]
  %6 = load i8, i8* %5, align 1, !range !3        ; [#uses = 1]
  %7 = xor i8 %6, 1                               ; [#uses = 1]
  store i8 %7, i8* %5, align 1
  br label %endif2

endif2:                                           ; preds = %if, %if1
  %8 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 5, type = %source.Node**]
  %9 = load %source.Node*, %source.Node** %8, align 8 ; [#uses = 2]
  %.not24 = icmp eq %source.Node* %9, null        ; [#uses = 1]
  br i1 %.not24, label %endif4, label %if3

if3:                                              ; preds = %endif2
  %10 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 7 ; [#uses = 2, type = i8*]
  %11 = load i8, i8* %10, align 1, !range !3      ; [#uses = 1]
  %12 = xor i8 %11, 1                             ; [#uses = 1]
  store i8 %12, i8* %10, align 1
  br label %endif4

endif4:                                           ; preds = %endif2, %if3
  %13 = bitcast %source.Node* %.this_arg to i8**  ; [#uses = 1]
  %14 = load i8*, i8** %13, align 8               ; [#uses = 5]
  %15 = bitcast %source.Node* %.this_arg to i8*   ; [#uses = 2]
  %16 = getelementptr inbounds %source.Node*, %source.Node** %3, i64 1 ; [#uses = 1, type = %source.Node**]
  %17 = bitcast %source.Node** %16 to i8*         ; [#uses = 2]
  %.not.i.i = icmp uge i8* %14, %15               ; [#uses = 1]
  %18 = icmp ult i8* %14, %17                     ; [#uses = 1]
  %andandval.i.i = and i1 %.not.i.i, %18          ; [#uses = 1]
  br i1 %andandval.i.i, label %assertFailed.i, label %assertPassed.i

assertPassed.i:                                   ; preds = %endif4
  %19 = bitcast %source.Node** %8 to i8**         ; [#uses = 1]
  %20 = load i8*, i8** %19, align 8               ; [#uses = 5]
  %21 = bitcast %source.Node** %8 to i8*          ; [#uses = 2]
  %22 = getelementptr inbounds %source.Node*, %source.Node** %8, i64 1 ; [#uses = 1, type = %source.Node**]
  %23 = bitcast %source.Node** %22 to i8*         ; [#uses = 2]
  %.not.i11.i = icmp uge i8* %20, %21             ; [#uses = 1]
  %24 = icmp ult i8* %20, %23                     ; [#uses = 1]
  %andandval.i12.i = and i1 %.not.i11.i, %24      ; [#uses = 1]
  br i1 %andandval.i12.i, label %assertFailed2.i, label %assertPassed1.i

assertPassed1.i:                                  ; preds = %assertPassed.i
  %.not.i9.i = icmp uge i8* %14, %21              ; [#uses = 1]
  %25 = icmp ult i8* %14, %23                     ; [#uses = 1]
  %andandval.i10.i = and i1 %.not.i9.i, %25       ; [#uses = 1]
  br i1 %andandval.i10.i, label %assertFailed4.i, label %assertPassed3.i

assertPassed3.i:                                  ; preds = %assertPassed1.i
  %.not.i7.i = icmp uge i8* %20, %15              ; [#uses = 1]
  %26 = icmp ult i8* %20, %17                     ; [#uses = 1]
  %andandval.i8.i = and i1 %.not.i7.i, %26        ; [#uses = 1]
  br i1 %andandval.i8.i, label %assertFailed6.i, label %_D3std9algorithm8mutation__T4swapTPS6source4NodeZQvFNaNbNiNeKQBbKQBfZv.exit

assertFailed6.i:                                  ; preds = %assertPassed3.i
  tail call void @_d_assert_msg({ i64, i8* } { i64 24, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.10, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2831) #5
  unreachable

assertFailed4.i:                                  ; preds = %assertPassed1.i
  tail call void @_d_assert_msg({ i64, i8* } { i64 24, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.9, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2830) #5
  unreachable

assertFailed2.i:                                  ; preds = %assertPassed.i
  tail call void @_d_assert_msg({ i64, i8* } { i64 27, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.8, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2829) #5
  unreachable

assertFailed.i:                                   ; preds = %endif4
  tail call void @_d_assert_msg({ i64, i8* } { i64 27, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.6, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2828) #5
  unreachable

_D3std9algorithm8mutation__T4swapTPS6source4NodeZQvFNaNbNiNeKQBbKQBfZv.exit: ; preds = %assertPassed3.i
  %27 = ptrtoint i8* %20 to i64                   ; [#uses = 1]
  %28 = ptrtoint i8* %14 to i64                   ; [#uses = 1]
  %29 = bitcast %source.Node* %.this_arg to i64*  ; [#uses = 1]
  %30 = bitcast %source.Node** %8 to i64*         ; [#uses = 1]
  store i64 %27, i64* %29, align 8
  store i64 %28, i64* %30, align 8
  %31 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 1 ; [#uses = 2, type = i32*]
  %32 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 2 ; [#uses = 2, type = i32*]
  %33 = load i32, i32* %31, align 4               ; [#uses = 1]
  %34 = load i32, i32* %32, align 4               ; [#uses = 1]
  store i32 %34, i32* %31, align 4
  store i32 %33, i32* %32, align 4
  store i8 0, i8* %1, align 1
  br label %endif

endif:                                            ; preds = %0, %_D3std9algorithm8mutation__T4swapTPS6source4NodeZQvFNaNbNiNeKQBbKQBfZv.exit
  %35 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 3 ; [#uses = 4, type = i32*]
  %36 = load i32, i32* %35, align 4               ; [#uses = 2]
  %.not20 = icmp eq i32 %36, -114514              ; [#uses = 1]
  br i1 %.not20, label %endif6, label %if5

if5:                                              ; preds = %endif
  %37 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 0 ; [#uses = 1, type = %source.Node**]
  %38 = load %source.Node*, %source.Node** %37, align 8 ; [#uses = 2]
  %.not21 = icmp eq %source.Node* %38, null       ; [#uses = 1]
  br i1 %.not21, label %endif8, label %if7

if7:                                              ; preds = %if5
  %39 = getelementptr inbounds %source.Node, %source.Node* %38, i64 0, i32 3 ; [#uses = 1, type = i32*]
  store i32 %36, i32* %39, align 4
  br label %endif8

endif8:                                           ; preds = %if5, %if7
  %40 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %41 = load %source.Node*, %source.Node** %40, align 8 ; [#uses = 2]
  %.not22 = icmp eq %source.Node* %41, null       ; [#uses = 1]
  br i1 %.not22, label %endif10, label %if9

if9:                                              ; preds = %endif8
  %42 = getelementptr inbounds %source.Node, %source.Node* %41, i64 0, i32 3 ; [#uses = 1, type = i32*]
  %43 = load i32, i32* %35, align 4               ; [#uses = 1]
  store i32 %43, i32* %42, align 4
  br label %endif10

endif10:                                          ; preds = %endif8, %if9
  %44 = load i32, i32* %35, align 4               ; [#uses = 4]
  %45 = icmp slt i32 %44, 0                       ; [#uses = 1]
  %.phi.trans.insert = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 4 ; [#uses = 1, type = i32*]
  %.pre = load i32, i32* %.phi.trans.insert, align 4 ; [#uses = 2]
  %..pre = select i1 %45, i32 1, i32 %.pre        ; [#uses = 1]
  %46 = mul i32 %..pre, %44                       ; [#uses = 3]
  %47 = mul i32 %.pre, %44                        ; [#uses = 1]
  %.structliteral.sroa.0.0..sroa_idx = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 0 ; [#uses = 1, type = i32*]
  store i32 %47, i32* %.structliteral.sroa.0.0..sroa_idx, align 1
  %.structliteral.sroa.2.0..sroa_idx11 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 1 ; [#uses = 1, type = i32*]
  store i32 %46, i32* %.structliteral.sroa.2.0..sroa_idx11, align 1
  %.structliteral.sroa.3.0..sroa_idx12 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 2 ; [#uses = 1, type = i32*]
  store i32 %46, i32* %.structliteral.sroa.3.0..sroa_idx12, align 1
  %.structliteral.sroa.4.0..sroa_idx13 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 3 ; [#uses = 1, type = i32*]
  store i32 %46, i32* %.structliteral.sroa.4.0..sroa_idx13, align 1
  %48 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 5 ; [#uses = 1, type = i32*]
  store i32 %44, i32* %48, align 4
  store i32 -114514, i32* %35, align 4
  br label %endif6

endif6:                                           ; preds = %endif, %endif10
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr void @_D3std9algorithm8mutation__T4swapTPS6source4NodeZQvFNaNbNiNeKQBbKQBfZv(%source.Node** dereferenceable(8) %rhs, %source.Node** dereferenceable(8) %lhs) local_unnamed_addr #1 {
  %1 = bitcast %source.Node** %lhs to i8**        ; [#uses = 1]
  %2 = load i8*, i8** %1, align 8                 ; [#uses = 5]
  %3 = bitcast %source.Node** %lhs to i8*         ; [#uses = 2]
  %4 = getelementptr inbounds %source.Node*, %source.Node** %lhs, i64 1 ; [#uses = 1, type = %source.Node**]
  %5 = bitcast %source.Node** %4 to i8*           ; [#uses = 2]
  %.not.i = icmp uge i8* %2, %3                   ; [#uses = 1]
  %6 = icmp ult i8* %2, %5                        ; [#uses = 1]
  %andandval.i = and i1 %.not.i, %6               ; [#uses = 1]
  br i1 %andandval.i, label %assertFailed, label %assertPassed

assertPassed:                                     ; preds = %0
  %7 = bitcast %source.Node** %rhs to i8**        ; [#uses = 1]
  %8 = load i8*, i8** %7, align 8                 ; [#uses = 5]
  %9 = bitcast %source.Node** %rhs to i8*         ; [#uses = 2]
  %10 = getelementptr inbounds %source.Node*, %source.Node** %rhs, i64 1 ; [#uses = 1, type = %source.Node**]
  %11 = bitcast %source.Node** %10 to i8*         ; [#uses = 2]
  %.not.i11 = icmp uge i8* %8, %9                 ; [#uses = 1]
  %12 = icmp ult i8* %8, %11                      ; [#uses = 1]
  %andandval.i12 = and i1 %.not.i11, %12          ; [#uses = 1]
  br i1 %andandval.i12, label %assertFailed2, label %assertPassed1

assertPassed1:                                    ; preds = %assertPassed
  %.not.i9 = icmp uge i8* %2, %9                  ; [#uses = 1]
  %13 = icmp ult i8* %2, %11                      ; [#uses = 1]
  %andandval.i10 = and i1 %.not.i9, %13           ; [#uses = 1]
  br i1 %andandval.i10, label %assertFailed4, label %assertPassed3

assertPassed3:                                    ; preds = %assertPassed1
  %.not.i7 = icmp uge i8* %8, %3                  ; [#uses = 1]
  %14 = icmp ult i8* %8, %5                       ; [#uses = 1]
  %andandval.i8 = and i1 %.not.i7, %14            ; [#uses = 1]
  br i1 %andandval.i8, label %assertFailed6, label %assertPassed5

assertPassed5:                                    ; preds = %assertPassed3
  %15 = ptrtoint i8* %8 to i64                    ; [#uses = 1]
  %16 = ptrtoint i8* %2 to i64                    ; [#uses = 1]
  %17 = bitcast %source.Node** %lhs to i64*       ; [#uses = 1]
  %18 = bitcast %source.Node** %rhs to i64*       ; [#uses = 1]
  store i64 %15, i64* %17, align 8
  store i64 %16, i64* %18, align 8
  ret void

assertFailed6:                                    ; preds = %assertPassed3
  tail call void @_d_assert_msg({ i64, i8* } { i64 24, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.10, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2831) #5
  unreachable

assertFailed4:                                    ; preds = %assertPassed1
  tail call void @_d_assert_msg({ i64, i8* } { i64 24, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.9, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2830) #5
  unreachable

assertFailed2:                                    ; preds = %assertPassed
  tail call void @_d_assert_msg({ i64, i8* } { i64 27, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.8, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2829) #5
  unreachable

assertFailed:                                     ; preds = %0
  tail call void @_d_assert_msg({ i64, i8* } { i64 27, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.6, i32 0, i32 0) }, { i64, i8* } { i64 64, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0) }, i32 2828) #5
  unreachable
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr void @_D3std9algorithm8mutation__T4swapTiZQiFNaNbNiNeKiKiZv(i32* dereferenceable(4) %rhs, i32* dereferenceable(4) %lhs) local_unnamed_addr #1 {
  %1 = load i32, i32* %lhs, align 4               ; [#uses = 1]
  %2 = load i32, i32* %rhs, align 4               ; [#uses = 1]
  store i32 %2, i32* %lhs, align 4
  store i32 %1, i32* %rhs, align 4
  ret void
}

; [#uses = 2]
; Function Attrs: uwtable
define void @_D6source4Node7PrepareMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 4]
  %.not.i = icmp eq %source.Node* %2, null        ; [#uses = 1]
  br i1 %.not.i, label %endif, label %if.i

if.i:                                             ; preds = %0
  %3 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 0 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 1]
  %5 = icmp eq %source.Node* %4, %.this_arg       ; [#uses = 1]
  br i1 %5, label %if, label %endif2.i

endif2.i:                                         ; preds = %if.i
  %6 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %7 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 1]
  %8 = icmp eq %source.Node* %7, %.this_arg       ; [#uses = 1]
  br i1 %8, label %if, label %endif

if:                                               ; preds = %if.i, %endif2.i
  tail call void @_D6source4Node7PrepareMFZv(%source.Node* nonnull %2) #1
  br label %endif

endif:                                            ; preds = %endif2.i, %0, %if
  tail call void @_D6source4Node9PropagateMFZv(%source.Node* nonnull %.this_arg) #1
  ret void
}

; [#uses = 27]
; Function Attrs: uwtable
define void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  tail call void @_D6source4Node9PropagateMFZv(%source.Node* nonnull %.this_arg) #1
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 5 ; [#uses = 1, type = i32*]
  %2 = load i32, i32* %1, align 4                 ; [#uses = 1]
  %.structliteral.sroa.0.0..sroa_idx = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 0 ; [#uses = 1, type = i32*]
  %.structliteral.sroa.2.0..sroa_idx8 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 1 ; [#uses = 2, type = i32*]
  %.structliteral.sroa.3.0..sroa_idx9 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 2 ; [#uses = 4, type = i32*]
  %.structliteral.sroa.4.0..sroa_idx10 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 3 ; [#uses = 2, type = i32*]
  %3 = insertelement <4 x i32> undef, i32 %2, i32 0 ; [#uses = 1]
  %4 = shufflevector <4 x i32> %3, <4 x i32> undef, <4 x i32> zeroinitializer ; [#uses = 1]
  %5 = bitcast i32* %.structliteral.sroa.0.0..sroa_idx to <4 x i32>* ; [#uses = 1]
  store <4 x i32> %4, <4 x i32>* %5, align 1
  %6 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 4 ; [#uses = 5, type = i32*]
  store i32 1, i32* %6, align 4
  %7 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %8 = load %source.Node*, %source.Node** %7, align 8 ; [#uses = 2]
  %.not = icmp eq %source.Node* %8, null          ; [#uses = 1]
  br i1 %.not, label %endif, label %if

if:                                               ; preds = %0
  tail call void @_D6source4Node9PropagateMFZv(%source.Node* nonnull %8) #1
  %9 = load %source.Node*, %source.Node** %7, align 8 ; [#uses = 5]
  %10 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6 ; [#uses = 2, type = %source.Data*]
  %11 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 6, i32 0 ; [#uses = 1, type = i32*]
  %12 = load i32, i32* %11, align 4               ; [#uses = 2]
  %13 = getelementptr inbounds %source.Data, %source.Data* %10, i64 0, i32 0 ; [#uses = 1, type = i32*]
  %14 = load i32, i32* %13, align 4               ; [#uses = 2]
  %15 = add i32 %14, %12                          ; [#uses = 1]
  %16 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 6, i32 1 ; [#uses = 1, type = i32*]
  %17 = load i32, i32* %16, align 4               ; [#uses = 2]
  %18 = load i32, i32* %.structliteral.sroa.2.0..sroa_idx8, align 4 ; [#uses = 2]
  %19 = add i32 %18, %12                          ; [#uses = 2]
  %20 = icmp slt i32 %17, %19                     ; [#uses = 1]
  %b_arg.a_arg.i.i = select i1 %20, i32 %19, i32 %17 ; [#uses = 1]
  %21 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 6, i32 2 ; [#uses = 1, type = i32*]
  %22 = load i32, i32* %21, align 4               ; [#uses = 2]
  %23 = add i32 %22, %14                          ; [#uses = 2]
  %24 = load i32, i32* %.structliteral.sroa.3.0..sroa_idx9, align 4 ; [#uses = 2]
  %25 = icmp slt i32 %23, %24                     ; [#uses = 1]
  %b_arg.a_arg.i3.i = select i1 %25, i32 %24, i32 %23 ; [#uses = 1]
  %r.sroa.4.8.insert.ext.i = zext i32 %b_arg.a_arg.i3.i to i64 ; [#uses = 1]
  %26 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 6, i32 3 ; [#uses = 1, type = i32*]
  %27 = load i32, i32* %26, align 4               ; [#uses = 2]
  %28 = load i32, i32* %.structliteral.sroa.4.0..sroa_idx10, align 4 ; [#uses = 2]
  %29 = add i32 %22, %18                          ; [#uses = 2]
  %30 = icmp slt i32 %27, %28                     ; [#uses = 1]
  %b_arg.a_arg.i.i.i = select i1 %30, i32 %28, i32 %27 ; [#uses = 2]
  %31 = icmp slt i32 %b_arg.a_arg.i.i.i, %29      ; [#uses = 1]
  %.sroa.speculated.i.i = select i1 %31, i32 %29, i32 %b_arg.a_arg.i.i.i ; [#uses = 1]
  %r.sroa.4.12.insert.ext.i = zext i32 %.sroa.speculated.i.i to i64 ; [#uses = 1]
  %r.sroa.4.12.insert.shift.i = shl nuw i64 %r.sroa.4.12.insert.ext.i, 32 ; [#uses = 1]
  %r.sroa.4.12.insert.insert.i = or i64 %r.sroa.4.12.insert.shift.i, %r.sroa.4.8.insert.ext.i ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.ext.i = zext i32 %b_arg.a_arg.i.i to i64 ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.shift.i = shl nuw i64 %r.sroa.0.sroa.3.0.insert.ext.i, 32 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.ext.i = zext i32 %15 to i64 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.insert.i = or i64 %r.sroa.0.sroa.3.0.insert.shift.i, %r.sroa.0.sroa.0.0.insert.ext.i ; [#uses = 1]
  %.BaseBitcastABIRewrite_param_storage.sroa.0.0..sroa_cast = bitcast %source.Data* %10 to i64* ; [#uses = 1]
  store i64 %r.sroa.0.sroa.0.0.insert.insert.i, i64* %.BaseBitcastABIRewrite_param_storage.sroa.0.0..sroa_cast, align 1
  %.BaseBitcastABIRewrite_param_storage.sroa.2.0..sroa_cast = bitcast i32* %.structliteral.sroa.3.0..sroa_idx9 to i64* ; [#uses = 1]
  store i64 %r.sroa.4.12.insert.insert.i, i64* %.BaseBitcastABIRewrite_param_storage.sroa.2.0..sroa_cast, align 1
  %32 = getelementptr inbounds %source.Node, %source.Node* %9, i64 0, i32 4 ; [#uses = 1, type = i32*]
  %33 = load i32, i32* %32, align 4               ; [#uses = 1]
  %34 = load i32, i32* %6, align 4                ; [#uses = 1]
  %35 = add i32 %34, %33                          ; [#uses = 1]
  store i32 %35, i32* %6, align 4
  br label %endif

endif:                                            ; preds = %0, %if
  %36 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %37 = load %source.Node*, %source.Node** %36, align 8 ; [#uses = 2]
  %.not12 = icmp eq %source.Node* %37, null       ; [#uses = 1]
  br i1 %.not12, label %endif2, label %if1

if1:                                              ; preds = %endif
  tail call void @_D6source4Node9PropagateMFZv(%source.Node* nonnull %37) #1
  %38 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6 ; [#uses = 2, type = %source.Data*]
  %39 = load %source.Node*, %source.Node** %36, align 8 ; [#uses = 5]
  %40 = getelementptr inbounds %source.Data, %source.Data* %38, i64 0, i32 0 ; [#uses = 1, type = i32*]
  %41 = load i32, i32* %40, align 4               ; [#uses = 2]
  %42 = getelementptr inbounds %source.Node, %source.Node* %39, i64 0, i32 6, i32 0 ; [#uses = 1, type = i32*]
  %43 = load i32, i32* %42, align 4               ; [#uses = 2]
  %44 = add i32 %43, %41                          ; [#uses = 1]
  %45 = load i32, i32* %.structliteral.sroa.2.0..sroa_idx8, align 4 ; [#uses = 2]
  %46 = getelementptr inbounds %source.Node, %source.Node* %39, i64 0, i32 6, i32 1 ; [#uses = 1, type = i32*]
  %47 = load i32, i32* %46, align 4               ; [#uses = 2]
  %48 = add i32 %47, %41                          ; [#uses = 2]
  %49 = icmp slt i32 %45, %48                     ; [#uses = 1]
  %b_arg.a_arg.i.i13 = select i1 %49, i32 %48, i32 %45 ; [#uses = 1]
  %50 = load i32, i32* %.structliteral.sroa.3.0..sroa_idx9, align 4 ; [#uses = 2]
  %51 = add i32 %50, %43                          ; [#uses = 2]
  %52 = getelementptr inbounds %source.Node, %source.Node* %39, i64 0, i32 6, i32 2 ; [#uses = 1, type = i32*]
  %53 = load i32, i32* %52, align 4               ; [#uses = 2]
  %54 = icmp slt i32 %51, %53                     ; [#uses = 1]
  %b_arg.a_arg.i3.i14 = select i1 %54, i32 %53, i32 %51 ; [#uses = 1]
  %r.sroa.4.8.insert.ext.i15 = zext i32 %b_arg.a_arg.i3.i14 to i64 ; [#uses = 1]
  %55 = load i32, i32* %.structliteral.sroa.4.0..sroa_idx10, align 4 ; [#uses = 2]
  %56 = getelementptr inbounds %source.Node, %source.Node* %39, i64 0, i32 6, i32 3 ; [#uses = 1, type = i32*]
  %57 = load i32, i32* %56, align 4               ; [#uses = 2]
  %58 = add i32 %50, %47                          ; [#uses = 2]
  %59 = icmp slt i32 %55, %57                     ; [#uses = 1]
  %b_arg.a_arg.i.i.i16 = select i1 %59, i32 %57, i32 %55 ; [#uses = 2]
  %60 = icmp slt i32 %b_arg.a_arg.i.i.i16, %58    ; [#uses = 1]
  %.sroa.speculated.i.i17 = select i1 %60, i32 %58, i32 %b_arg.a_arg.i.i.i16 ; [#uses = 1]
  %r.sroa.4.12.insert.ext.i18 = zext i32 %.sroa.speculated.i.i17 to i64 ; [#uses = 1]
  %r.sroa.4.12.insert.shift.i19 = shl nuw i64 %r.sroa.4.12.insert.ext.i18, 32 ; [#uses = 1]
  %r.sroa.4.12.insert.insert.i20 = or i64 %r.sroa.4.12.insert.shift.i19, %r.sroa.4.8.insert.ext.i15 ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.ext.i21 = zext i32 %b_arg.a_arg.i.i13 to i64 ; [#uses = 1]
  %r.sroa.0.sroa.3.0.insert.shift.i22 = shl nuw i64 %r.sroa.0.sroa.3.0.insert.ext.i21, 32 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.ext.i23 = zext i32 %44 to i64 ; [#uses = 1]
  %r.sroa.0.sroa.0.0.insert.insert.i24 = or i64 %r.sroa.0.sroa.3.0.insert.shift.i22, %r.sroa.0.sroa.0.0.insert.ext.i23 ; [#uses = 1]
  %.BaseBitcastABIRewrite_param_storage3.sroa.0.0..sroa_cast = bitcast %source.Data* %38 to i64* ; [#uses = 1]
  store i64 %r.sroa.0.sroa.0.0.insert.insert.i24, i64* %.BaseBitcastABIRewrite_param_storage3.sroa.0.0..sroa_cast, align 1
  %.BaseBitcastABIRewrite_param_storage3.sroa.2.0..sroa_cast = bitcast i32* %.structliteral.sroa.3.0..sroa_idx9 to i64* ; [#uses = 1]
  store i64 %r.sroa.4.12.insert.insert.i20, i64* %.BaseBitcastABIRewrite_param_storage3.sroa.2.0..sroa_cast, align 1
  %61 = getelementptr inbounds %source.Node, %source.Node* %39, i64 0, i32 4 ; [#uses = 1, type = i32*]
  %62 = load i32, i32* %61, align 4               ; [#uses = 1]
  %63 = load i32, i32* %6, align 4                ; [#uses = 1]
  %64 = add i32 %63, %62                          ; [#uses = 1]
  store i32 %64, i32* %6, align 4
  br label %endif2

endif2:                                           ; preds = %endif, %if1
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define void @_D6source4Node6RotateMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 5, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 8]
  %3 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 1]
  %5 = icmp eq %source.Node* %4, %.this_arg       ; [#uses = 1]
  br i1 %5, label %if, label %else

if:                                               ; preds = %0
  %6 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %7 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 2]
  store %source.Node* %2, %source.Node** %6, align 8
  store %source.Node* %7, %source.Node** %3, align 8
  br label %endif

else:                                             ; preds = %0
  %8 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %9 = load %source.Node*, %source.Node** %8, align 8 ; [#uses = 2]
  store %source.Node* %2, %source.Node** %8, align 8
  %10 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %9, %source.Node** %10, align 8
  br label %endif

endif:                                            ; preds = %else, %if
  %ch.0 = phi %source.Node* [ %7, %if ], [ %9, %else ] ; [#uses = 2, type = %source.Node*]
  %.not = icmp eq %source.Node* %ch.0, null       ; [#uses = 1]
  br i1 %.not, label %endif.endif2_crit_edge, label %if1

endif.endif2_crit_edge:                           ; preds = %endif
  %.pre18 = bitcast %source.Node** %1 to i64*     ; [#uses = 1]
  br label %endif2

if1:                                              ; preds = %endif
  %11 = getelementptr inbounds %source.Node, %source.Node* %ch.0, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %12 = bitcast %source.Node** %1 to i64*         ; [#uses = 2]
  %13 = load i64, i64* %12, align 8               ; [#uses = 1]
  %14 = bitcast %source.Node** %11 to i64*        ; [#uses = 1]
  store i64 %13, i64* %14, align 8
  br label %endif2

endif2:                                           ; preds = %endif.endif2_crit_edge, %if1
  %.pre-phi = phi i64* [ %.pre18, %endif.endif2_crit_edge ], [ %12, %if1 ] ; [#uses = 1, type = i64*]
  %15 = getelementptr inbounds %source.Node, %source.Node* %2, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %16 = bitcast %source.Node** %15 to i64*        ; [#uses = 1]
  %17 = load i64, i64* %16, align 8               ; [#uses = 1]
  store i64 %17, i64* %.pre-phi, align 8
  store %source.Node* %.this_arg, %source.Node** %15, align 8
  %18 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not17 = icmp eq %source.Node* %18, null       ; [#uses = 1]
  br i1 %.not17, label %endif4, label %if3

if3:                                              ; preds = %endif2
  %19 = getelementptr inbounds %source.Node, %source.Node* %18, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %20 = load %source.Node*, %source.Node** %19, align 8 ; [#uses = 1]
  %21 = icmp eq %source.Node* %20, %2             ; [#uses = 1]
  br i1 %21, label %if5, label %endif6

if5:                                              ; preds = %if3
  store %source.Node* %.this_arg, %source.Node** %19, align 8
  %.pre = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 1]
  br label %endif6

endif6:                                           ; preds = %if5, %if3
  %22 = phi %source.Node* [ %.pre, %if5 ], [ %18, %if3 ] ; [#uses = 1, type = %source.Node*]
  %23 = getelementptr inbounds %source.Node, %source.Node* %22, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %24 = load %source.Node*, %source.Node** %23, align 8 ; [#uses = 1]
  %25 = icmp eq %source.Node* %24, %2             ; [#uses = 1]
  br i1 %25, label %if7, label %endif4

if7:                                              ; preds = %endif6
  store %source.Node* %.this_arg, %source.Node** %23, align 8
  br label %endif4

endif4:                                           ; preds = %endif2, %endif6, %if7
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %2) #1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  ret void
}

; [#uses = 20]
; Function Attrs: uwtable
define void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  tail call void @_D6source4Node7PrepareMFZv(%source.Node* nonnull %.this_arg) #1
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 13, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not.i94 = icmp eq %source.Node* %2, null      ; [#uses = 1]
  br i1 %.not.i94, label %endfor, label %if.i.lr.ph

if.i.lr.ph:                                       ; preds = %0
  %3 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 0 ; [#uses = 8, type = %source.Node**]
  %4 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 8, type = %source.Node**]
  %5 = bitcast %source.Node** %1 to i64*          ; [#uses = 8]
  br label %if.i

if.i:                                             ; preds = %if.i.lr.ph, %forinc
  %6 = phi %source.Node* [ %2, %if.i.lr.ph ], [ %120, %forinc ] ; [#uses = 26, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 0 ; [#uses = 4, type = %source.Node**]
  %8 = load %source.Node*, %source.Node** %7, align 8 ; [#uses = 3]
  %9 = icmp eq %source.Node* %8, %.this_arg       ; [#uses = 3]
  br i1 %9, label %_D6source4Node5StateMFZi.exit16, label %endif2.i

endif2.i:                                         ; preds = %if.i
  %10 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %11 = load %source.Node*, %source.Node** %10, align 8 ; [#uses = 1]
  %12 = icmp eq %source.Node* %11, %.this_arg     ; [#uses = 1]
  br i1 %12, label %endif2.i14, label %endfor

endif2.i14:                                       ; preds = %endif2.i
  %13 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %14 = load %source.Node*, %source.Node** %13, align 8 ; [#uses = 1]
  %15 = icmp eq %source.Node* %14, %.this_arg     ; [#uses = 1]
  %spec.select = zext i1 %15 to i32               ; [#uses = 1]
  br label %_D6source4Node5StateMFZi.exit16

_D6source4Node5StateMFZi.exit16:                  ; preds = %if.i, %endif2.i14
  %merge.i12 = phi i32 [ %spec.select, %endif2.i14 ], [ -1, %if.i ] ; [#uses = 1, type = i32]
  %16 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 2 ; [#uses = 9, type = %source.Node**]
  %17 = load %source.Node*, %source.Node** %16, align 8 ; [#uses = 11]
  %.not.i17 = icmp eq %source.Node* %17, null     ; [#uses = 1]
  br i1 %.not.i17, label %endif.i22, label %if.i18

if.i18:                                           ; preds = %_D6source4Node5StateMFZi.exit16
  %18 = getelementptr inbounds %source.Node, %source.Node* %17, i64 0, i32 0 ; [#uses = 1, type = %source.Node**]
  %19 = load %source.Node*, %source.Node** %18, align 8 ; [#uses = 1]
  %20 = icmp eq %source.Node* %19, %6             ; [#uses = 1]
  br i1 %20, label %_D6source4Node5StateMFZi.exit23, label %endif2.i21

endif2.i21:                                       ; preds = %if.i18
  %21 = getelementptr inbounds %source.Node, %source.Node* %17, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  %22 = load %source.Node*, %source.Node** %21, align 8 ; [#uses = 1]
  %23 = icmp eq %source.Node* %22, %6             ; [#uses = 1]
  br i1 %23, label %_D6source4Node5StateMFZi.exit23, label %endif.i22

endif.i22:                                        ; preds = %endif2.i21, %_D6source4Node5StateMFZi.exit16
  br label %_D6source4Node5StateMFZi.exit23

_D6source4Node5StateMFZi.exit23:                  ; preds = %if.i18, %endif2.i21, %endif.i22
  %merge.i19 = phi i32 [ -1, %if.i18 ], [ 0, %endif.i22 ], [ 1, %endif2.i21 ] ; [#uses = 1, type = i32]
  %24 = mul nsw i32 %merge.i19, %merge.i12        ; [#uses = 1]
  switch i32 %24, label %else3 [
    i32 0, label %if
    i32 1, label %if1
  ]

if:                                               ; preds = %_D6source4Node5StateMFZi.exit23
  br i1 %9, label %if.i41, label %else.i42

if.i41:                                           ; preds = %if
  %25 = load %source.Node*, %source.Node** %4, align 8 ; [#uses = 2]
  store %source.Node* %6, %source.Node** %4, align 8
  store %source.Node* %25, %source.Node** %7, align 8
  br label %endif.i45

else.i42:                                         ; preds = %if
  %26 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  store %source.Node* %6, %source.Node** %3, align 8
  %27 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %26, %source.Node** %27, align 8
  br label %endif.i45

endif.i45:                                        ; preds = %else.i42, %if.i41
  %ch.0.i43 = phi %source.Node* [ %25, %if.i41 ], [ %26, %else.i42 ] ; [#uses = 2, type = %source.Node*]
  %.not.i44 = icmp eq %source.Node* %ch.0.i43, null ; [#uses = 1]
  br i1 %.not.i44, label %endif2.i51, label %if1.i48

if1.i48:                                          ; preds = %endif.i45
  %28 = getelementptr inbounds %source.Node, %source.Node* %ch.0.i43, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %29 = load i64, i64* %5, align 8                ; [#uses = 1]
  %30 = bitcast %source.Node** %28 to i64*        ; [#uses = 1]
  store i64 %29, i64* %30, align 8
  br label %endif2.i51

endif2.i51:                                       ; preds = %endif.i45, %if1.i48
  %31 = bitcast %source.Node** %16 to i64*        ; [#uses = 1]
  %32 = load i64, i64* %31, align 8               ; [#uses = 1]
  store i64 %32, i64* %5, align 8
  store %source.Node* %.this_arg, %source.Node** %16, align 8
  %33 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not17.i50 = icmp eq %source.Node* %33, null   ; [#uses = 1]
  br i1 %.not17.i50, label %forinc, label %if3.i52

if3.i52:                                          ; preds = %endif2.i51
  %34 = getelementptr inbounds %source.Node, %source.Node* %33, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %35 = load %source.Node*, %source.Node** %34, align 8 ; [#uses = 1]
  %36 = icmp eq %source.Node* %35, %6             ; [#uses = 1]
  br i1 %36, label %if5.i54, label %endif6.i55

if5.i54:                                          ; preds = %if3.i52
  store %source.Node* %.this_arg, %source.Node** %34, align 8
  %.pre.i53 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 1]
  br label %endif6.i55

endif6.i55:                                       ; preds = %if5.i54, %if3.i52
  %37 = phi %source.Node* [ %.pre.i53, %if5.i54 ], [ %33, %if3.i52 ] ; [#uses = 1, type = %source.Node*]
  %38 = getelementptr inbounds %source.Node, %source.Node* %37, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %39 = load %source.Node*, %source.Node** %38, align 8 ; [#uses = 1]
  %40 = icmp eq %source.Node* %39, %6             ; [#uses = 1]
  br i1 %40, label %if7.i56, label %forinc

if7.i56:                                          ; preds = %endif6.i55
  store %source.Node* %.this_arg, %source.Node** %38, align 8
  br label %forinc

if1:                                              ; preds = %_D6source4Node5StateMFZi.exit23
  %41 = getelementptr inbounds %source.Node, %source.Node* %17, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %42 = load %source.Node*, %source.Node** %41, align 8 ; [#uses = 1]
  %43 = icmp eq %source.Node* %42, %6             ; [#uses = 1]
  br i1 %43, label %if.i58, label %else.i59

if.i58:                                           ; preds = %if1
  %44 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %45 = load %source.Node*, %source.Node** %44, align 8 ; [#uses = 2]
  store %source.Node* %17, %source.Node** %44, align 8
  store %source.Node* %45, %source.Node** %41, align 8
  br label %endif.i62

else.i59:                                         ; preds = %if1
  store %source.Node* %17, %source.Node** %7, align 8
  %46 = getelementptr inbounds %source.Node, %source.Node* %17, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %8, %source.Node** %46, align 8
  br label %endif.i62

endif.i62:                                        ; preds = %else.i59, %if.i58
  %ch.0.i60 = phi %source.Node* [ %45, %if.i58 ], [ %8, %else.i59 ] ; [#uses = 2, type = %source.Node*]
  %.not.i61 = icmp eq %source.Node* %ch.0.i60, null ; [#uses = 1]
  br i1 %.not.i61, label %endif.endif2_crit_edge.i64, label %if1.i65

endif.endif2_crit_edge.i64:                       ; preds = %endif.i62
  %.pre18.i63 = bitcast %source.Node** %16 to i64* ; [#uses = 1]
  br label %endif2.i68

if1.i65:                                          ; preds = %endif.i62
  %47 = getelementptr inbounds %source.Node, %source.Node* %ch.0.i60, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %48 = bitcast %source.Node** %16 to i64*        ; [#uses = 2]
  %49 = load i64, i64* %48, align 8               ; [#uses = 1]
  %50 = bitcast %source.Node** %47 to i64*        ; [#uses = 1]
  store i64 %49, i64* %50, align 8
  br label %endif2.i68

endif2.i68:                                       ; preds = %if1.i65, %endif.endif2_crit_edge.i64
  %.pre-phi.i66 = phi i64* [ %.pre18.i63, %endif.endif2_crit_edge.i64 ], [ %48, %if1.i65 ] ; [#uses = 1, type = i64*]
  %51 = getelementptr inbounds %source.Node, %source.Node* %17, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %52 = bitcast %source.Node** %51 to i64*        ; [#uses = 1]
  %53 = load i64, i64* %52, align 8               ; [#uses = 1]
  store i64 %53, i64* %.pre-phi.i66, align 8
  store %source.Node* %6, %source.Node** %51, align 8
  %54 = load %source.Node*, %source.Node** %16, align 8 ; [#uses = 3]
  %.not17.i67 = icmp eq %source.Node* %54, null   ; [#uses = 1]
  br i1 %.not17.i67, label %_D6source4Node6RotateMFZv.exit74, label %if3.i69

if3.i69:                                          ; preds = %endif2.i68
  %55 = getelementptr inbounds %source.Node, %source.Node* %54, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %56 = load %source.Node*, %source.Node** %55, align 8 ; [#uses = 1]
  %57 = icmp eq %source.Node* %56, %17            ; [#uses = 1]
  br i1 %57, label %if5.i71, label %endif6.i72

if5.i71:                                          ; preds = %if3.i69
  store %source.Node* %6, %source.Node** %55, align 8
  %.pre.i70 = load %source.Node*, %source.Node** %16, align 8 ; [#uses = 1]
  br label %endif6.i72

endif6.i72:                                       ; preds = %if5.i71, %if3.i69
  %58 = phi %source.Node* [ %.pre.i70, %if5.i71 ], [ %54, %if3.i69 ] ; [#uses = 1, type = %source.Node*]
  %59 = getelementptr inbounds %source.Node, %source.Node* %58, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %60 = load %source.Node*, %source.Node** %59, align 8 ; [#uses = 1]
  %61 = icmp eq %source.Node* %60, %17            ; [#uses = 1]
  br i1 %61, label %if7.i73, label %_D6source4Node6RotateMFZv.exit74

if7.i73:                                          ; preds = %endif6.i72
  store %source.Node* %6, %source.Node** %59, align 8
  br label %_D6source4Node6RotateMFZv.exit74

_D6source4Node6RotateMFZv.exit74:                 ; preds = %endif2.i68, %endif6.i72, %if7.i73
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %17) #1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %6) #1
  %62 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 10]
  %63 = getelementptr inbounds %source.Node, %source.Node* %62, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %64 = load %source.Node*, %source.Node** %63, align 8 ; [#uses = 1]
  %65 = icmp eq %source.Node* %64, %.this_arg     ; [#uses = 1]
  br i1 %65, label %if.i75, label %else.i76

if.i75:                                           ; preds = %_D6source4Node6RotateMFZv.exit74
  %66 = load %source.Node*, %source.Node** %4, align 8 ; [#uses = 2]
  store %source.Node* %62, %source.Node** %4, align 8
  store %source.Node* %66, %source.Node** %63, align 8
  br label %endif.i79

else.i76:                                         ; preds = %_D6source4Node6RotateMFZv.exit74
  %67 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  store %source.Node* %62, %source.Node** %3, align 8
  %68 = getelementptr inbounds %source.Node, %source.Node* %62, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %67, %source.Node** %68, align 8
  br label %endif.i79

endif.i79:                                        ; preds = %else.i76, %if.i75
  %ch.0.i77 = phi %source.Node* [ %66, %if.i75 ], [ %67, %else.i76 ] ; [#uses = 2, type = %source.Node*]
  %.not.i78 = icmp eq %source.Node* %ch.0.i77, null ; [#uses = 1]
  br i1 %.not.i78, label %endif2.i85, label %if1.i82

if1.i82:                                          ; preds = %endif.i79
  %69 = getelementptr inbounds %source.Node, %source.Node* %ch.0.i77, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %70 = load i64, i64* %5, align 8                ; [#uses = 1]
  %71 = bitcast %source.Node** %69 to i64*        ; [#uses = 1]
  store i64 %70, i64* %71, align 8
  br label %endif2.i85

endif2.i85:                                       ; preds = %endif.i79, %if1.i82
  %72 = getelementptr inbounds %source.Node, %source.Node* %62, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %73 = bitcast %source.Node** %72 to i64*        ; [#uses = 1]
  %74 = load i64, i64* %73, align 8               ; [#uses = 1]
  store i64 %74, i64* %5, align 8
  store %source.Node* %.this_arg, %source.Node** %72, align 8
  %75 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not17.i84 = icmp eq %source.Node* %75, null   ; [#uses = 1]
  br i1 %.not17.i84, label %forinc, label %if3.i86

if3.i86:                                          ; preds = %endif2.i85
  %76 = getelementptr inbounds %source.Node, %source.Node* %75, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %77 = load %source.Node*, %source.Node** %76, align 8 ; [#uses = 1]
  %78 = icmp eq %source.Node* %77, %62            ; [#uses = 1]
  br i1 %78, label %if5.i88, label %endif6.i89

if5.i88:                                          ; preds = %if3.i86
  store %source.Node* %.this_arg, %source.Node** %76, align 8
  %.pre.i87 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 1]
  br label %endif6.i89

endif6.i89:                                       ; preds = %if5.i88, %if3.i86
  %79 = phi %source.Node* [ %.pre.i87, %if5.i88 ], [ %75, %if3.i86 ] ; [#uses = 1, type = %source.Node*]
  %80 = getelementptr inbounds %source.Node, %source.Node* %79, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %81 = load %source.Node*, %source.Node** %80, align 8 ; [#uses = 1]
  %82 = icmp eq %source.Node* %81, %62            ; [#uses = 1]
  br i1 %82, label %if7.i90, label %forinc

if7.i90:                                          ; preds = %endif6.i89
  store %source.Node* %.this_arg, %source.Node** %80, align 8
  br label %forinc

else3:                                            ; preds = %_D6source4Node5StateMFZi.exit23
  br i1 %9, label %if.i24, label %else.i25

if.i24:                                           ; preds = %else3
  %83 = load %source.Node*, %source.Node** %4, align 8 ; [#uses = 2]
  store %source.Node* %6, %source.Node** %4, align 8
  store %source.Node* %83, %source.Node** %7, align 8
  br label %endif.i28

else.i25:                                         ; preds = %else3
  %84 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  store %source.Node* %6, %source.Node** %3, align 8
  %85 = getelementptr inbounds %source.Node, %source.Node* %6, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %84, %source.Node** %85, align 8
  br label %endif.i28

endif.i28:                                        ; preds = %else.i25, %if.i24
  %ch.0.i26 = phi %source.Node* [ %83, %if.i24 ], [ %84, %else.i25 ] ; [#uses = 2, type = %source.Node*]
  %.not.i27 = icmp eq %source.Node* %ch.0.i26, null ; [#uses = 1]
  br i1 %.not.i27, label %endif2.i34, label %if1.i31

if1.i31:                                          ; preds = %endif.i28
  %86 = getelementptr inbounds %source.Node, %source.Node* %ch.0.i26, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %87 = load i64, i64* %5, align 8                ; [#uses = 1]
  %88 = bitcast %source.Node** %86 to i64*        ; [#uses = 1]
  store i64 %87, i64* %88, align 8
  br label %endif2.i34

endif2.i34:                                       ; preds = %endif.i28, %if1.i31
  %89 = bitcast %source.Node** %16 to i64*        ; [#uses = 1]
  %90 = load i64, i64* %89, align 8               ; [#uses = 1]
  store i64 %90, i64* %5, align 8
  store %source.Node* %.this_arg, %source.Node** %16, align 8
  %91 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not17.i33 = icmp eq %source.Node* %91, null   ; [#uses = 1]
  br i1 %.not17.i33, label %_D6source4Node6RotateMFZv.exit40, label %if3.i35

if3.i35:                                          ; preds = %endif2.i34
  %92 = getelementptr inbounds %source.Node, %source.Node* %91, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %93 = load %source.Node*, %source.Node** %92, align 8 ; [#uses = 1]
  %94 = icmp eq %source.Node* %93, %6             ; [#uses = 1]
  br i1 %94, label %if5.i37, label %endif6.i38

if5.i37:                                          ; preds = %if3.i35
  store %source.Node* %.this_arg, %source.Node** %92, align 8
  %.pre.i36 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 1]
  br label %endif6.i38

endif6.i38:                                       ; preds = %if5.i37, %if3.i35
  %95 = phi %source.Node* [ %.pre.i36, %if5.i37 ], [ %91, %if3.i35 ] ; [#uses = 1, type = %source.Node*]
  %96 = getelementptr inbounds %source.Node, %source.Node* %95, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %97 = load %source.Node*, %source.Node** %96, align 8 ; [#uses = 1]
  %98 = icmp eq %source.Node* %97, %6             ; [#uses = 1]
  br i1 %98, label %if7.i39, label %_D6source4Node6RotateMFZv.exit40

if7.i39:                                          ; preds = %endif6.i38
  store %source.Node* %.this_arg, %source.Node** %96, align 8
  br label %_D6source4Node6RotateMFZv.exit40

_D6source4Node6RotateMFZv.exit40:                 ; preds = %endif2.i34, %endif6.i38, %if7.i39
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %6) #1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  %99 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 10]
  %100 = getelementptr inbounds %source.Node, %source.Node* %99, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %101 = load %source.Node*, %source.Node** %100, align 8 ; [#uses = 1]
  %102 = icmp eq %source.Node* %101, %.this_arg   ; [#uses = 1]
  br i1 %102, label %if.i6, label %else.i

if.i6:                                            ; preds = %_D6source4Node6RotateMFZv.exit40
  %103 = load %source.Node*, %source.Node** %4, align 8 ; [#uses = 2]
  store %source.Node* %99, %source.Node** %4, align 8
  store %source.Node* %103, %source.Node** %100, align 8
  br label %endif.i8

else.i:                                           ; preds = %_D6source4Node6RotateMFZv.exit40
  %104 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  store %source.Node* %99, %source.Node** %3, align 8
  %105 = getelementptr inbounds %source.Node, %source.Node* %99, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %104, %source.Node** %105, align 8
  br label %endif.i8

endif.i8:                                         ; preds = %else.i, %if.i6
  %ch.0.i = phi %source.Node* [ %103, %if.i6 ], [ %104, %else.i ] ; [#uses = 2, type = %source.Node*]
  %.not.i7 = icmp eq %source.Node* %ch.0.i, null  ; [#uses = 1]
  br i1 %.not.i7, label %endif2.i9, label %if1.i

if1.i:                                            ; preds = %endif.i8
  %106 = getelementptr inbounds %source.Node, %source.Node* %ch.0.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %107 = load i64, i64* %5, align 8               ; [#uses = 1]
  %108 = bitcast %source.Node** %106 to i64*      ; [#uses = 1]
  store i64 %107, i64* %108, align 8
  br label %endif2.i9

endif2.i9:                                        ; preds = %endif.i8, %if1.i
  %109 = getelementptr inbounds %source.Node, %source.Node* %99, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %110 = bitcast %source.Node** %109 to i64*      ; [#uses = 1]
  %111 = load i64, i64* %110, align 8             ; [#uses = 1]
  store i64 %111, i64* %5, align 8
  store %source.Node* %.this_arg, %source.Node** %109, align 8
  %112 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 3]
  %.not17.i = icmp eq %source.Node* %112, null    ; [#uses = 1]
  br i1 %.not17.i, label %forinc, label %if3.i

if3.i:                                            ; preds = %endif2.i9
  %113 = getelementptr inbounds %source.Node, %source.Node* %112, i64 0, i32 0 ; [#uses = 2, type = %source.Node**]
  %114 = load %source.Node*, %source.Node** %113, align 8 ; [#uses = 1]
  %115 = icmp eq %source.Node* %114, %99          ; [#uses = 1]
  br i1 %115, label %if5.i, label %endif6.i

if5.i:                                            ; preds = %if3.i
  store %source.Node* %.this_arg, %source.Node** %113, align 8
  %.pre.i = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 1]
  br label %endif6.i

endif6.i:                                         ; preds = %if5.i, %if3.i
  %116 = phi %source.Node* [ %.pre.i, %if5.i ], [ %112, %if3.i ] ; [#uses = 1, type = %source.Node*]
  %117 = getelementptr inbounds %source.Node, %source.Node* %116, i64 0, i32 1 ; [#uses = 2, type = %source.Node**]
  %118 = load %source.Node*, %source.Node** %117, align 8 ; [#uses = 1]
  %119 = icmp eq %source.Node* %118, %99          ; [#uses = 1]
  br i1 %119, label %if7.i, label %forinc

if7.i:                                            ; preds = %endif6.i
  store %source.Node* %.this_arg, %source.Node** %117, align 8
  br label %forinc

forinc:                                           ; preds = %if7.i, %endif6.i, %endif2.i9, %if7.i90, %endif6.i89, %endif2.i85, %if7.i56, %endif6.i55, %endif2.i51
  %.sink = phi %source.Node* [ %6, %endif2.i51 ], [ %6, %endif6.i55 ], [ %6, %if7.i56 ], [ %62, %endif2.i85 ], [ %62, %endif6.i89 ], [ %62, %if7.i90 ], [ %99, %endif2.i9 ], [ %99, %endif6.i ], [ %99, %if7.i ] ; [#uses = 1, type = %source.Node*]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.sink) #1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  %120 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not.i = icmp eq %source.Node* %120, null      ; [#uses = 1]
  br i1 %.not.i, label %endfor, label %if.i

endfor:                                           ; preds = %forinc, %endif2.i, %0
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define void @_D6source4Node6ExposeMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  br label %forbody

forcond1.preheader:                               ; preds = %forbody
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not1213 = icmp eq %source.Node* %2, null      ; [#uses = 1]
  br i1 %.not1213, label %endfor4, label %forbody2

forbody:                                          ; preds = %0, %forbody
  %x.015 = phi %source.Node* [ %.this_arg, %0 ], [ %4, %forbody ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015) #1
  %3 = getelementptr inbounds %source.Node, %source.Node* %x.015, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not = icmp eq %source.Node* %4, null          ; [#uses = 1]
  br i1 %.not, label %forcond1.preheader, label %forbody

forbody2:                                         ; preds = %forcond1.preheader, %forbody2
  %5 = phi %source.Node* [ %10, %forbody2 ], [ %2, %forcond1.preheader ] ; [#uses = 1, type = %source.Node*]
  %6 = phi %source.Node** [ %9, %forbody2 ], [ %1, %forcond1.preheader ] ; [#uses = 1, type = %source.Node**]
  %x.114 = phi %source.Node* [ %8, %forbody2 ], [ %.this_arg, %forcond1.preheader ] ; [#uses = 1, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %5, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114, %source.Node** %7, align 8
  %8 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %8) #1
  %9 = getelementptr inbounds %source.Node, %source.Node* %8, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %10 = load %source.Node*, %source.Node** %9, align 8 ; [#uses = 2]
  %.not12 = icmp eq %source.Node* %10, null       ; [#uses = 1]
  br i1 %.not12, label %endfor4, label %forbody2

endfor4:                                          ; preds = %forbody2, %forcond1.preheader
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) #1
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define void @_D6source4Node5EvertMFZv(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  br label %forbody.i

forcond1.preheader.i:                             ; preds = %forbody.i
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not1213.i = icmp eq %source.Node* %2, null    ; [#uses = 1]
  br i1 %.not1213.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

forbody.i:                                        ; preds = %forbody.i, %0
  %x.015.i = phi %source.Node* [ %.this_arg, %0 ], [ %4, %forbody.i ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i) #1
  %3 = getelementptr inbounds %source.Node, %source.Node* %x.015.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not.i = icmp eq %source.Node* %4, null        ; [#uses = 1]
  br i1 %.not.i, label %forcond1.preheader.i, label %forbody.i

forbody2.i:                                       ; preds = %forcond1.preheader.i, %forbody2.i
  %5 = phi %source.Node* [ %10, %forbody2.i ], [ %2, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %6 = phi %source.Node** [ %9, %forbody2.i ], [ %1, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i = phi %source.Node* [ %8, %forbody2.i ], [ %.this_arg, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %5, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i, %source.Node** %7, align 8
  %8 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %8) #1
  %9 = getelementptr inbounds %source.Node, %source.Node* %8, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %10 = load %source.Node*, %source.Node** %9, align 8 ; [#uses = 2]
  %.not12.i = icmp eq %source.Node* %10, null     ; [#uses = 1]
  br i1 %.not12.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

_D6source4Node6ExposeMFZv.exit:                   ; preds = %forbody2.i, %forcond1.preheader.i
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) #1
  %11 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %11, align 8
  %12 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 7 ; [#uses = 2, type = i8*]
  %13 = load i8, i8* %12, align 1, !range !3      ; [#uses = 1]
  %14 = xor i8 %13, 1                             ; [#uses = 1]
  store i8 %14, i8* %12, align 1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  ret void
}

; [#uses = 1]
; Function Attrs: uwtable
define void @_D6source4Node4LinkMFPSQvQqZv(%source.Node* nonnull %.this_arg, %source.Node* %t_arg) local_unnamed_addr #1 {
  br label %forbody.i.i

forcond1.preheader.i.i:                           ; preds = %forbody.i.i
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 3, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not1213.i.i = icmp eq %source.Node* %2, null  ; [#uses = 1]
  br i1 %.not1213.i.i, label %_D6source4Node5EvertMFZv.exit, label %forbody2.i.i

forbody.i.i:                                      ; preds = %forbody.i.i, %0
  %x.015.i.i = phi %source.Node* [ %.this_arg, %0 ], [ %4, %forbody.i.i ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i.i) #1
  %3 = getelementptr inbounds %source.Node, %source.Node* %x.015.i.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not.i.i = icmp eq %source.Node* %4, null      ; [#uses = 1]
  br i1 %.not.i.i, label %forcond1.preheader.i.i, label %forbody.i.i

forbody2.i.i:                                     ; preds = %forcond1.preheader.i.i, %forbody2.i.i
  %5 = phi %source.Node* [ %10, %forbody2.i.i ], [ %2, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node*]
  %6 = phi %source.Node** [ %9, %forbody2.i.i ], [ %1, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i.i = phi %source.Node* [ %8, %forbody2.i.i ], [ %.this_arg, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %5, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i.i, %source.Node** %7, align 8
  %8 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %8) #1
  %9 = getelementptr inbounds %source.Node, %source.Node* %8, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %10 = load %source.Node*, %source.Node** %9, align 8 ; [#uses = 2]
  %.not12.i.i = icmp eq %source.Node* %10, null   ; [#uses = 1]
  br i1 %.not12.i.i, label %_D6source4Node5EvertMFZv.exit, label %forbody2.i.i

_D6source4Node5EvertMFZv.exit:                    ; preds = %forbody2.i.i, %forcond1.preheader.i.i
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) #1
  %11 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %11, align 8
  %12 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 7 ; [#uses = 2, type = i8*]
  %13 = load i8, i8* %12, align 1, !range !3      ; [#uses = 1]
  %14 = xor i8 %13, 1                             ; [#uses = 1]
  store i8 %14, i8* %12, align 1
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  br label %forbody.i

forcond1.preheader.i:                             ; preds = %forbody.i
  %15 = getelementptr inbounds %source.Node, %source.Node* %t_arg, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %16 = load %source.Node*, %source.Node** %15, align 8 ; [#uses = 2]
  %.not1213.i = icmp eq %source.Node* %16, null   ; [#uses = 1]
  br i1 %.not1213.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

forbody.i:                                        ; preds = %forbody.i, %_D6source4Node5EvertMFZv.exit
  %x.015.i = phi %source.Node* [ %t_arg, %_D6source4Node5EvertMFZv.exit ], [ %18, %forbody.i ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i) #1
  %17 = getelementptr inbounds %source.Node, %source.Node* %x.015.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %18 = load %source.Node*, %source.Node** %17, align 8 ; [#uses = 2]
  %.not.i = icmp eq %source.Node* %18, null       ; [#uses = 1]
  br i1 %.not.i, label %forcond1.preheader.i, label %forbody.i

forbody2.i:                                       ; preds = %forcond1.preheader.i, %forbody2.i
  %19 = phi %source.Node* [ %24, %forbody2.i ], [ %16, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %20 = phi %source.Node** [ %23, %forbody2.i ], [ %15, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i = phi %source.Node* [ %22, %forbody2.i ], [ %t_arg, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %21 = getelementptr inbounds %source.Node, %source.Node* %19, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i, %source.Node** %21, align 8
  %22 = load %source.Node*, %source.Node** %20, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %22) #1
  %23 = getelementptr inbounds %source.Node, %source.Node* %22, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %24 = load %source.Node*, %source.Node** %23, align 8 ; [#uses = 2]
  %.not12.i = icmp eq %source.Node* %24, null     ; [#uses = 1]
  br i1 %.not12.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

_D6source4Node6ExposeMFZv.exit:                   ; preds = %forbody2.i, %forcond1.preheader.i
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %t_arg) #1
  store %source.Node* %t_arg, %source.Node** %1, align 8
  %25 = getelementptr inbounds %source.Node, %source.Node* %t_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %.this_arg, %source.Node** %25, align 8
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %t_arg) #1
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define void @_D6source4Node3SetMFiZv(%source.Node* nonnull %.this_arg, i32 %x_arg) local_unnamed_addr #1 {
  br label %forbody.i

forcond1.preheader.i:                             ; preds = %forbody.i
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not1213.i = icmp eq %source.Node* %2, null    ; [#uses = 1]
  br i1 %.not1213.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

forbody.i:                                        ; preds = %forbody.i, %0
  %x.015.i = phi %source.Node* [ %.this_arg, %0 ], [ %4, %forbody.i ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i) #1
  %3 = getelementptr inbounds %source.Node, %source.Node* %x.015.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not.i = icmp eq %source.Node* %4, null        ; [#uses = 1]
  br i1 %.not.i, label %forcond1.preheader.i, label %forbody.i

forbody2.i:                                       ; preds = %forcond1.preheader.i, %forbody2.i
  %5 = phi %source.Node* [ %10, %forbody2.i ], [ %2, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %6 = phi %source.Node** [ %9, %forbody2.i ], [ %1, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i = phi %source.Node* [ %8, %forbody2.i ], [ %.this_arg, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %5, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i, %source.Node** %7, align 8
  %8 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %8) #1
  %9 = getelementptr inbounds %source.Node, %source.Node* %8, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %10 = load %source.Node*, %source.Node** %9, align 8 ; [#uses = 2]
  %.not12.i = icmp eq %source.Node* %10, null     ; [#uses = 1]
  br i1 %.not12.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

_D6source4Node6ExposeMFZv.exit:                   ; preds = %forbody2.i, %forcond1.preheader.i
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) #1
  %11 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %11, align 8
  %12 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 3 ; [#uses = 1, type = i32*]
  store i32 %x_arg, i32* %12, align 4
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  ret void
}

; [#uses = 0]
; Function Attrs: uwtable
define i32 @_D6source4Node3GetMFZi(%source.Node* nonnull %.this_arg) local_unnamed_addr #1 {
  br label %forbody.i

forcond1.preheader.i:                             ; preds = %forbody.i
  %1 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %2 = load %source.Node*, %source.Node** %1, align 8 ; [#uses = 2]
  %.not1213.i = icmp eq %source.Node* %2, null    ; [#uses = 1]
  br i1 %.not1213.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

forbody.i:                                        ; preds = %forbody.i, %0
  %x.015.i = phi %source.Node* [ %.this_arg, %0 ], [ %4, %forbody.i ] ; [#uses = 2, type = %source.Node*]
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i) #1
  %3 = getelementptr inbounds %source.Node, %source.Node* %x.015.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %4 = load %source.Node*, %source.Node** %3, align 8 ; [#uses = 2]
  %.not.i = icmp eq %source.Node* %4, null        ; [#uses = 1]
  br i1 %.not.i, label %forcond1.preheader.i, label %forbody.i

forbody2.i:                                       ; preds = %forcond1.preheader.i, %forbody2.i
  %5 = phi %source.Node* [ %10, %forbody2.i ], [ %2, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %6 = phi %source.Node** [ %9, %forbody2.i ], [ %1, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i = phi %source.Node* [ %8, %forbody2.i ], [ %.this_arg, %forcond1.preheader.i ] ; [#uses = 1, type = %source.Node*]
  %7 = getelementptr inbounds %source.Node, %source.Node* %5, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i, %source.Node** %7, align 8
  %8 = load %source.Node*, %source.Node** %6, align 8 ; [#uses = 3]
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %8) #1
  %9 = getelementptr inbounds %source.Node, %source.Node* %8, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %10 = load %source.Node*, %source.Node** %9, align 8 ; [#uses = 2]
  %.not12.i = icmp eq %source.Node* %10, null     ; [#uses = 1]
  br i1 %.not12.i, label %_D6source4Node6ExposeMFZv.exit, label %forbody2.i

_D6source4Node6ExposeMFZv.exit:                   ; preds = %forbody2.i, %forcond1.preheader.i
  tail call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %.this_arg) #1
  %11 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %11, align 8
  tail call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %.this_arg) #1
  %12 = getelementptr inbounds %source.Node, %source.Node* %.this_arg, i64 0, i32 6, i32 3 ; [#uses = 1, type = i32*]
  %13 = load i32, i32* %12, align 4               ; [#uses = 1]
  ret i32 %13
}

; [#uses = 1]
; Function Attrs: uwtable
define i32 @_Dmain({ i64, { i64, i8* }* } %unnamed) #2 {
  %n = alloca i32, align 4                        ; [#uses = 4, size/byte = 4]
  %q = alloca i32, align 4                        ; [#uses = 3, size/byte = 4]
  %w = alloca i32, align 4                        ; [#uses = 4, size/byte = 4]
  %s = alloca i32, align 4                        ; [#uses = 4, size/byte = 4]
  %e = alloca i32, align 4                        ; [#uses = 4, size/byte = 4]
  %t = alloca i32, align 4                        ; [#uses = 3, size/byte = 4]
  %a = alloca i32, align 4                        ; [#uses = 4, size/byte = 4]
  %b = alloca i32, align 4                        ; [#uses = 6, size/byte = 4]
  %c = alloca i32, align 4                        ; [#uses = 3, size/byte = 4]
  store i32 0, i32* %n, align 4
  store i32 0, i32* %q, align 4
  %1 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i32* nonnull %n, i32* nonnull %q) #6 ; [#uses = 0]
  %2 = load i32, i32* %n, align 4                 ; [#uses = 7]
  %3 = sext i32 %2 to i64                         ; [#uses = 9]
  %.gc_mem = call { i64, i8* } @_d_newarrayiT(%object.TypeInfo* bitcast (%object.TypeInfo_Array* @_D23TypeInfo_AS6source4Node6__initZ to %object.TypeInfo*), i64 %3) #4 ; [#uses = 1]
  %.ptr = extractvalue { i64, i8* } %.gc_mem, 1   ; [#uses = 1]
  %4 = bitcast i8* %.ptr to %source.Node*         ; [#uses = 20]
  %.not = icmp eq i32 %2, 0                       ; [#uses = 1]
  br i1 %.not, label %endfor, label %forbody.preheader

forbody.preheader:                                ; preds = %0
  %5 = icmp ugt i64 %3, 1                         ; [#uses = 1]
  %umax = select i1 %5, i64 %3, i64 1             ; [#uses = 1]
  br label %forbody

forbody:                                          ; preds = %forbody, %forbody.preheader
  %__key108.098 = phi i64 [ %13, %forbody ], [ 0, %forbody.preheader ] ; [#uses = 3, type = i64]
  store i32 0, i32* %w, align 4
  %6 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32* nonnull %w) #6 ; [#uses = 0]
  %7 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %__key108.098, i32 5 ; [#uses = 1, type = i32*]
  %8 = load i32, i32* %w, align 4                 ; [#uses = 1]
  store i32 %8, i32* %7, align 4
  %9 = load i32, i32* %w, align 4                 ; [#uses = 1]
  %.structliteral.sroa.0.0..sroa_idx = getelementptr inbounds %source.Node, %source.Node* %4, i64 %__key108.098, i32 6, i32 0 ; [#uses = 1, type = i32*]
  %10 = insertelement <4 x i32> undef, i32 %9, i32 0 ; [#uses = 1]
  %11 = shufflevector <4 x i32> %10, <4 x i32> undef, <4 x i32> zeroinitializer ; [#uses = 1]
  %12 = bitcast i32* %.structliteral.sroa.0.0..sroa_idx to <4 x i32>* ; [#uses = 1]
  store <4 x i32> %11, <4 x i32>* %12, align 1
  %13 = add nuw i64 %__key108.098, 1              ; [#uses = 2]
  %exitcond111.not = icmp eq i64 %13, %umax       ; [#uses = 1]
  br i1 %exitcond111.not, label %endfor, label %forbody

endfor:                                           ; preds = %forbody, %0
  %14 = load i32, i32* %n, align 4                ; [#uses = 1]
  %15 = add i32 %14, -1                           ; [#uses = 2]
  %16 = icmp sgt i32 %15, 0                       ; [#uses = 1]
  br i1 %16, label %forbody5, label %endfor7

forbody5:                                         ; preds = %endfor, %bounds.ok12
  %__key109.097 = phi i32 [ %26, %bounds.ok12 ], [ 0, %endfor ] ; [#uses = 1, type = i32]
  store i32 0, i32* %s, align 4
  store i32 0, i32* %e, align 4
  %17 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i32* nonnull %s, i32* nonnull %e) #6 ; [#uses = 0]
  %18 = load i32, i32* %s, align 4                ; [#uses = 1]
  %19 = add i32 %18, -1                           ; [#uses = 3]
  store i32 %19, i32* %s, align 4
  %20 = sext i32 %19 to i64                       ; [#uses = 2]
  %bounds.cmp = icmp ult i32 %19, %2              ; [#uses = 1]
  br i1 %bounds.cmp, label %bounds.ok, label %bounds.fail

bounds.ok:                                        ; preds = %forbody5
  %21 = load i32, i32* %e, align 4                ; [#uses = 1]
  %22 = add i32 %21, -1                           ; [#uses = 3]
  store i32 %22, i32* %e, align 4
  %23 = sext i32 %22 to i64                       ; [#uses = 2]
  %bounds.cmp11 = icmp ult i32 %22, %2            ; [#uses = 1]
  br i1 %bounds.cmp11, label %bounds.ok12, label %bounds.fail13

bounds.ok12:                                      ; preds = %bounds.ok
  %24 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %20 ; [#uses = 1, type = %source.Node*]
  %25 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %23 ; [#uses = 1, type = %source.Node*]
  call void @_D6source4Node4LinkMFPSQvQqZv(%source.Node* nonnull %24, %source.Node* %25) #1
  %26 = add nuw nsw i32 %__key109.097, 1          ; [#uses = 2]
  %exitcond110.not = icmp eq i32 %26, %15         ; [#uses = 1]
  br i1 %exitcond110.not, label %endfor7, label %forbody5

bounds.fail13:                                    ; preds = %bounds.ok
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 157, i64 %23, i64 %3) #5
  unreachable

bounds.fail:                                      ; preds = %forbody5
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 157, i64 %20, i64 %3) #5
  unreachable

endfor7:                                          ; preds = %bounds.ok12, %endfor
  %27 = load i32, i32* %q, align 4                ; [#uses = 2]
  %28 = icmp sgt i32 %27, 0                       ; [#uses = 1]
  br i1 %28, label %forbody16, label %endfor18

forbody16:                                        ; preds = %endfor7, %forinc17
  %__key111.096 = phi i32 [ %100, %forinc17 ], [ 0, %endfor7 ] ; [#uses = 1, type = i32]
  store i32 0, i32* %t, align 4
  store i32 0, i32* %a, align 4
  store i32 0, i32* %b, align 4
  store i32 0, i32* %c, align 4
  %29 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i32* nonnull %t, i32* nonnull %a, i32* nonnull %b, i32* nonnull %c) #6 ; [#uses = 0]
  %30 = load i32, i32* %t, align 4                ; [#uses = 1]
  %31 = icmp eq i32 %30, 1                        ; [#uses = 1]
  %32 = load i32, i32* %a, align 4                ; [#uses = 1]
  %33 = add i32 %32, -1                           ; [#uses = 3]
  store i32 %33, i32* %a, align 4
  %34 = sext i32 %33 to i64                       ; [#uses = 10]
  %bounds.cmp20 = icmp ult i32 %33, %2            ; [#uses = 2]
  br i1 %31, label %if, label %else

if:                                               ; preds = %forbody16
  br i1 %bounds.cmp20, label %bounds.ok21, label %bounds.fail22

bounds.ok21:                                      ; preds = %if
  %35 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34 ; [#uses = 4, type = %source.Node*]
  br label %forbody.i.i

forcond1.preheader.i.i:                           ; preds = %forbody.i.i
  %36 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 2 ; [#uses = 2, type = %source.Node**]
  %37 = load %source.Node*, %source.Node** %36, align 8 ; [#uses = 2]
  %.not1213.i.i = icmp eq %source.Node* %37, null ; [#uses = 1]
  br i1 %.not1213.i.i, label %_D6source4Node5EvertMFZv.exit, label %forbody2.i.i

forbody.i.i:                                      ; preds = %forbody.i.i, %bounds.ok21
  %x.015.i.i = phi %source.Node* [ %35, %bounds.ok21 ], [ %39, %forbody.i.i ] ; [#uses = 2, type = %source.Node*]
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i.i) #1
  %38 = getelementptr inbounds %source.Node, %source.Node* %x.015.i.i, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %39 = load %source.Node*, %source.Node** %38, align 8 ; [#uses = 2]
  %.not.i.i = icmp eq %source.Node* %39, null     ; [#uses = 1]
  br i1 %.not.i.i, label %forcond1.preheader.i.i, label %forbody.i.i

forbody2.i.i:                                     ; preds = %forcond1.preheader.i.i, %forbody2.i.i
  %40 = phi %source.Node* [ %45, %forbody2.i.i ], [ %37, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node*]
  %41 = phi %source.Node** [ %44, %forbody2.i.i ], [ %36, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node**]
  %x.114.i.i = phi %source.Node* [ %43, %forbody2.i.i ], [ %35, %forcond1.preheader.i.i ] ; [#uses = 1, type = %source.Node*]
  %42 = getelementptr inbounds %source.Node, %source.Node* %40, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i.i, %source.Node** %42, align 8
  %43 = load %source.Node*, %source.Node** %41, align 8 ; [#uses = 3]
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %43) #1
  %44 = getelementptr inbounds %source.Node, %source.Node* %43, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %45 = load %source.Node*, %source.Node** %44, align 8 ; [#uses = 2]
  %.not12.i.i = icmp eq %source.Node* %45, null   ; [#uses = 1]
  br i1 %.not12.i.i, label %_D6source4Node5EvertMFZv.exit, label %forbody2.i.i

_D6source4Node5EvertMFZv.exit:                    ; preds = %forbody2.i.i, %forcond1.preheader.i.i
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %35) #1
  %46 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %46, align 8
  %47 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 7 ; [#uses = 2, type = i8*]
  %48 = load i8, i8* %47, align 1, !range !3      ; [#uses = 1]
  %49 = xor i8 %48, 1                             ; [#uses = 1]
  store i8 %49, i8* %47, align 1
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %35) #1
  %50 = load i32, i32* %b, align 4                ; [#uses = 1]
  %51 = add i32 %50, -1                           ; [#uses = 3]
  store i32 %51, i32* %b, align 4
  %52 = sext i32 %51 to i64                       ; [#uses = 5]
  %bounds.cmp25 = icmp ult i32 %51, %2            ; [#uses = 1]
  br i1 %bounds.cmp25, label %bounds.ok26, label %bounds.fail27

bounds.ok26:                                      ; preds = %_D6source4Node5EvertMFZv.exit
  %53 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %52 ; [#uses = 4, type = %source.Node*]
  %54 = load i32, i32* %c, align 4                ; [#uses = 1]
  br label %forbody.i.i67

forcond1.preheader.i.i64:                         ; preds = %forbody.i.i67
  %55 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %52, i32 2 ; [#uses = 2, type = %source.Node**]
  %56 = load %source.Node*, %source.Node** %55, align 8 ; [#uses = 2]
  %.not1213.i.i63 = icmp eq %source.Node* %56, null ; [#uses = 1]
  br i1 %.not1213.i.i63, label %_D6source4Node3SetMFiZv.exit, label %forbody2.i.i70

forbody.i.i67:                                    ; preds = %forbody.i.i67, %bounds.ok26
  %x.015.i.i65 = phi %source.Node* [ %53, %bounds.ok26 ], [ %58, %forbody.i.i67 ] ; [#uses = 2, type = %source.Node*]
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i.i65) #1
  %57 = getelementptr inbounds %source.Node, %source.Node* %x.015.i.i65, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %58 = load %source.Node*, %source.Node** %57, align 8 ; [#uses = 2]
  %.not.i.i66 = icmp eq %source.Node* %58, null   ; [#uses = 1]
  br i1 %.not.i.i66, label %forcond1.preheader.i.i64, label %forbody.i.i67

forbody2.i.i70:                                   ; preds = %forcond1.preheader.i.i64, %forbody2.i.i70
  %59 = phi %source.Node* [ %64, %forbody2.i.i70 ], [ %56, %forcond1.preheader.i.i64 ] ; [#uses = 1, type = %source.Node*]
  %60 = phi %source.Node** [ %63, %forbody2.i.i70 ], [ %55, %forcond1.preheader.i.i64 ] ; [#uses = 1, type = %source.Node**]
  %x.114.i.i68 = phi %source.Node* [ %62, %forbody2.i.i70 ], [ %53, %forcond1.preheader.i.i64 ] ; [#uses = 1, type = %source.Node*]
  %61 = getelementptr inbounds %source.Node, %source.Node* %59, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i.i68, %source.Node** %61, align 8
  %62 = load %source.Node*, %source.Node** %60, align 8 ; [#uses = 3]
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %62) #1
  %63 = getelementptr inbounds %source.Node, %source.Node* %62, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %64 = load %source.Node*, %source.Node** %63, align 8 ; [#uses = 2]
  %.not12.i.i69 = icmp eq %source.Node* %64, null ; [#uses = 1]
  br i1 %.not12.i.i69, label %_D6source4Node3SetMFiZv.exit, label %forbody2.i.i70

_D6source4Node3SetMFiZv.exit:                     ; preds = %forbody2.i.i70, %forcond1.preheader.i.i64
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %53) #1
  %65 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %52, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %65, align 8
  %66 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %52, i32 3 ; [#uses = 1, type = i32*]
  store i32 %54, i32* %66, align 4
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %53) #1
  br label %forinc17

bounds.fail27:                                    ; preds = %_D6source4Node5EvertMFZv.exit
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 164, i64 %52, i64 %3) #5
  unreachable

bounds.fail22:                                    ; preds = %if
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 163, i64 %34, i64 %3) #5
  unreachable

else:                                             ; preds = %forbody16
  br i1 %bounds.cmp20, label %bounds.ok31, label %bounds.fail32

bounds.ok31:                                      ; preds = %else
  %67 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34 ; [#uses = 4, type = %source.Node*]
  br label %forbody.i.i75

forcond1.preheader.i.i72:                         ; preds = %forbody.i.i75
  %68 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 2 ; [#uses = 2, type = %source.Node**]
  %69 = load %source.Node*, %source.Node** %68, align 8 ; [#uses = 2]
  %.not1213.i.i71 = icmp eq %source.Node* %69, null ; [#uses = 1]
  br i1 %.not1213.i.i71, label %_D6source4Node5EvertMFZv.exit79, label %forbody2.i.i78

forbody.i.i75:                                    ; preds = %forbody.i.i75, %bounds.ok31
  %x.015.i.i73 = phi %source.Node* [ %67, %bounds.ok31 ], [ %71, %forbody.i.i75 ] ; [#uses = 2, type = %source.Node*]
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i.i73) #1
  %70 = getelementptr inbounds %source.Node, %source.Node* %x.015.i.i73, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %71 = load %source.Node*, %source.Node** %70, align 8 ; [#uses = 2]
  %.not.i.i74 = icmp eq %source.Node* %71, null   ; [#uses = 1]
  br i1 %.not.i.i74, label %forcond1.preheader.i.i72, label %forbody.i.i75

forbody2.i.i78:                                   ; preds = %forcond1.preheader.i.i72, %forbody2.i.i78
  %72 = phi %source.Node* [ %77, %forbody2.i.i78 ], [ %69, %forcond1.preheader.i.i72 ] ; [#uses = 1, type = %source.Node*]
  %73 = phi %source.Node** [ %76, %forbody2.i.i78 ], [ %68, %forcond1.preheader.i.i72 ] ; [#uses = 1, type = %source.Node**]
  %x.114.i.i76 = phi %source.Node* [ %75, %forbody2.i.i78 ], [ %67, %forcond1.preheader.i.i72 ] ; [#uses = 1, type = %source.Node*]
  %74 = getelementptr inbounds %source.Node, %source.Node* %72, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i.i76, %source.Node** %74, align 8
  %75 = load %source.Node*, %source.Node** %73, align 8 ; [#uses = 3]
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %75) #1
  %76 = getelementptr inbounds %source.Node, %source.Node* %75, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %77 = load %source.Node*, %source.Node** %76, align 8 ; [#uses = 2]
  %.not12.i.i77 = icmp eq %source.Node* %77, null ; [#uses = 1]
  br i1 %.not12.i.i77, label %_D6source4Node5EvertMFZv.exit79, label %forbody2.i.i78

_D6source4Node5EvertMFZv.exit79:                  ; preds = %forbody2.i.i78, %forcond1.preheader.i.i72
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %67) #1
  %78 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %78, align 8
  %79 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %34, i32 7 ; [#uses = 2, type = i8*]
  %80 = load i8, i8* %79, align 1, !range !3      ; [#uses = 1]
  %81 = xor i8 %80, 1                             ; [#uses = 1]
  store i8 %81, i8* %79, align 1
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %67) #1
  %82 = load i32, i32* %b, align 4                ; [#uses = 1]
  %83 = add i32 %82, -1                           ; [#uses = 3]
  store i32 %83, i32* %b, align 4
  %84 = sext i32 %83 to i64                       ; [#uses = 5]
  %bounds.cmp35 = icmp ult i32 %83, %2            ; [#uses = 1]
  br i1 %bounds.cmp35, label %bounds.ok36, label %bounds.fail37

bounds.ok36:                                      ; preds = %_D6source4Node5EvertMFZv.exit79
  %85 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %84 ; [#uses = 4, type = %source.Node*]
  br label %forbody.i.i84

forcond1.preheader.i.i81:                         ; preds = %forbody.i.i84
  %86 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %84, i32 2 ; [#uses = 2, type = %source.Node**]
  %87 = load %source.Node*, %source.Node** %86, align 8 ; [#uses = 2]
  %.not1213.i.i80 = icmp eq %source.Node* %87, null ; [#uses = 1]
  br i1 %.not1213.i.i80, label %_D6source4Node3GetMFZi.exit, label %forbody2.i.i87

forbody.i.i84:                                    ; preds = %forbody.i.i84, %bounds.ok36
  %x.015.i.i82 = phi %source.Node* [ %85, %bounds.ok36 ], [ %89, %forbody.i.i84 ] ; [#uses = 2, type = %source.Node*]
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %x.015.i.i82) #1
  %88 = getelementptr inbounds %source.Node, %source.Node* %x.015.i.i82, i64 0, i32 2 ; [#uses = 1, type = %source.Node**]
  %89 = load %source.Node*, %source.Node** %88, align 8 ; [#uses = 2]
  %.not.i.i83 = icmp eq %source.Node* %89, null   ; [#uses = 1]
  br i1 %.not.i.i83, label %forcond1.preheader.i.i81, label %forbody.i.i84

forbody2.i.i87:                                   ; preds = %forcond1.preheader.i.i81, %forbody2.i.i87
  %90 = phi %source.Node* [ %95, %forbody2.i.i87 ], [ %87, %forcond1.preheader.i.i81 ] ; [#uses = 1, type = %source.Node*]
  %91 = phi %source.Node** [ %94, %forbody2.i.i87 ], [ %86, %forcond1.preheader.i.i81 ] ; [#uses = 1, type = %source.Node**]
  %x.114.i.i85 = phi %source.Node* [ %93, %forbody2.i.i87 ], [ %85, %forcond1.preheader.i.i81 ] ; [#uses = 1, type = %source.Node*]
  %92 = getelementptr inbounds %source.Node, %source.Node* %90, i64 0, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* %x.114.i.i85, %source.Node** %92, align 8
  %93 = load %source.Node*, %source.Node** %91, align 8 ; [#uses = 3]
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %93) #1
  %94 = getelementptr inbounds %source.Node, %source.Node* %93, i64 0, i32 2 ; [#uses = 2, type = %source.Node**]
  %95 = load %source.Node*, %source.Node** %94, align 8 ; [#uses = 2]
  %.not12.i.i86 = icmp eq %source.Node* %95, null ; [#uses = 1]
  br i1 %.not12.i.i86, label %_D6source4Node3GetMFZi.exit, label %forbody2.i.i87

_D6source4Node3GetMFZi.exit:                      ; preds = %forbody2.i.i87, %forcond1.preheader.i.i81
  call void @_D6source4Node5SplayMFZv(%source.Node* nonnull %85) #1
  %96 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %84, i32 1 ; [#uses = 1, type = %source.Node**]
  store %source.Node* null, %source.Node** %96, align 8
  call void @_D6source4Node6UpdateMFZv(%source.Node* nonnull %85) #1
  %97 = getelementptr inbounds %source.Node, %source.Node* %4, i64 %84, i32 6, i32 3 ; [#uses = 1, type = i32*]
  %98 = load i32, i32* %97, align 4               ; [#uses = 1]
  %99 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0), i32 %98) #6 ; [#uses = 0]
  br label %forinc17

bounds.fail37:                                    ; preds = %_D6source4Node5EvertMFZv.exit79
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 167, i64 %84, i64 %3) #5
  unreachable

bounds.fail32:                                    ; preds = %else
  call void @_d_arraybounds_index({ i64, i8* } { i64 61, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.3, i32 0, i32 0) }, i32 166, i64 %34, i64 %3) #5
  unreachable

forinc17:                                         ; preds = %_D6source4Node3SetMFiZv.exit, %_D6source4Node3GetMFZi.exit
  %100 = add nuw nsw i32 %__key111.096, 1         ; [#uses = 2]
  %exitcond.not = icmp eq i32 %100, %27           ; [#uses = 1]
  br i1 %exitcond.not, label %endfor18, label %forbody16

endfor18:                                         ; preds = %forinc17, %endfor7
  ret i32 0
}

; [#uses = 4]
; Function Attrs: nofree nounwind
declare i32 @scanf(i8* nocapture readonly, ...) local_unnamed_addr #3

; [#uses = 1]
; Function Attrs: uwtable
declare { i64, i8* } @_d_newarrayiT(%object.TypeInfo*, i64) local_unnamed_addr #4

; [#uses = 6]
; Function Attrs: cold noreturn uwtable
declare void @_d_arraybounds_index({ i64, i8* }, i32, i64, i64) local_unnamed_addr #5

; [#uses = 1]
; Function Attrs: nofree nounwind
declare i32 @printf(i8* nocapture readonly, ...) local_unnamed_addr #3

; [#uses = 1]
declare i32 @_d_run_main(i32, i8**, i8*) local_unnamed_addr #6

; [#uses = 0]
; Function Attrs: uwtable
define i32 @main(i32 %argc_arg, i8** %argv_arg) local_unnamed_addr #1 {
  %1 = tail call i32 @_d_run_main(i32 %argc_arg, i8** %argv_arg, i8* bitcast (i32 ({ i64, { i64, i8* }* })* @_Dmain to i8*)) #6 ; [#uses = 1]
  ret i32 %1
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr zeroext i1 @_D3std10functional__T6safeOpVAyaa1_3cZ__TQuTxiTxiZQBdFNaNbNiNfKxiKxiZb(i32* dereferenceable(4) %b, i32* dereferenceable(4) %a) local_unnamed_addr #1 {
  %1 = load i32, i32* %a, align 4                 ; [#uses = 1]
  %2 = load i32, i32* %b, align 4                 ; [#uses = 1]
  %3 = icmp slt i32 %1, %2                        ; [#uses = 1]
  ret i1 %3
}

; [#uses = 0]
; Function Attrs: uwtable
define weak_odr zeroext i1 @_D3std9exception__T11doesPointToTPS6source4NodeTQpTvZQBiFNaNbNiNeKxPSQBiQBeKxQkZb(%source.Node** dereferenceable(8) %target, %source.Node** dereferenceable(8) %source) local_unnamed_addr #1 {
andandend:
  %0 = bitcast %source.Node** %source to i8**     ; [#uses = 1]
  %1 = load i8*, i8** %0, align 8                 ; [#uses = 2]
  %2 = bitcast %source.Node** %target to i8*      ; [#uses = 1]
  %3 = getelementptr inbounds %source.Node*, %source.Node** %target, i64 1 ; [#uses = 1, type = %source.Node**]
  %4 = bitcast %source.Node** %3 to i8*           ; [#uses = 1]
  %.not = icmp uge i8* %1, %2                     ; [#uses = 1]
  %5 = icmp ult i8* %1, %4                        ; [#uses = 1]
  %andandval = and i1 %.not, %5                   ; [#uses = 1]
  ret i1 %andandval
}

; [#uses = 8]
; Function Attrs: cold noreturn uwtable
declare void @_d_assert_msg({ i64, i8* }, { i64, i8* }, i32) local_unnamed_addr #5

; [#uses = 2]
define linkonce_odr hidden void @ldc.register_dso() {
  %1 = alloca { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }, align 8 ; [#uses = 5, size/byte = 32]
  %2 = getelementptr inbounds { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }, { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }* %1, i64 0, i32 0 ; [#uses = 1, type = i64*]
  store i64 1, i64* %2, align 8
  %3 = getelementptr inbounds { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }, { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }* %1, i64 0, i32 1 ; [#uses = 1, type = i8***]
  store i8** @ldc.dso_slot, i8*** %3, align 8
  %4 = getelementptr inbounds { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }, { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }* %1, i64 0, i32 2 ; [#uses = 1, type = %object.ModuleInfo***]
  store %object.ModuleInfo** @__start___minfo, %object.ModuleInfo*** %4, align 8
  %5 = getelementptr inbounds { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }, { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }* %1, i64 0, i32 3 ; [#uses = 1, type = %object.ModuleInfo***]
  store %object.ModuleInfo** @__stop___minfo, %object.ModuleInfo*** %5, align 8
  %6 = bitcast { i64, i8**, %object.ModuleInfo**, %object.ModuleInfo** }* %1 to i8* ; [#uses = 1]
  call void @_d_dso_registry(i8* nonnull %6)
  ret void
}

; [#uses = 1]
; Function Attrs: uwtable
declare void @_d_dso_registry(i8*) local_unnamed_addr #4

attributes #0 = { norecurse nounwind readonly uwtable "frame-pointer"="none" "target-cpu"="x86-64" "target-features"="+cx16" }
attributes #1 = { uwtable "frame-pointer"="none" "target-cpu"="x86-64" "target-features"="+cx16" }
attributes #2 = { uwtable "frame-pointer"="none" "target-cpu"="x86-64" "target-features"="+cx16,+cx16" }
attributes #3 = { nofree nounwind "frame-pointer"="none" "target-cpu"="x86-64" "target-features"="+cx16" }
attributes #4 = { uwtable }
attributes #5 = { cold noreturn uwtable }
attributes #6 = { "frame-pointer"="none" "target-cpu"="x86-64" "target-features"="+cx16" }

!llvm.ldc.typeinfo._D23TypeInfo_AS6source4Node6__initZ = !{!0}
!llvm.ldc.typeinfo._D22TypeInfo_S6source4Node6__initZ = !{!1}
!llvm.ident = !{!2}

!0 = !{{ i64, %source.Node* } undef}
!1 = !{%source.Node undef}
!2 = !{!"ldc version 1.28.0"}
!3 = !{i8 0, i8 2}
