From 878c4226a6223a8e424f373faf9ef40cbcda2a43 Mon Sep 17 00:00:00 2001 From: agra Date: Wed, 10 Jun 2026 17:27:11 +0300 Subject: [PATCH] fix(0109): hoist all per-instruction allocas to the function entry block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An alloca built at its use site re-executes on every pass through that block, and LLVM reclaims allocas only at ret — so loop-body locals, nested-loop index slots, and emitter spill temps (ig.tmp, sret slots, ABI coercion temps, byval materialization) grew the stack per iteration and long loops segfaulted on stack exhaustion. New LLVMEmitter.buildEntryAlloca inserts after existing entry-block allocas and restores the builder position; every LLVMBuildAlloca site reachable during instruction emission now routes through it. Initialization stores stay at the use site (per-iteration re-init is unchanged), and entry slots become mem2reg-promotable. The 35 .ir snapshot diffs are pure alloca position moves (type multisets verified identical per file). Regression: examples/0047-basic-loop-local-stack-reuse.sx (segfaulted pre-fix on both the 1M-iteration body-local loop and the 3M-iteration nested loop). --- examples/0047-basic-loop-local-stack-reuse.sx | 26 ++++ .../expected/0031-basic-local-fn-return.ir | 134 ++++++++--------- .../expected/0032-basic-ufcs-return-type.ir | 120 +++++++-------- .../0044-basic-default-arg-expansion.ir | 122 +++++++-------- .../0047-basic-loop-local-stack-reuse.exit | 1 + .../0047-basic-loop-local-stack-reuse.stderr | 1 + .../0047-basic-loop-local-stack-reuse.stdout | 2 + .../0107-types-int-cmp-in-float-ternary.ir | 120 +++++++-------- examples/expected/0200-generics-generic.ir | 118 +++++++-------- .../expected/0201-generics-generic-struct.ir | 140 +++++++++--------- .../expected/0301-closures-fn-pointers.ir | 118 +++++++-------- .../0400-protocols-impl-for-builtin.ir | 118 +++++++-------- ...-protocols-parameterized-protocol-value.ir | 120 +++++++-------- ...protocols-generic-struct-protocol-erase.ir | 122 +++++++-------- .../0416-protocols-auto-type-erasure.ir | 120 +++++++-------- .../expected/0507-packs-pack-mono-dedup.ir | 130 ++++++++-------- .../0513-packs-pack-mixed-comptime.ir | 122 +++++++-------- .../0518-packs-pack-value-dispatch.ir | 118 +++++++-------- .../0528-packs-protocol-pack-methods.ir | 124 ++++++++-------- .../0903-optionals-optional-roundtrip.ir | 140 +++++++++--------- .../0904-optionals-any-to-string-optional.ir | 128 ++++++++-------- examples/expected/1004-errors-try.ir | 120 +++++++-------- .../1006-errors-inferred-error-sets.ir | 120 +++++++-------- examples/expected/1009-errors-catch.ir | 124 ++++++++-------- .../1309-ffi-objc-class-method-lowering.ir | 10 +- .../1314-ffi-objc-class-dealloc-roundtrip.ir | 26 ++-- .../1319-ffi-objc-property-sx-defined.ir | 134 ++++++++--------- .../1329-ffi-objc-call-03-selector-sharing.ir | 10 +- .../1332-ffi-objc-call-06-sret-return.ir | 124 ++++++++-------- .../1347-ffi-objc-dsl-07-mangling-table.ir | 10 +- .../1402-ffi-jni-call-03-methodid-sharing.ir | 10 +- .../1403-ffi-jni-call-04-jint-return.ir | 12 +- .../1404-ffi-jni-call-05-jlong-return.ir | 12 +- .../1405-ffi-jni-call-06-jdouble-return.ir | 12 +- .../1406-ffi-jni-call-07-jboolean-return.ir | 12 +- .../1407-ffi-jni-call-08-jobject-return.ir | 12 +- .../expected/1408-ffi-jni-call-09-static.ir | 12 +- .../expected/1418-ffi-jni-class-08-call.ir | 12 +- .../1421-ffi-jni-env-02-lexical-direct.ir | 10 +- issues/0109-loop-body-alloca-stack-growth.md | 136 +++++++++++++++++ src/backend/llvm/abi.zig | 2 +- src/backend/llvm/ops.zig | 24 +-- src/ir/emit_llvm.zig | 41 ++++- 43 files changed, 1661 insertions(+), 1468 deletions(-) create mode 100644 examples/0047-basic-loop-local-stack-reuse.sx create mode 100644 examples/expected/0047-basic-loop-local-stack-reuse.exit create mode 100644 examples/expected/0047-basic-loop-local-stack-reuse.stderr create mode 100644 examples/expected/0047-basic-loop-local-stack-reuse.stdout create mode 100644 issues/0109-loop-body-alloca-stack-growth.md diff --git a/examples/0047-basic-loop-local-stack-reuse.sx b/examples/0047-basic-loop-local-stack-reuse.sx new file mode 100644 index 0000000..e980fed --- /dev/null +++ b/examples/0047-basic-loop-local-stack-reuse.sx @@ -0,0 +1,26 @@ +// Loop-body locals reuse one stack slot per frame: a body-declared local +// (and every compiler temp) must not grow the stack per iteration, so +// million-iteration loops run in constant stack. Covers body locals, +// nested loops (the inner loop's hidden index slot), and element reads. +// Regression (issue 0109): allocas were emitted at their use site, so each +// iteration re-executed them — LLVM only reclaims allocas at `ret`, and +// these loops segfaulted on stack exhaustion. + +#import "modules/std.sx"; + +main :: () -> s32 { + sum := 0; + for 0..1000000: (i) { + buf : [128]s64 = ---; + buf[0] = i; + sum += buf[0]; + } + print("sum={}\n", sum); + + n := 0; + for 0..3000000: (i) { + for 0..1: (j) { n += 1; } + } + print("n={}\n", n); + 0 +} diff --git a/examples/expected/0031-basic-local-fn-return.ir b/examples/expected/0031-basic-local-fn-return.ir index 129c088..ae058c2 100644 --- a/examples/expected/0031-basic-local-fn-return.ir +++ b/examples/expected/0031-basic-local-fn-return.ir @@ -458,6 +458,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -469,15 +474,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -489,7 +490,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -547,6 +547,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -558,18 +569,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -577,9 +584,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -594,7 +599,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -607,7 +611,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -620,7 +623,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -641,12 +643,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -699,6 +699,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -718,11 +730,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -730,7 +740,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -745,19 +754,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -770,20 +775,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -819,7 +820,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -847,6 +847,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -870,7 +871,6 @@ while.hdr.241: ; preds = %if.merge.246, %entr while.body.242: ; preds = %while.hdr.241 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -911,6 +911,13 @@ if.merge.246: ; preds = %if.else.245, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -931,11 +938,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -952,11 +957,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -973,11 +976,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -990,7 +991,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1012,6 +1012,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1023,40 +1030,33 @@ if.then.239: ; preds = %entry if.merge.240: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.247 @@ -1167,6 +1167,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.40, i64 3 }, ptr %allocaN, align 8 @@ -1256,7 +1263,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1276,7 +1282,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1285,7 +1290,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1305,7 +1309,6 @@ match.arm.44: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.169 [ i64 37, label %dispatch.case.170 i64 38, label %dispatch.case.171 @@ -1322,7 +1325,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.180 [ i64 35, label %dispatch.case.181 i64 55, label %dispatch.case.182 @@ -1333,7 +1335,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.200 [ i64 36, label %dispatch.case.201 i64 48, label %dispatch.case.202 @@ -1343,7 +1344,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.214 [ i64 18, label %dispatch.case.215 i64 22, label %dispatch.case.216 @@ -2510,6 +2510,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.159, i64 15 }, { ptr, i64 } { ptr @str.160, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2574,7 +2576,6 @@ fv.default: ; preds = %if.merge.112 fv.case: ; preds = %if.merge.112 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2594,7 +2595,6 @@ fv.case20: ; preds = %if.merge.112 fv.case24: ; preds = %if.merge.112 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2889,6 +2889,7 @@ fv.case17: ; preds = %if.merge.132 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.197, i64 5 }, { ptr, i64 } { ptr @str.198, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2963,7 +2964,6 @@ fv.case17: ; preds = %if.merge.137 fv.case20: ; preds = %if.merge.137 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3056,6 +3056,7 @@ fv.case20: ; preds = %if.merge.142 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.215, i64 17 }, { ptr, i64 } { ptr @str.216, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3120,7 +3121,6 @@ fv.default: ; preds = %if.merge.147 fv.case: ; preds = %if.merge.147 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3146,6 +3146,7 @@ fv.case23: ; preds = %if.merge.147 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.225, i64 7 }, { ptr, i64 } { ptr @str.226, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3208,7 +3209,6 @@ fv.default: ; preds = %if.merge.152 fv.case: ; preds = %if.merge.152 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3518,6 +3518,11 @@ if.merge.176: ; preds = %if.then.175, %entry define internal { ptr, i64 } @enum_to_string__Shape(ptr %0, { i64, [8 x i8] } %1) #0 { entry: %alloca = alloca { i64, [8 x i8] }, align 8 + %fv.utmp = alloca { i64, [8 x i8] }, align 8 + %fv.utmp7 = alloca { i64, [8 x i8] }, align 8 + %ba.tmp = alloca { float, float }, align 8 + %allocaN = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, [8 x i8] } %1, ptr %alloca, align 8 %load = load { i64, [8 x i8] }, ptr %alloca, align 8 %etag = extractvalue { i64, [8 x i8] } %load, 0 @@ -3552,11 +3557,9 @@ if.merge.178: ; preds = %if.then.177, %fv.me fv.merge: ; preds = %fv.default, %fv.case11, %fv.case6, %fv.case %fv.phi = phi { i64, i64 } [ %fv.val, %fv.case ], [ %fv.val10, %fv.case6 ], [ { i64 17, i64 0 }, %fv.case11 ], [ undef, %fv.default ] - %allocaN = alloca { i64, i64 }, align 8 store { i64, i64 } %fv.phi, ptr %allocaN, align 8 %loadN = load { i64, i64 }, ptr %allocaN, align 8 %callN = call { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 @@ -3567,7 +3570,6 @@ fv.default: ; preds = %entry br label %fv.merge fv.case: ; preds = %entry - %fv.utmp = alloca { i64, [8 x i8] }, align 8 store { i64, [8 x i8] } %loadN, ptr %fv.utmp, align 8 %fv.pp = getelementptr inbounds { i64, [8 x i8] }, ptr %fv.utmp, i32 0, i32 1 %fv.field = load float, ptr %fv.pp, align 4 @@ -3577,11 +3579,9 @@ fv.case: ; preds = %entry br label %fv.merge fv.case6: ; preds = %entry - %fv.utmp7 = alloca { i64, [8 x i8] }, align 8 store { i64, [8 x i8] } %loadN, ptr %fv.utmp7, align 8 %fv.pp8 = getelementptr inbounds { i64, [8 x i8] }, ptr %fv.utmp7, i32 0, i32 1 %fv.field9 = load { float, float }, ptr %fv.pp8, align 4 - %ba.tmp = alloca { float, float }, align 8 store { float, float } %fv.field9, ptr %ba.tmp, align 4 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val10 = insertvalue { i64, i64 } { i64 42, i64 undef }, i64 %ba.p2i, 1 @@ -3595,6 +3595,7 @@ fv.case11: ; preds = %entry define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.282, i64 1 }, ptr %allocaN, align 8 @@ -3627,7 +3628,6 @@ if.merge.188: ; preds = %if.then.187, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3645,6 +3645,8 @@ if.merge.188: ; preds = %if.then.187, %while define internal { ptr, i64 } @array_to_string__AR_2_Any(ptr %0, [2 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [2 x { i64, i64 }], align 8 + %ig.tmp = alloca [2 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [2 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.285, i64 1 }, ptr %allocaN, align 8 @@ -3677,11 +3679,9 @@ if.merge.193: ; preds = %if.then.192, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [2 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [2 x { i64, i64 }], align 8 store [2 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [2 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3698,6 +3698,8 @@ if.merge.193: ; preds = %if.then.192, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.288, i64 1 }, ptr %allocaN, align 8 @@ -3730,11 +3732,9 @@ if.merge.198: ; preds = %if.then.197, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3751,6 +3751,7 @@ if.merge.198: ; preds = %if.then.197, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.291, i64 1 }, ptr %allocaN, align 8 @@ -3788,7 +3789,6 @@ if.merge.207: ; preds = %if.then.206, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3805,6 +3805,7 @@ if.merge.207: ; preds = %if.then.206, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.294, i64 1 }, ptr %allocaN, align 8 @@ -3842,7 +3843,6 @@ if.merge.212: ; preds = %if.then.211, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0032-basic-ufcs-return-type.ir b/examples/expected/0032-basic-ufcs-return-type.ir index 9a2934a..c1de814 100644 --- a/examples/expected/0032-basic-ufcs-return-type.ir +++ b/examples/expected/0032-basic-ufcs-return-type.ir @@ -426,6 +426,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -437,15 +442,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -457,7 +458,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -515,6 +515,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -526,18 +537,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -545,9 +552,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -562,7 +567,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -575,7 +579,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -588,7 +591,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -609,12 +611,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -667,6 +667,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -686,11 +698,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -698,7 +708,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -713,19 +722,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -738,20 +743,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -787,7 +788,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -815,6 +815,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -838,7 +839,6 @@ while.hdr.224: ; preds = %if.merge.229, %entr while.body.225: ; preds = %while.hdr.224 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -879,6 +879,13 @@ if.merge.229: ; preds = %if.else.228, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -899,11 +906,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -920,11 +925,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -941,11 +944,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -958,7 +959,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -980,6 +980,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -991,40 +998,33 @@ if.then.222: ; preds = %entry if.merge.223: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.230 @@ -1135,6 +1135,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.40, i64 3 }, ptr %allocaN, align 8 @@ -1219,7 +1226,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1239,7 +1245,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1248,7 +1253,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1267,7 +1271,6 @@ match.arm.44: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.163 [ i64 37, label %dispatch.case.164 i64 38, label %dispatch.case.165 @@ -1283,7 +1286,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.171 [ i64 35, label %dispatch.case.172 i64 53, label %dispatch.case.173 @@ -1293,7 +1295,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.185 [ i64 36, label %dispatch.case.186 i64 46, label %dispatch.case.187 @@ -1303,7 +1304,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.199 [ i64 18, label %dispatch.case.200 i64 22, label %dispatch.case.201 @@ -2397,6 +2397,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.151, i64 15 }, { ptr, i64 } { ptr @str.152, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2461,7 +2463,6 @@ fv.default: ; preds = %if.merge.111 fv.case: ; preds = %if.merge.111 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2481,7 +2482,6 @@ fv.case20: ; preds = %if.merge.111 fv.case24: ; preds = %if.merge.111 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2776,6 +2776,7 @@ fv.case17: ; preds = %if.merge.131 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.189, i64 5 }, { ptr, i64 } { ptr @str.190, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2850,7 +2851,6 @@ fv.case17: ; preds = %if.merge.136 fv.case20: ; preds = %if.merge.136 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2943,6 +2943,7 @@ fv.case20: ; preds = %if.merge.141 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.207, i64 17 }, { ptr, i64 } { ptr @str.208, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3007,7 +3008,6 @@ fv.default: ; preds = %if.merge.146 fv.case: ; preds = %if.merge.146 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3033,6 +3033,7 @@ fv.case23: ; preds = %if.merge.146 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.217, i64 7 }, { ptr, i64 } { ptr @str.218, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3095,7 +3096,6 @@ fv.default: ; preds = %if.merge.151 fv.case: ; preds = %if.merge.151 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3326,6 +3326,7 @@ if.merge.169: ; preds = %if.then.168, %entry define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.259, i64 1 }, ptr %allocaN, align 8 @@ -3358,7 +3359,6 @@ if.merge.178: ; preds = %if.then.177, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3376,6 +3376,8 @@ if.merge.178: ; preds = %if.then.177, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.262, i64 1 }, ptr %allocaN, align 8 @@ -3408,11 +3410,9 @@ if.merge.183: ; preds = %if.then.182, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3429,6 +3429,7 @@ if.merge.183: ; preds = %if.then.182, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.265, i64 1 }, ptr %allocaN, align 8 @@ -3466,7 +3467,6 @@ if.merge.192: ; preds = %if.then.191, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3483,6 +3483,7 @@ if.merge.192: ; preds = %if.then.191, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.268, i64 1 }, ptr %allocaN, align 8 @@ -3520,7 +3521,6 @@ if.merge.197: ; preds = %if.then.196, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0044-basic-default-arg-expansion.ir b/examples/expected/0044-basic-default-arg-expansion.ir index 23aca2b..64d3f26 100644 --- a/examples/expected/0044-basic-default-arg-expansion.ir +++ b/examples/expected/0044-basic-default-arg-expansion.ir @@ -390,6 +390,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -401,15 +406,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -421,7 +422,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -479,6 +479,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -490,18 +501,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -509,9 +516,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -526,7 +531,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -539,7 +543,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -552,7 +555,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -573,12 +575,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -631,6 +631,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -650,11 +662,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -662,7 +672,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -677,19 +686,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -702,20 +707,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -751,7 +752,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -779,6 +779,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -802,7 +803,6 @@ while.hdr.210: ; preds = %if.merge.215, %entr while.body.211: ; preds = %while.hdr.210 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -843,6 +843,13 @@ if.merge.215: ; preds = %if.else.214, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -863,11 +870,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -884,11 +889,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -905,11 +908,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -922,7 +923,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -944,6 +944,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -955,40 +962,33 @@ if.then.208: ; preds = %entry if.merge.209: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.216 @@ -1099,6 +1099,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1180,7 +1186,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1200,7 +1205,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1209,7 +1213,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1235,7 +1238,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 44, label %dispatch.case.153 @@ -1246,7 +1248,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.171 [ i64 36, label %dispatch.case.172 i64 42, label %dispatch.case.173 @@ -1256,7 +1257,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.185 [ i64 18, label %dispatch.case.186 i64 22, label %dispatch.case.187 @@ -2154,6 +2154,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.114, i64 15 }, { ptr, i64 } { ptr @str.115, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2218,7 +2220,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2238,7 +2239,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2533,6 +2533,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.152, i64 5 }, { ptr, i64 } { ptr @str.153, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2607,7 +2608,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2700,6 +2700,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.170, i64 17 }, { ptr, i64 } { ptr @str.171, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2764,7 +2765,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2790,6 +2790,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.180, i64 7 }, { ptr, i64 } { ptr @str.181, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2852,7 +2853,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2869,6 +2869,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.188, i64 1 }, ptr %allocaN, align 8 @@ -2901,7 +2902,6 @@ if.merge.159: ; preds = %if.then.158, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2919,6 +2919,8 @@ if.merge.159: ; preds = %if.then.158, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.191, i64 1 }, ptr %allocaN, align 8 @@ -2951,11 +2953,9 @@ if.merge.164: ; preds = %if.then.163, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2972,6 +2972,8 @@ if.merge.164: ; preds = %if.then.163, %while define internal { ptr, i64 } @array_to_string__AR_3_Any(ptr %0, [3 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 + %ig.tmp = alloca [3 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [3 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.194, i64 1 }, ptr %allocaN, align 8 @@ -3004,11 +3006,9 @@ if.merge.169: ; preds = %if.then.168, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [3 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3025,6 +3025,7 @@ if.merge.169: ; preds = %if.then.168, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.197, i64 1 }, ptr %allocaN, align 8 @@ -3062,7 +3063,6 @@ if.merge.178: ; preds = %if.then.177, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3079,6 +3079,7 @@ if.merge.178: ; preds = %if.then.177, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.200, i64 1 }, ptr %allocaN, align 8 @@ -3116,7 +3117,6 @@ if.merge.183: ; preds = %if.then.182, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0047-basic-loop-local-stack-reuse.exit b/examples/expected/0047-basic-loop-local-stack-reuse.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/examples/expected/0047-basic-loop-local-stack-reuse.exit @@ -0,0 +1 @@ +0 diff --git a/examples/expected/0047-basic-loop-local-stack-reuse.stderr b/examples/expected/0047-basic-loop-local-stack-reuse.stderr new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/expected/0047-basic-loop-local-stack-reuse.stderr @@ -0,0 +1 @@ + diff --git a/examples/expected/0047-basic-loop-local-stack-reuse.stdout b/examples/expected/0047-basic-loop-local-stack-reuse.stdout new file mode 100644 index 0000000..96f2053 --- /dev/null +++ b/examples/expected/0047-basic-loop-local-stack-reuse.stdout @@ -0,0 +1,2 @@ +sum=499999500000 +n=3000000 diff --git a/examples/expected/0107-types-int-cmp-in-float-ternary.ir b/examples/expected/0107-types-int-cmp-in-float-ternary.ir index 1c1b3d0..95cae72 100644 --- a/examples/expected/0107-types-int-cmp-in-float-ternary.ir +++ b/examples/expected/0107-types-int-cmp-in-float-ternary.ir @@ -370,6 +370,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -381,15 +386,11 @@ if.then.19: ; preds = %entry if.merge.20: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.21 @@ -401,7 +402,6 @@ while.hdr.21: ; preds = %if.merge.25, %if.me while.body.22: ; preds = %while.hdr.21 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -459,6 +459,17 @@ if.merge.27: ; preds = %if.then.26, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -470,18 +481,14 @@ if.then.61: ; preds = %entry if.merge.62: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.71 while.hdr.71: ; preds = %while.exit.82, %if.merge.62 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -489,9 +496,7 @@ while.hdr.71: ; preds = %while.exit.82, %if. br i1 %icmpN, label %or.merge.75, label %or.rhs.74 while.body.72: ; preds = %or.merge.79 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.80 @@ -506,7 +511,6 @@ while.exit.73: ; preds = %or.merge.79 or.rhs.74: ; preds = %while.hdr.71 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -519,7 +523,6 @@ or.merge.75: ; preds = %or.rhs.74, %while.h or.rhs.76: ; preds = %or.merge.75 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -532,7 +535,6 @@ or.merge.77: ; preds = %or.rhs.76, %or.merg or.rhs.78: ; preds = %or.merge.77 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -553,12 +555,10 @@ while.body.81: ; preds = %while.hdr.80 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -611,6 +611,18 @@ if.merge.85: ; preds = %if.else.84, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -630,11 +642,9 @@ if.else.90: ; preds = %entry if.merge.91: ; preds = %if.else.90, %if.then.89 %bp = phi double [ %fsub, %if.then.89 ], [ %loadN, %if.else.90 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -642,7 +652,6 @@ if.merge.91: ; preds = %if.else.90, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -657,19 +666,15 @@ if.then.92: ; preds = %if.merge.91 if.merge.93: ; preds = %if.then.92, %if.merge.91 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.94, label %if.else.95 @@ -682,20 +687,16 @@ if.else.95: ; preds = %if.merge.93 if.merge.96: ; preds = %if.else.95, %if.then.94 %bpN = phi i64 [ 1, %if.then.94 ], [ 0, %if.else.95 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.97, label %if.merge.98 @@ -731,7 +732,6 @@ if.merge.98: ; preds = %if.then.97, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -759,6 +759,7 @@ if.merge.98: ; preds = %if.then.97, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -782,7 +783,6 @@ while.hdr.208: ; preds = %if.merge.213, %entr while.body.209: ; preds = %while.hdr.208 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -823,6 +823,13 @@ if.merge.213: ; preds = %if.else.212, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -843,11 +850,9 @@ if.merge.64: ; preds = %if.then.63, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -864,11 +869,9 @@ if.merge.66: ; preds = %if.then.65, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -885,11 +888,9 @@ if.merge.68: ; preds = %if.then.67, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -902,7 +903,6 @@ if.then.69: ; preds = %if.merge.68 br label %if.merge.70 if.merge.70: ; preds = %if.then.69, %if.merge.68 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -924,6 +924,13 @@ if.merge.70: ; preds = %if.then.69, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -935,40 +942,33 @@ if.then.206: ; preds = %entry if.merge.207: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.214 @@ -1079,6 +1079,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1158,7 +1164,6 @@ match.arm.44: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.58, label %if.else.59 match.arm.45: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1178,7 +1183,6 @@ match.arm.46: ; preds = %entry match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.86, label %fN.unbox.87 @@ -1187,7 +1191,6 @@ match.arm.48: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.100 [ i64 19, label %dispatch.case.101 i64 20, label %dispatch.case.102 @@ -1213,7 +1216,6 @@ match.arm.52: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.156 [ i64 35, label %dispatch.case.157 i64 44, label %dispatch.case.158 @@ -1223,7 +1225,6 @@ match.arm.53: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.170 [ i64 36, label %dispatch.case.171 i64 42, label %dispatch.case.172 @@ -1233,7 +1234,6 @@ match.arm.54: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.184 [ i64 18, label %dispatch.case.185 i64 22, label %dispatch.case.186 @@ -1871,6 +1871,7 @@ if.merge.41: ; preds = %if.then.40, %while. define i32 @main() #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca float, align 4 store i64 42, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp ne i64 %load, 0 @@ -1881,7 +1882,6 @@ if.then.0: ; preds = %entry br label %if.merge.1 if.merge.1: ; preds = %if.then.0, %entry - %allocaN = alloca float, align 4 %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %if.then.2, label %if.else.3 @@ -1973,6 +1973,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.100, i64 15 }, { ptr, i64 } { ptr @str.101, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2037,7 +2039,6 @@ fv.default: ; preds = %if.merge.114 fv.case: ; preds = %if.merge.114 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2057,7 +2058,6 @@ fv.case20: ; preds = %if.merge.114 fv.case24: ; preds = %if.merge.114 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2352,6 +2352,7 @@ fv.case17: ; preds = %if.merge.134 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.138, i64 5 }, { ptr, i64 } { ptr @str.139, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2426,7 +2427,6 @@ fv.case17: ; preds = %if.merge.139 fv.case20: ; preds = %if.merge.139 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2519,6 +2519,7 @@ fv.case20: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.156, i64 17 }, { ptr, i64 } { ptr @str.157, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2583,7 +2584,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2609,6 +2609,7 @@ fv.case23: ; preds = %if.merge.149 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.166, i64 7 }, { ptr, i64 } { ptr @str.167, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2671,7 +2672,6 @@ fv.default: ; preds = %if.merge.154 fv.case: ; preds = %if.merge.154 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2688,6 +2688,7 @@ fv.case17: ; preds = %if.merge.154 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.174, i64 1 }, ptr %allocaN, align 8 @@ -2720,7 +2721,6 @@ if.merge.163: ; preds = %if.then.162, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2738,6 +2738,8 @@ if.merge.163: ; preds = %if.then.162, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.177, i64 1 }, ptr %allocaN, align 8 @@ -2770,11 +2772,9 @@ if.merge.168: ; preds = %if.then.167, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2791,6 +2791,7 @@ if.merge.168: ; preds = %if.then.167, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.180, i64 1 }, ptr %allocaN, align 8 @@ -2828,7 +2829,6 @@ if.merge.177: ; preds = %if.then.176, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2845,6 +2845,7 @@ if.merge.177: ; preds = %if.then.176, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.183, i64 1 }, ptr %allocaN, align 8 @@ -2882,7 +2883,6 @@ if.merge.182: ; preds = %if.then.181, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0200-generics-generic.ir b/examples/expected/0200-generics-generic.ir index 9d2221b..e1105fb 100644 --- a/examples/expected/0200-generics-generic.ir +++ b/examples/expected/0200-generics-generic.ir @@ -371,6 +371,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -382,15 +387,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -402,7 +403,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -460,6 +460,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -471,18 +482,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -490,9 +497,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -507,7 +512,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -520,7 +524,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -533,7 +536,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -554,12 +556,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -612,6 +612,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -631,11 +643,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -643,7 +653,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -658,19 +667,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -683,20 +688,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -732,7 +733,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -760,6 +760,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -783,7 +784,6 @@ while.hdr.203: ; preds = %if.merge.208, %entr while.body.204: ; preds = %while.hdr.203 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -824,6 +824,13 @@ if.merge.208: ; preds = %if.else.207, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -844,11 +851,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -865,11 +870,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -886,11 +889,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -903,7 +904,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -925,6 +925,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -936,40 +943,33 @@ if.then.201: ; preds = %entry if.merge.202: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.209 @@ -1080,6 +1080,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1159,7 +1165,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1179,7 +1184,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1188,7 +1192,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1214,7 +1217,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 43, label %dispatch.case.153 @@ -1224,7 +1226,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.165 [ i64 36, label %dispatch.case.166 i64 41, label %dispatch.case.167 @@ -1234,7 +1235,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.179 [ i64 18, label %dispatch.case.180 i64 22, label %dispatch.case.181 @@ -2029,6 +2029,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.101, i64 15 }, { ptr, i64 } { ptr @str.102, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2093,7 +2095,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2113,7 +2114,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2408,6 +2408,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.139, i64 5 }, { ptr, i64 } { ptr @str.140, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2482,7 +2483,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2575,6 +2575,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.157, i64 17 }, { ptr, i64 } { ptr @str.158, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2639,7 +2640,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2665,6 +2665,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.167, i64 7 }, { ptr, i64 } { ptr @str.168, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2727,7 +2728,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2744,6 +2744,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.175, i64 1 }, ptr %allocaN, align 8 @@ -2776,7 +2777,6 @@ if.merge.158: ; preds = %if.then.157, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2794,6 +2794,8 @@ if.merge.158: ; preds = %if.then.157, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.178, i64 1 }, ptr %allocaN, align 8 @@ -2826,11 +2828,9 @@ if.merge.163: ; preds = %if.then.162, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2847,6 +2847,7 @@ if.merge.163: ; preds = %if.then.162, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.181, i64 1 }, ptr %allocaN, align 8 @@ -2884,7 +2885,6 @@ if.merge.172: ; preds = %if.then.171, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2901,6 +2901,7 @@ if.merge.172: ; preds = %if.then.171, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.184, i64 1 }, ptr %allocaN, align 8 @@ -2938,7 +2939,6 @@ if.merge.177: ; preds = %if.then.176, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0201-generics-generic-struct.ir b/examples/expected/0201-generics-generic-struct.ir index 2d35d53..4c333e8 100644 --- a/examples/expected/0201-generics-generic-struct.ir +++ b/examples/expected/0201-generics-generic-struct.ir @@ -508,6 +508,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -519,15 +524,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -539,7 +540,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -597,6 +597,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -608,18 +619,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -627,9 +634,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -644,7 +649,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -657,7 +661,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -670,7 +673,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -691,12 +693,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -749,6 +749,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -768,11 +780,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -780,7 +790,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -795,19 +804,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -820,20 +825,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -869,7 +870,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -897,6 +897,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -920,7 +921,6 @@ while.hdr.270: ; preds = %if.merge.275, %entr while.body.271: ; preds = %while.hdr.270 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -961,6 +961,13 @@ if.merge.275: ; preds = %if.else.274, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -981,11 +988,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1002,11 +1007,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1023,11 +1026,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1040,7 +1041,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1062,6 +1062,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1073,40 +1080,33 @@ if.then.268: ; preds = %entry if.merge.269: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.276 @@ -1217,6 +1217,14 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1312,7 +1320,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1332,7 +1339,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1341,7 +1347,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1364,7 +1369,6 @@ match.arm.44: ; preds = %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.187 [ i64 63, label %dispatch.case.188 ] @@ -1376,7 +1380,6 @@ match.arm.46: ; preds = %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.192 [ i64 40, label %dispatch.case.193 ] @@ -1385,7 +1388,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.200 [ i64 35, label %dispatch.case.201 i64 37, label %dispatch.case.202 @@ -1397,7 +1399,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.226 [ i64 36, label %dispatch.case.227 i64 50, label %dispatch.case.228 @@ -1407,7 +1408,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw36 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw36, label %dispatch.default.240 [ i64 18, label %dispatch.case.241 i64 22, label %dispatch.case.242 @@ -3021,6 +3021,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.160, i64 15 }, { ptr, i64 } { ptr @str.161, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3085,7 +3087,6 @@ fv.default: ; preds = %if.merge.115 fv.case: ; preds = %if.merge.115 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3105,7 +3106,6 @@ fv.case20: ; preds = %if.merge.115 fv.case24: ; preds = %if.merge.115 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -3400,6 +3400,7 @@ fv.case17: ; preds = %if.merge.135 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.198, i64 5 }, { ptr, i64 } { ptr @str.199, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3474,7 +3475,6 @@ fv.case17: ; preds = %if.merge.140 fv.case20: ; preds = %if.merge.140 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3567,6 +3567,7 @@ fv.case20: ; preds = %if.merge.145 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.216, i64 17 }, { ptr, i64 } { ptr @str.217, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3631,7 +3632,6 @@ fv.default: ; preds = %if.merge.150 fv.case: ; preds = %if.merge.150 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3657,6 +3657,7 @@ fv.case23: ; preds = %if.merge.150 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.226, i64 7 }, { ptr, i64 } { ptr @str.227, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3719,7 +3720,6 @@ fv.default: ; preds = %if.merge.155 fv.case: ; preds = %if.merge.155 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3736,6 +3736,7 @@ fv.case17: ; preds = %if.merge.155 define internal { ptr, i64 } @struct_to_string__Mat4(ptr %0, { [16 x float] } %1) #0 { entry: %alloca = alloca { [16 x float] }, align 8 + %ba.tmp = alloca [16 x float], align 4 store { [16 x float] } %1, ptr %alloca, align 4 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.234, i64 4 }, { ptr, i64 } { ptr @str.235, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3797,7 +3798,6 @@ fv.default: ; preds = %if.merge.160 fv.case: ; preds = %if.merge.160 %fv.field = extractvalue { [16 x float] } %loadN, 0 - %ba.tmp = alloca [16 x float], align 4 store [16 x float] %fv.field, ptr %ba.tmp, align 4 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 37, i64 undef }, i64 %ba.p2i, 1 @@ -3887,6 +3887,7 @@ fv.case17: ; preds = %if.merge.165 define internal { ptr, i64 } @struct_to_string__Vec__3__f32(ptr %0, { <3 x float> } %1) #0 { entry: %alloca = alloca { <3 x float> }, align 16 + %ba.tmp = alloca <3 x float>, align 16 store { <3 x float> } %1, ptr %alloca, align 16 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.249, i64 11 }, { ptr, i64 } { ptr @str.250, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3948,7 +3949,6 @@ fv.default: ; preds = %if.merge.170 fv.case: ; preds = %if.merge.170 %fv.field = extractvalue { <3 x float> } %loadN, 0 - %ba.tmp = alloca <3 x float>, align 16 store <3 x float> %fv.field, ptr %ba.tmp, align 16 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 40, i64 undef }, i64 %ba.p2i, 1 @@ -3959,6 +3959,7 @@ fv.case: ; preds = %if.merge.170 define internal { ptr, i64 } @struct_to_string__Vec3(ptr %0, { <3 x float> } %1) #0 { entry: %alloca = alloca { <3 x float> }, align 16 + %ba.tmp = alloca <3 x float>, align 16 store { <3 x float> } %1, ptr %alloca, align 16 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.256, i64 4 }, { ptr, i64 } { ptr @str.257, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -4020,7 +4021,6 @@ fv.default: ; preds = %if.merge.175 fv.case: ; preds = %if.merge.175 %fv.field = extractvalue { <3 x float> } %loadN, 0 - %ba.tmp = alloca <3 x float>, align 16 store <3 x float> %fv.field, ptr %ba.tmp, align 16 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 40, i64 undef }, i64 %ba.p2i, 1 @@ -4185,6 +4185,10 @@ fv.case17: ; preds = %if.merge.185 define internal { ptr, i64 } @enum_to_string__Sx__f32(ptr %0, { i64, [4 x i8] } %1) #0 { entry: %alloca = alloca { i64, [4 x i8] }, align 8 + %fv.utmp = alloca { i64, [4 x i8] }, align 8 + %fv.utmp7 = alloca { i64, [4 x i8] }, align 8 + %allocaN = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, [4 x i8] } %1, ptr %alloca, align 8 %load = load { i64, [4 x i8] }, ptr %alloca, align 8 %etag = extractvalue { i64, [4 x i8] } %load, 0 @@ -4218,11 +4222,9 @@ if.merge.190: ; preds = %if.then.189, %fv.me fv.merge: ; preds = %fv.default, %fv.case6, %fv.case %fv.phi = phi { i64, i64 } [ %fv.val, %fv.case ], [ %fv.val10, %fv.case6 ], [ undef, %fv.default ] - %allocaN = alloca { i64, i64 }, align 8 store { i64, i64 } %fv.phi, ptr %allocaN, align 8 %loadN = load { i64, i64 }, ptr %allocaN, align 8 %callN = call { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 @@ -4233,7 +4235,6 @@ fv.default: ; preds = %entry br label %fv.merge fv.case: ; preds = %entry - %fv.utmp = alloca { i64, [4 x i8] }, align 8 store { i64, [4 x i8] } %loadN, ptr %fv.utmp, align 8 %fv.pp = getelementptr inbounds { i64, [4 x i8] }, ptr %fv.utmp, i32 0, i32 1 %fv.field = load i32, ptr %fv.pp, align 4 @@ -4242,7 +4243,6 @@ fv.case: ; preds = %entry br label %fv.merge fv.case6: ; preds = %entry - %fv.utmp7 = alloca { i64, [4 x i8] }, align 8 store { i64, [4 x i8] } %loadN, ptr %fv.utmp7, align 8 %fv.pp8 = getelementptr inbounds { i64, [4 x i8] }, ptr %fv.utmp7, i32 0, i32 1 %fv.field9 = load float, ptr %fv.pp8, align 4 @@ -4306,6 +4306,7 @@ if.merge.198: ; preds = %if.then.197, %while define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.288, i64 1 }, ptr %allocaN, align 8 @@ -4338,7 +4339,6 @@ if.merge.209: ; preds = %if.then.208, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -4356,6 +4356,7 @@ if.merge.209: ; preds = %if.then.208, %while define internal { ptr, i64 } @array_to_string__AR_16_f32(ptr %0, [16 x float] %1) #0 { entry: %alloca = alloca [16 x float], align 4 + %ig.tmp = alloca [16 x float], align 4 store [16 x float] %1, ptr %alloca, align 4 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.291, i64 1 }, ptr %allocaN, align 8 @@ -4388,7 +4389,6 @@ if.merge.214: ; preds = %if.then.213, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [16 x float], ptr %alloca, align 4 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [16 x float], align 4 store [16 x float] %loadN, ptr %ig.tmp, align 4 %ig.ptr = getelementptr [16 x float], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load float, ptr %ig.ptr, align 4 @@ -4408,6 +4408,8 @@ if.merge.214: ; preds = %if.then.213, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.294, i64 1 }, ptr %allocaN, align 8 @@ -4440,11 +4442,9 @@ if.merge.219: ; preds = %if.then.218, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -4461,6 +4461,7 @@ if.merge.219: ; preds = %if.then.218, %while define internal { ptr, i64 } @array_to_string__AR_5_f32(ptr %0, [5 x float] %1) #0 { entry: %alloca = alloca [5 x float], align 4 + %ig.tmp = alloca [5 x float], align 4 store [5 x float] %1, ptr %alloca, align 4 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.297, i64 1 }, ptr %allocaN, align 8 @@ -4493,7 +4494,6 @@ if.merge.224: ; preds = %if.then.223, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [5 x float], ptr %alloca, align 4 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [5 x float], align 4 store [5 x float] %loadN, ptr %ig.tmp, align 4 %ig.ptr = getelementptr [5 x float], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load float, ptr %ig.ptr, align 4 @@ -4513,6 +4513,7 @@ if.merge.224: ; preds = %if.then.223, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.300, i64 1 }, ptr %allocaN, align 8 @@ -4550,7 +4551,6 @@ if.merge.233: ; preds = %if.then.232, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -4567,6 +4567,7 @@ if.merge.233: ; preds = %if.then.232, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.303, i64 1 }, ptr %allocaN, align 8 @@ -4604,7 +4605,6 @@ if.merge.238: ; preds = %if.then.237, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0301-closures-fn-pointers.ir b/examples/expected/0301-closures-fn-pointers.ir index 8e5cbcf..33fa96c 100644 --- a/examples/expected/0301-closures-fn-pointers.ir +++ b/examples/expected/0301-closures-fn-pointers.ir @@ -381,6 +381,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -392,15 +397,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -412,7 +413,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -470,6 +470,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -481,18 +492,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -500,9 +507,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -517,7 +522,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -530,7 +534,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -543,7 +546,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -564,12 +566,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -622,6 +622,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -641,11 +653,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -653,7 +663,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -668,19 +677,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -693,20 +698,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -742,7 +743,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -770,6 +770,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -793,7 +794,6 @@ while.hdr.204: ; preds = %if.merge.209, %entr while.body.205: ; preds = %while.hdr.204 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -834,6 +834,13 @@ if.merge.209: ; preds = %if.else.208, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -854,11 +861,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -875,11 +880,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -896,11 +899,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -913,7 +914,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -935,6 +935,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -946,40 +953,33 @@ if.then.202: ; preds = %entry if.merge.203: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.210 @@ -1090,6 +1090,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1170,7 +1176,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1190,7 +1195,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1199,7 +1203,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1225,7 +1228,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 46, label %dispatch.case.153 @@ -1235,7 +1237,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.165 [ i64 36, label %dispatch.case.166 i64 44, label %dispatch.case.167 @@ -1245,7 +1246,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.179 [ i64 18, label %dispatch.case.180 i64 22, label %dispatch.case.181 @@ -2122,6 +2122,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.108, i64 15 }, { ptr, i64 } { ptr @str.109, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2186,7 +2188,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2206,7 +2207,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2501,6 +2501,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.146, i64 5 }, { ptr, i64 } { ptr @str.147, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2575,7 +2576,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2668,6 +2668,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.164, i64 17 }, { ptr, i64 } { ptr @str.165, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2732,7 +2733,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2758,6 +2758,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.174, i64 7 }, { ptr, i64 } { ptr @str.175, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2820,7 +2821,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2837,6 +2837,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.182, i64 1 }, ptr %allocaN, align 8 @@ -2869,7 +2870,6 @@ if.merge.158: ; preds = %if.then.157, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2887,6 +2887,8 @@ if.merge.158: ; preds = %if.then.157, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.185, i64 1 }, ptr %allocaN, align 8 @@ -2919,11 +2921,9 @@ if.merge.163: ; preds = %if.then.162, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2940,6 +2940,7 @@ if.merge.163: ; preds = %if.then.162, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.188, i64 1 }, ptr %allocaN, align 8 @@ -2977,7 +2978,6 @@ if.merge.172: ; preds = %if.then.171, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2994,6 +2994,7 @@ if.merge.172: ; preds = %if.then.171, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.191, i64 1 }, ptr %allocaN, align 8 @@ -3031,7 +3032,6 @@ if.merge.177: ; preds = %if.then.176, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0400-protocols-impl-for-builtin.ir b/examples/expected/0400-protocols-impl-for-builtin.ir index f4b164d..f1a3c48 100644 --- a/examples/expected/0400-protocols-impl-for-builtin.ir +++ b/examples/expected/0400-protocols-impl-for-builtin.ir @@ -456,6 +456,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -467,15 +472,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -487,7 +488,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -545,6 +545,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -556,18 +567,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -575,9 +582,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -592,7 +597,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -605,7 +609,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -618,7 +621,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -639,12 +641,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -697,6 +697,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -716,11 +728,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -728,7 +738,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -743,19 +752,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -768,20 +773,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -817,7 +818,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -845,6 +845,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -868,7 +869,6 @@ while.hdr.211: ; preds = %if.merge.216, %entr while.body.212: ; preds = %while.hdr.211 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -909,6 +909,13 @@ if.merge.216: ; preds = %if.else.215, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -929,11 +936,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -950,11 +955,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -971,11 +974,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -988,7 +989,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1010,6 +1010,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1021,40 +1028,33 @@ if.then.209: ; preds = %entry if.merge.210: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.217 @@ -1165,6 +1165,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1247,7 +1253,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1267,7 +1272,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1276,7 +1280,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1303,7 +1306,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.157 [ i64 36, label %dispatch.case.158 i64 45, label %dispatch.case.159 @@ -1313,7 +1315,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.171 [ i64 37, label %dispatch.case.172 i64 43, label %dispatch.case.173 @@ -1323,7 +1324,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.185 [ i64 18, label %dispatch.case.186 i64 23, label %dispatch.case.187 @@ -2195,6 +2195,8 @@ fv.case17: ; preds = %if.merge.110 define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.112, i64 15 }, { ptr, i64 } { ptr @str.113, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2259,7 +2261,6 @@ fv.default: ; preds = %if.merge.115 fv.case: ; preds = %if.merge.115 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2279,7 +2280,6 @@ fv.case20: ; preds = %if.merge.115 fv.case24: ; preds = %if.merge.115 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2574,6 +2574,7 @@ fv.case17: ; preds = %if.merge.135 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.152, i64 5 }, { ptr, i64 } { ptr @str.153, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2648,7 +2649,6 @@ fv.case17: ; preds = %if.merge.140 fv.case20: ; preds = %if.merge.140 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 21, i64 undef }, i64 %ba.p2i, 1 @@ -2741,6 +2741,7 @@ fv.case20: ; preds = %if.merge.145 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.170, i64 17 }, { ptr, i64 } { ptr @str.171, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2805,7 +2806,6 @@ fv.default: ; preds = %if.merge.150 fv.case: ; preds = %if.merge.150 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 21, i64 undef }, i64 %ba.p2i, 1 @@ -2831,6 +2831,7 @@ fv.case23: ; preds = %if.merge.150 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.180, i64 7 }, { ptr, i64 } { ptr @str.181, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2893,7 +2894,6 @@ fv.default: ; preds = %if.merge.155 fv.case: ; preds = %if.merge.155 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 21, i64 undef }, i64 %ba.p2i, 1 @@ -2910,6 +2910,7 @@ fv.case17: ; preds = %if.merge.155 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.188, i64 1 }, ptr %allocaN, align 8 @@ -2942,7 +2943,6 @@ if.merge.164: ; preds = %if.then.163, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2960,6 +2960,8 @@ if.merge.164: ; preds = %if.then.163, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.191, i64 1 }, ptr %allocaN, align 8 @@ -2992,11 +2994,9 @@ if.merge.169: ; preds = %if.then.168, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3013,6 +3013,7 @@ if.merge.169: ; preds = %if.then.168, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.194, i64 1 }, ptr %allocaN, align 8 @@ -3050,7 +3051,6 @@ if.merge.178: ; preds = %if.then.177, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3067,6 +3067,7 @@ if.merge.178: ; preds = %if.then.177, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.197, i64 1 }, ptr %allocaN, align 8 @@ -3104,7 +3105,6 @@ if.merge.183: ; preds = %if.then.182, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0413-protocols-parameterized-protocol-value.ir b/examples/expected/0413-protocols-parameterized-protocol-value.ir index b2e672c..5744d00 100644 --- a/examples/expected/0413-protocols-parameterized-protocol-value.ir +++ b/examples/expected/0413-protocols-parameterized-protocol-value.ir @@ -458,6 +458,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -469,15 +474,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -489,7 +490,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -547,6 +547,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -558,18 +569,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -577,9 +584,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -594,7 +599,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -607,7 +611,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -620,7 +623,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -641,12 +643,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -699,6 +699,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -718,11 +730,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -730,7 +740,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -745,19 +754,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -770,20 +775,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -819,7 +820,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -847,6 +847,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -870,7 +871,6 @@ while.hdr.246: ; preds = %if.merge.251, %entr while.body.247: ; preds = %while.hdr.246 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -911,6 +911,13 @@ if.merge.251: ; preds = %if.else.250, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -931,11 +938,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -952,11 +957,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -973,11 +976,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -990,7 +991,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1012,6 +1012,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1023,40 +1030,33 @@ if.then.244: ; preds = %entry if.merge.245: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.252 @@ -1167,6 +1167,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1259,7 +1265,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1279,7 +1284,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1288,7 +1292,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1320,7 +1323,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.187 [ i64 35, label %dispatch.case.188 i64 52, label %dispatch.case.189 @@ -1330,7 +1332,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.201 [ i64 36, label %dispatch.case.202 i64 50, label %dispatch.case.203 @@ -1340,7 +1341,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.215 [ i64 18, label %dispatch.case.216 i64 22, label %dispatch.case.217 @@ -2282,6 +2282,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.121, i64 15 }, { ptr, i64 } { ptr @str.122, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2346,7 +2348,6 @@ fv.default: ; preds = %if.merge.115 fv.case: ; preds = %if.merge.115 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2366,7 +2367,6 @@ fv.case20: ; preds = %if.merge.115 fv.case24: ; preds = %if.merge.115 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2661,6 +2661,7 @@ fv.case17: ; preds = %if.merge.135 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.159, i64 5 }, { ptr, i64 } { ptr @str.160, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2735,7 +2736,6 @@ fv.case17: ; preds = %if.merge.140 fv.case20: ; preds = %if.merge.140 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2828,6 +2828,7 @@ fv.case20: ; preds = %if.merge.145 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.177, i64 17 }, { ptr, i64 } { ptr @str.178, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2892,7 +2893,6 @@ fv.default: ; preds = %if.merge.150 fv.case: ; preds = %if.merge.150 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2918,6 +2918,7 @@ fv.case23: ; preds = %if.merge.150 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.187, i64 7 }, { ptr, i64 } { ptr @str.188, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2980,7 +2981,6 @@ fv.default: ; preds = %if.merge.155 fv.case: ; preds = %if.merge.155 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3066,6 +3066,7 @@ fv.case: ; preds = %if.merge.160 define internal { ptr, i64 } @struct_to_string__StrCell(ptr %0, { { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.202, i64 7 }, { ptr, i64 } { ptr @str.203, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3127,7 +3128,6 @@ fv.default: ; preds = %if.merge.165 fv.case: ; preds = %if.merge.165 %fv.field = extractvalue { { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3432,6 +3432,7 @@ fv.case: ; preds = %if.merge.185 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.239, i64 1 }, ptr %allocaN, align 8 @@ -3464,7 +3465,6 @@ if.merge.194: ; preds = %if.then.193, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3482,6 +3482,8 @@ if.merge.194: ; preds = %if.then.193, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.242, i64 1 }, ptr %allocaN, align 8 @@ -3514,11 +3516,9 @@ if.merge.199: ; preds = %if.then.198, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3535,6 +3535,7 @@ if.merge.199: ; preds = %if.then.198, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.245, i64 1 }, ptr %allocaN, align 8 @@ -3572,7 +3573,6 @@ if.merge.208: ; preds = %if.then.207, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3589,6 +3589,7 @@ if.merge.208: ; preds = %if.then.207, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.248, i64 1 }, ptr %allocaN, align 8 @@ -3626,7 +3627,6 @@ if.merge.213: ; preds = %if.then.212, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0414-protocols-generic-struct-protocol-erase.ir b/examples/expected/0414-protocols-generic-struct-protocol-erase.ir index 3f9e0d9..6c93e30 100644 --- a/examples/expected/0414-protocols-generic-struct-protocol-erase.ir +++ b/examples/expected/0414-protocols-generic-struct-protocol-erase.ir @@ -463,6 +463,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -474,15 +479,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -494,7 +495,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -552,6 +552,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -563,18 +574,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -582,9 +589,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -599,7 +604,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -612,7 +616,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -625,7 +628,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -646,12 +648,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -704,6 +704,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -723,11 +735,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -735,7 +745,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -750,19 +759,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -775,20 +780,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -824,7 +825,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -852,6 +852,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -875,7 +876,6 @@ while.hdr.257: ; preds = %if.merge.262, %entr while.body.258: ; preds = %while.hdr.257 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -916,6 +916,13 @@ if.merge.262: ; preds = %if.else.261, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -936,11 +943,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -957,11 +962,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -978,11 +981,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -995,7 +996,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1017,6 +1017,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1028,40 +1035,33 @@ if.then.255: ; preds = %entry if.merge.256: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.263 @@ -1172,6 +1172,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1265,7 +1271,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1285,7 +1290,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1294,7 +1298,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1327,7 +1330,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.193 [ i64 35, label %dispatch.case.194 i64 50, label %dispatch.case.195 @@ -1337,7 +1339,6 @@ match.arm.48: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.207 [ i64 36, label %dispatch.case.208 i64 44, label %dispatch.case.209 @@ -1348,7 +1349,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.227 [ i64 18, label %dispatch.case.228 i64 22, label %dispatch.case.229 @@ -2247,6 +2247,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.122, i64 15 }, { ptr, i64 } { ptr @str.123, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2311,7 +2313,6 @@ fv.default: ; preds = %if.merge.116 fv.case: ; preds = %if.merge.116 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2331,7 +2332,6 @@ fv.case20: ; preds = %if.merge.116 fv.case24: ; preds = %if.merge.116 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2626,6 +2626,7 @@ fv.case17: ; preds = %if.merge.136 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.160, i64 5 }, { ptr, i64 } { ptr @str.161, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2700,7 +2701,6 @@ fv.case17: ; preds = %if.merge.141 fv.case20: ; preds = %if.merge.141 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2793,6 +2793,7 @@ fv.case20: ; preds = %if.merge.146 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.178, i64 17 }, { ptr, i64 } { ptr @str.179, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2857,7 +2858,6 @@ fv.default: ; preds = %if.merge.151 fv.case: ; preds = %if.merge.151 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2883,6 +2883,7 @@ fv.case23: ; preds = %if.merge.151 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.188, i64 7 }, { ptr, i64 } { ptr @str.189, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2945,7 +2946,6 @@ fv.default: ; preds = %if.merge.156 fv.case: ; preds = %if.merge.156 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3343,6 +3343,7 @@ if.merge.186: ; preds = %if.then.185, %while define internal { ptr, i64 } @struct_to_string__Combined__s64__s64(ptr %0, { { { ptr, ptr } }, i64 } %1) #0 { entry: %alloca = alloca { { { ptr, ptr } }, i64 }, align 8 + %ba.tmp = alloca { { ptr, ptr } }, align 8 store { { { ptr, ptr } }, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.236, i64 18 }, { ptr, i64 } { ptr @str.237, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3405,7 +3406,6 @@ fv.default: ; preds = %if.merge.191 fv.case: ; preds = %if.merge.191 %fv.field = extractvalue { { { ptr, ptr } }, i64 } %loadN, 0 - %ba.tmp = alloca { { ptr, ptr } }, align 8 store { { ptr, ptr } } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 53, i64 undef }, i64 %ba.p2i, 1 @@ -3421,6 +3421,7 @@ fv.case17: ; preds = %if.merge.191 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.244, i64 1 }, ptr %allocaN, align 8 @@ -3453,7 +3454,6 @@ if.merge.200: ; preds = %if.then.199, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3471,6 +3471,8 @@ if.merge.200: ; preds = %if.then.199, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.247, i64 1 }, ptr %allocaN, align 8 @@ -3503,11 +3505,9 @@ if.merge.205: ; preds = %if.then.204, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3524,6 +3524,7 @@ if.merge.205: ; preds = %if.then.204, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.250, i64 1 }, ptr %allocaN, align 8 @@ -3561,7 +3562,6 @@ if.merge.215: ; preds = %if.then.214, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3578,6 +3578,7 @@ if.merge.215: ; preds = %if.then.214, %while define internal { ptr, i64 } @slice_to_string__VL(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca {}, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.253, i64 1 }, ptr %allocaN, align 8 @@ -3615,7 +3616,6 @@ if.merge.220: ; preds = %if.then.219, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr {}, ptr %ig.data, i64 %loadN %ig.val = load {}, ptr %ig.ptr, align 1 - %ba.tmp = alloca {}, align 8 store {} %ig.val, ptr %ba.tmp, align 1 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 43, i64 undef }, i64 %ba.p2i, 1 @@ -3632,6 +3632,7 @@ if.merge.220: ; preds = %if.then.219, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.256, i64 1 }, ptr %allocaN, align 8 @@ -3669,7 +3670,6 @@ if.merge.225: ; preds = %if.then.224, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0416-protocols-auto-type-erasure.ir b/examples/expected/0416-protocols-auto-type-erasure.ir index f148656..f940fb8 100644 --- a/examples/expected/0416-protocols-auto-type-erasure.ir +++ b/examples/expected/0416-protocols-auto-type-erasure.ir @@ -532,6 +532,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -543,15 +548,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -563,7 +564,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -621,6 +621,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -632,18 +643,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -651,9 +658,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -668,7 +673,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -681,7 +685,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -694,7 +697,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -715,12 +717,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -773,6 +773,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -792,11 +804,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -804,7 +814,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -819,19 +828,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -844,20 +849,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -893,7 +894,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -921,6 +921,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -944,7 +945,6 @@ while.hdr.273: ; preds = %if.merge.278, %entr while.body.274: ; preds = %while.hdr.273 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -985,6 +985,13 @@ if.merge.278: ; preds = %if.else.277, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -1005,11 +1012,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1026,11 +1031,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1047,11 +1050,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1064,7 +1065,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1086,6 +1086,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1097,40 +1104,33 @@ if.then.271: ; preds = %entry if.merge.272: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.279 @@ -1241,6 +1241,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.41, i64 3 }, ptr %allocaN, align 8 @@ -1339,7 +1346,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1359,7 +1365,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1368,7 +1373,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1394,7 +1398,6 @@ match.arm.44: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.205 [ i64 37, label %dispatch.case.206 i64 38, label %dispatch.case.207 @@ -1410,7 +1413,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.213 [ i64 35, label %dispatch.case.214 i64 65, label %dispatch.case.215 @@ -1420,7 +1422,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.227 [ i64 36, label %dispatch.case.228 i64 56, label %dispatch.case.229 @@ -1430,7 +1431,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.241 [ i64 18, label %dispatch.case.242 i64 22, label %dispatch.case.243 @@ -3021,6 +3021,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.182, i64 15 }, { ptr, i64 } { ptr @str.183, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3085,7 +3087,6 @@ fv.default: ; preds = %if.merge.118 fv.case: ; preds = %if.merge.118 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3105,7 +3106,6 @@ fv.case20: ; preds = %if.merge.118 fv.case24: ; preds = %if.merge.118 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -3400,6 +3400,7 @@ fv.case17: ; preds = %if.merge.138 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.220, i64 5 }, { ptr, i64 } { ptr @str.221, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3474,7 +3475,6 @@ fv.case17: ; preds = %if.merge.143 fv.case20: ; preds = %if.merge.143 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3567,6 +3567,7 @@ fv.case20: ; preds = %if.merge.148 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.238, i64 17 }, { ptr, i64 } { ptr @str.239, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3631,7 +3632,6 @@ fv.default: ; preds = %if.merge.153 fv.case: ; preds = %if.merge.153 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3657,6 +3657,7 @@ fv.case23: ; preds = %if.merge.153 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.248, i64 7 }, { ptr, i64 } { ptr @str.249, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3719,7 +3720,6 @@ fv.default: ; preds = %if.merge.158 fv.case: ; preds = %if.merge.158 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -4475,6 +4475,7 @@ if.merge.211: ; preds = %if.then.210, %entry define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.344, i64 1 }, ptr %allocaN, align 8 @@ -4507,7 +4508,6 @@ if.merge.220: ; preds = %if.then.219, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -4525,6 +4525,8 @@ if.merge.220: ; preds = %if.then.219, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.347, i64 1 }, ptr %allocaN, align 8 @@ -4557,11 +4559,9 @@ if.merge.225: ; preds = %if.then.224, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -4578,6 +4578,7 @@ if.merge.225: ; preds = %if.then.224, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.350, i64 1 }, ptr %allocaN, align 8 @@ -4615,7 +4616,6 @@ if.merge.234: ; preds = %if.then.233, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -4632,6 +4632,7 @@ if.merge.234: ; preds = %if.then.233, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.353, i64 1 }, ptr %allocaN, align 8 @@ -4669,7 +4670,6 @@ if.merge.239: ; preds = %if.then.238, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0507-packs-pack-mono-dedup.ir b/examples/expected/0507-packs-pack-mono-dedup.ir index 3ba37e7..b4a27b2 100644 --- a/examples/expected/0507-packs-pack-mono-dedup.ir +++ b/examples/expected/0507-packs-pack-mono-dedup.ir @@ -392,6 +392,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -403,15 +408,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -423,7 +424,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -481,6 +481,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -492,18 +503,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -511,9 +518,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -528,7 +533,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -541,7 +545,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -554,7 +557,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -575,12 +577,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -633,6 +633,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -652,11 +664,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -664,7 +674,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -679,19 +688,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -704,20 +709,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -753,7 +754,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -781,6 +781,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -804,7 +805,6 @@ while.hdr.223: ; preds = %if.merge.228, %entr while.body.224: ; preds = %while.hdr.223 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -845,6 +845,13 @@ if.merge.228: ; preds = %if.else.227, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -865,11 +872,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -886,11 +891,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -907,11 +910,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -924,7 +925,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -946,6 +946,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -957,40 +964,33 @@ if.then.221: ; preds = %entry if.merge.222: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.229 @@ -1101,6 +1101,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1185,7 +1191,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1205,7 +1210,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1214,7 +1218,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1240,7 +1243,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 43, label %dispatch.case.153 @@ -1253,7 +1255,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.183 [ i64 36, label %dispatch.case.184 i64 40, label %dispatch.case.185 @@ -1263,7 +1264,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.197 [ i64 18, label %dispatch.case.198 i64 22, label %dispatch.case.199 @@ -2185,6 +2185,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.107, i64 15 }, { ptr, i64 } { ptr @str.108, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2249,7 +2251,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2269,7 +2270,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2564,6 +2564,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.145, i64 5 }, { ptr, i64 } { ptr @str.146, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2638,7 +2639,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2731,6 +2731,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.163, i64 17 }, { ptr, i64 } { ptr @str.164, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2795,7 +2796,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2821,6 +2821,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.173, i64 7 }, { ptr, i64 } { ptr @str.174, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2883,7 +2884,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2900,6 +2900,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.181, i64 1 }, ptr %allocaN, align 8 @@ -2932,7 +2933,6 @@ if.merge.161: ; preds = %if.then.160, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2950,6 +2950,8 @@ if.merge.161: ; preds = %if.then.160, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.184, i64 1 }, ptr %allocaN, align 8 @@ -2982,11 +2984,9 @@ if.merge.166: ; preds = %if.then.165, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3003,6 +3003,8 @@ if.merge.166: ; preds = %if.then.165, %while define internal { ptr, i64 } @array_to_string__AR_3_Any(ptr %0, [3 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 + %ig.tmp = alloca [3 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [3 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.187, i64 1 }, ptr %allocaN, align 8 @@ -3035,11 +3037,9 @@ if.merge.171: ; preds = %if.then.170, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [3 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3056,6 +3056,8 @@ if.merge.171: ; preds = %if.then.170, %while define internal { ptr, i64 } @array_to_string__AR_2_Any(ptr %0, [2 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [2 x { i64, i64 }], align 8 + %ig.tmp = alloca [2 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [2 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.190, i64 1 }, ptr %allocaN, align 8 @@ -3088,11 +3090,9 @@ if.merge.176: ; preds = %if.then.175, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [2 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [2 x { i64, i64 }], align 8 store [2 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [2 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3109,6 +3109,8 @@ if.merge.176: ; preds = %if.then.175, %while define internal { ptr, i64 } @array_to_string__AR_5_Any(ptr %0, [5 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [5 x { i64, i64 }], align 8 + %ig.tmp = alloca [5 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [5 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.193, i64 1 }, ptr %allocaN, align 8 @@ -3141,11 +3143,9 @@ if.merge.181: ; preds = %if.then.180, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [5 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [5 x { i64, i64 }], align 8 store [5 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [5 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3162,6 +3162,7 @@ if.merge.181: ; preds = %if.then.180, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.196, i64 1 }, ptr %allocaN, align 8 @@ -3199,7 +3200,6 @@ if.merge.190: ; preds = %if.then.189, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3216,6 +3216,7 @@ if.merge.190: ; preds = %if.then.189, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.199, i64 1 }, ptr %allocaN, align 8 @@ -3253,7 +3254,6 @@ if.merge.195: ; preds = %if.then.194, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0513-packs-pack-mixed-comptime.ir b/examples/expected/0513-packs-pack-mixed-comptime.ir index b8e9f89..4aaea75 100644 --- a/examples/expected/0513-packs-pack-mixed-comptime.ir +++ b/examples/expected/0513-packs-pack-mixed-comptime.ir @@ -373,6 +373,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -384,15 +389,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -404,7 +405,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -462,6 +462,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -473,18 +484,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -492,9 +499,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -509,7 +514,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -522,7 +526,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -535,7 +538,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -556,12 +558,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -614,6 +614,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -633,11 +645,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -645,7 +655,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -660,19 +669,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -685,20 +690,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -734,7 +735,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -762,6 +762,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -785,7 +786,6 @@ while.hdr.209: ; preds = %if.merge.214, %entr while.body.210: ; preds = %while.hdr.209 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -826,6 +826,13 @@ if.merge.214: ; preds = %if.else.213, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -846,11 +853,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -867,11 +872,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -888,11 +891,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -905,7 +906,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -927,6 +927,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -938,40 +945,33 @@ if.then.207: ; preds = %entry if.merge.208: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.215 @@ -1082,6 +1082,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1162,7 +1168,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1182,7 +1187,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1191,7 +1195,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1217,7 +1220,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 42, label %dispatch.case.153 @@ -1228,7 +1230,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.171 [ i64 36, label %dispatch.case.172 i64 40, label %dispatch.case.173 @@ -1238,7 +1239,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.185 [ i64 18, label %dispatch.case.186 i64 22, label %dispatch.case.187 @@ -2005,6 +2005,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.100, i64 15 }, { ptr, i64 } { ptr @str.101, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2069,7 +2071,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2089,7 +2090,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2384,6 +2384,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.138, i64 5 }, { ptr, i64 } { ptr @str.139, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2458,7 +2459,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2551,6 +2551,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.156, i64 17 }, { ptr, i64 } { ptr @str.157, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2615,7 +2616,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2641,6 +2641,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.166, i64 7 }, { ptr, i64 } { ptr @str.167, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2703,7 +2704,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2720,6 +2720,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.174, i64 1 }, ptr %allocaN, align 8 @@ -2752,7 +2753,6 @@ if.merge.159: ; preds = %if.then.158, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2770,6 +2770,8 @@ if.merge.159: ; preds = %if.then.158, %while define internal { ptr, i64 } @array_to_string__AR_3_Any(ptr %0, [3 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 + %ig.tmp = alloca [3 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [3 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.177, i64 1 }, ptr %allocaN, align 8 @@ -2802,11 +2804,9 @@ if.merge.164: ; preds = %if.then.163, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [3 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2823,6 +2823,8 @@ if.merge.164: ; preds = %if.then.163, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.180, i64 1 }, ptr %allocaN, align 8 @@ -2855,11 +2857,9 @@ if.merge.169: ; preds = %if.then.168, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2876,6 +2876,7 @@ if.merge.169: ; preds = %if.then.168, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.183, i64 1 }, ptr %allocaN, align 8 @@ -2913,7 +2914,6 @@ if.merge.178: ; preds = %if.then.177, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2930,6 +2930,7 @@ if.merge.178: ; preds = %if.then.177, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.186, i64 1 }, ptr %allocaN, align 8 @@ -2967,7 +2968,6 @@ if.merge.183: ; preds = %if.then.182, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0518-packs-pack-value-dispatch.ir b/examples/expected/0518-packs-pack-value-dispatch.ir index 465fcab..734785a 100644 --- a/examples/expected/0518-packs-pack-value-dispatch.ir +++ b/examples/expected/0518-packs-pack-value-dispatch.ir @@ -377,6 +377,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -388,15 +393,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -408,7 +409,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -466,6 +466,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -477,18 +488,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -496,9 +503,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -513,7 +518,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -526,7 +530,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -539,7 +542,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -560,12 +562,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -618,6 +618,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -637,11 +649,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -649,7 +659,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -664,19 +673,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -689,20 +694,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -738,7 +739,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -766,6 +766,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -789,7 +790,6 @@ while.hdr.203: ; preds = %if.merge.208, %entr while.body.204: ; preds = %while.hdr.203 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -830,6 +830,13 @@ if.merge.208: ; preds = %if.else.207, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -850,11 +857,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -871,11 +876,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -892,11 +895,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -909,7 +910,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -931,6 +931,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -942,40 +949,33 @@ if.then.201: ; preds = %entry if.merge.202: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.209 @@ -1086,6 +1086,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1165,7 +1171,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1185,7 +1190,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1194,7 +1198,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1220,7 +1223,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.151 [ i64 35, label %dispatch.case.152 i64 42, label %dispatch.case.153 @@ -1230,7 +1232,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.165 [ i64 36, label %dispatch.case.166 i64 40, label %dispatch.case.167 @@ -1240,7 +1241,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.179 [ i64 18, label %dispatch.case.180 i64 22, label %dispatch.case.181 @@ -2105,6 +2105,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.107, i64 15 }, { ptr, i64 } { ptr @str.108, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2169,7 +2171,6 @@ fv.default: ; preds = %if.merge.109 fv.case: ; preds = %if.merge.109 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2189,7 +2190,6 @@ fv.case20: ; preds = %if.merge.109 fv.case24: ; preds = %if.merge.109 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2484,6 +2484,7 @@ fv.case17: ; preds = %if.merge.129 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.145, i64 5 }, { ptr, i64 } { ptr @str.146, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2558,7 +2559,6 @@ fv.case17: ; preds = %if.merge.134 fv.case20: ; preds = %if.merge.134 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2651,6 +2651,7 @@ fv.case20: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.163, i64 17 }, { ptr, i64 } { ptr @str.164, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2715,7 +2716,6 @@ fv.default: ; preds = %if.merge.144 fv.case: ; preds = %if.merge.144 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2741,6 +2741,7 @@ fv.case23: ; preds = %if.merge.144 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.173, i64 7 }, { ptr, i64 } { ptr @str.174, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2803,7 +2804,6 @@ fv.default: ; preds = %if.merge.149 fv.case: ; preds = %if.merge.149 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2820,6 +2820,7 @@ fv.case17: ; preds = %if.merge.149 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.181, i64 1 }, ptr %allocaN, align 8 @@ -2852,7 +2853,6 @@ if.merge.158: ; preds = %if.then.157, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2870,6 +2870,8 @@ if.merge.158: ; preds = %if.then.157, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.184, i64 1 }, ptr %allocaN, align 8 @@ -2902,11 +2904,9 @@ if.merge.163: ; preds = %if.then.162, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2923,6 +2923,7 @@ if.merge.163: ; preds = %if.then.162, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.187, i64 1 }, ptr %allocaN, align 8 @@ -2960,7 +2961,6 @@ if.merge.172: ; preds = %if.then.171, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2977,6 +2977,7 @@ if.merge.172: ; preds = %if.then.171, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.190, i64 1 }, ptr %allocaN, align 8 @@ -3014,7 +3015,6 @@ if.merge.177: ; preds = %if.then.176, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0528-packs-protocol-pack-methods.ir b/examples/expected/0528-packs-protocol-pack-methods.ir index ccffde8..e8c5d1e 100644 --- a/examples/expected/0528-packs-protocol-pack-methods.ir +++ b/examples/expected/0528-packs-protocol-pack-methods.ir @@ -437,6 +437,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -448,15 +453,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -468,7 +469,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -526,6 +526,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -537,18 +548,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -556,9 +563,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -573,7 +578,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -586,7 +590,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -599,7 +602,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -620,12 +622,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -678,6 +678,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -697,11 +709,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -709,7 +719,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -724,19 +733,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -749,20 +754,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -798,7 +799,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -826,6 +826,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -849,7 +850,6 @@ while.hdr.243: ; preds = %if.merge.248, %entr while.body.244: ; preds = %while.hdr.243 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -890,6 +890,13 @@ if.merge.248: ; preds = %if.else.247, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -910,11 +917,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -931,11 +936,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -952,11 +955,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -969,7 +970,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -991,6 +991,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1002,40 +1009,33 @@ if.then.241: ; preds = %entry if.merge.242: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.249 @@ -1146,6 +1146,12 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1235,7 +1241,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1255,7 +1260,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1264,7 +1268,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1294,7 +1297,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.175 [ i64 35, label %dispatch.case.176 i64 49, label %dispatch.case.177 @@ -1305,7 +1307,6 @@ match.arm.48: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.195 [ i64 36, label %dispatch.case.196 i64 43, label %dispatch.case.197 @@ -1316,7 +1317,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.215 [ i64 18, label %dispatch.case.216 i64 22, label %dispatch.case.217 @@ -2365,6 +2365,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.120, i64 15 }, { ptr, i64 } { ptr @str.121, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2429,7 +2431,6 @@ fv.default: ; preds = %if.merge.113 fv.case: ; preds = %if.merge.113 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2449,7 +2450,6 @@ fv.case20: ; preds = %if.merge.113 fv.case24: ; preds = %if.merge.113 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2744,6 +2744,7 @@ fv.case17: ; preds = %if.merge.133 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.158, i64 5 }, { ptr, i64 } { ptr @str.159, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2818,7 +2819,6 @@ fv.case17: ; preds = %if.merge.138 fv.case20: ; preds = %if.merge.138 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2911,6 +2911,7 @@ fv.case20: ; preds = %if.merge.143 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.176, i64 17 }, { ptr, i64 } { ptr @str.177, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2975,7 +2976,6 @@ fv.default: ; preds = %if.merge.148 fv.case: ; preds = %if.merge.148 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3001,6 +3001,7 @@ fv.case23: ; preds = %if.merge.148 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.186, i64 7 }, { ptr, i64 } { ptr @str.187, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3063,7 +3064,6 @@ fv.default: ; preds = %if.merge.153 fv.case: ; preds = %if.merge.153 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3365,6 +3365,7 @@ fv.case: ; preds = %if.merge.173 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.223, i64 1 }, ptr %allocaN, align 8 @@ -3397,7 +3398,6 @@ if.merge.183: ; preds = %if.then.182, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3415,6 +3415,8 @@ if.merge.183: ; preds = %if.then.182, %while define internal { ptr, i64 } @array_to_string__AR_2_Any(ptr %0, [2 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [2 x { i64, i64 }], align 8 + %ig.tmp = alloca [2 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [2 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.226, i64 1 }, ptr %allocaN, align 8 @@ -3447,11 +3449,9 @@ if.merge.188: ; preds = %if.then.187, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [2 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [2 x { i64, i64 }], align 8 store [2 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [2 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3468,6 +3468,8 @@ if.merge.188: ; preds = %if.then.187, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.229, i64 1 }, ptr %allocaN, align 8 @@ -3500,11 +3502,9 @@ if.merge.193: ; preds = %if.then.192, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3521,6 +3521,7 @@ if.merge.193: ; preds = %if.then.192, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.232, i64 1 }, ptr %allocaN, align 8 @@ -3558,7 +3559,6 @@ if.merge.203: ; preds = %if.then.202, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3575,6 +3575,7 @@ if.merge.203: ; preds = %if.then.202, %while define internal { ptr, i64 } @slice_to_string__Greeter(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.235, i64 1 }, ptr %allocaN, align 8 @@ -3612,7 +3613,6 @@ if.merge.208: ; preds = %if.then.207, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, ptr }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, ptr }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, ptr }, align 8 store { ptr, ptr } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 37, i64 undef }, i64 %ba.p2i, 1 @@ -3629,6 +3629,7 @@ if.merge.208: ; preds = %if.then.207, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.238, i64 1 }, ptr %allocaN, align 8 @@ -3666,7 +3667,6 @@ if.merge.213: ; preds = %if.then.212, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0903-optionals-optional-roundtrip.ir b/examples/expected/0903-optionals-optional-roundtrip.ir index af13535..9166f49 100644 --- a/examples/expected/0903-optionals-optional-roundtrip.ir +++ b/examples/expected/0903-optionals-optional-roundtrip.ir @@ -462,6 +462,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -473,15 +478,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -493,7 +494,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -551,6 +551,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -562,18 +573,14 @@ if.then.68: ; preds = %entry if.merge.69: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.78 while.hdr.78: ; preds = %while.exit.89, %if.merge.69 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -581,9 +588,7 @@ while.hdr.78: ; preds = %while.exit.89, %if. br i1 %icmpN, label %or.merge.82, label %or.rhs.81 while.body.79: ; preds = %or.merge.86 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.87 @@ -598,7 +603,6 @@ while.exit.80: ; preds = %or.merge.86 or.rhs.81: ; preds = %while.hdr.78 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -611,7 +615,6 @@ or.merge.82: ; preds = %or.rhs.81, %while.h or.rhs.83: ; preds = %or.merge.82 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -624,7 +627,6 @@ or.merge.84: ; preds = %or.rhs.83, %or.merg or.rhs.85: ; preds = %or.merge.84 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -645,12 +647,10 @@ while.body.88: ; preds = %while.hdr.87 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -703,6 +703,18 @@ if.merge.92: ; preds = %if.else.91, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -722,11 +734,9 @@ if.else.97: ; preds = %entry if.merge.98: ; preds = %if.else.97, %if.then.96 %bp = phi double [ %fsub, %if.then.96 ], [ %loadN, %if.else.97 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -734,7 +744,6 @@ if.merge.98: ; preds = %if.else.97, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -749,19 +758,15 @@ if.then.99: ; preds = %if.merge.98 if.merge.100: ; preds = %if.then.99, %if.merge.98 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.101, label %if.else.102 @@ -774,20 +779,16 @@ if.else.102: ; preds = %if.merge.100 if.merge.103: ; preds = %if.else.102, %if.then.101 %bpN = phi i64 [ 1, %if.then.101 ], [ 0, %if.else.102 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.104, label %if.merge.105 @@ -823,7 +824,6 @@ if.merge.105: ; preds = %if.then.104, %if.me store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -851,6 +851,7 @@ if.merge.105: ; preds = %if.then.104, %if.me define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -874,7 +875,6 @@ while.hdr.245: ; preds = %if.merge.250, %entr while.body.246: ; preds = %while.hdr.245 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -915,6 +915,13 @@ if.merge.250: ; preds = %if.else.249, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -935,11 +942,9 @@ if.merge.71: ; preds = %if.then.70, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -956,11 +961,9 @@ if.merge.73: ; preds = %if.then.72, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -977,11 +980,9 @@ if.merge.75: ; preds = %if.then.74, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -994,7 +995,6 @@ if.then.76: ; preds = %if.merge.75 br label %if.merge.77 if.merge.77: ; preds = %if.then.76, %if.merge.75 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1016,6 +1016,13 @@ if.merge.77: ; preds = %if.then.76, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1027,40 +1034,33 @@ if.then.243: ; preds = %entry if.merge.244: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.251 @@ -1171,6 +1171,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1261,7 +1268,6 @@ match.arm.51: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.65, label %if.else.66 match.arm.52: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1281,7 +1287,6 @@ match.arm.53: ; preds = %entry match.arm.54: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.93, label %fN.unbox.94 @@ -1290,7 +1295,6 @@ match.arm.55: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.107 [ i64 19, label %dispatch.case.108 i64 20, label %dispatch.case.109 @@ -1320,7 +1324,6 @@ match.arm.59: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.187 [ i64 35, label %dispatch.case.188 i64 55, label %dispatch.case.189 @@ -1330,7 +1333,6 @@ match.arm.60: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.201 [ i64 36, label %dispatch.case.202 i64 47, label %dispatch.case.203 @@ -1340,7 +1342,6 @@ match.arm.61: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.215 [ i64 18, label %dispatch.case.216 i64 22, label %dispatch.case.217 @@ -1372,7 +1373,6 @@ match.arm.62: ; preds = %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.326 [ i64 37, label %dispatch.case.327 ] @@ -2081,6 +2081,10 @@ if.merge.36: ; preds = %if.then.35, %while. define internal float @direct_size(ptr %0, { { float, i1 }, { float, i1 } } %1) #0 { entry: %alloca = alloca { { float, i1 }, { float, i1 } }, align 8 + %allocaN = alloca float, align 4 + %allocaN = alloca double, align 8 + %allocaN = alloca float, align 4 + %allocaN = alloca double, align 8 store { { float, i1 }, { float, i1 } } %1, ptr %alloca, align 4 %load = load { { float, i1 }, { float, i1 } }, ptr %alloca, align 4 %sg = extractvalue { { float, i1 }, { float, i1 } } %load, 0 @@ -2089,7 +2093,6 @@ entry: if.then.37: ; preds = %entry %ou.val = extractvalue { float, i1 } %sg, 0 - %allocaN = alloca float, align 4 store float %ou.val, ptr %allocaN, align 4 %loadN = load float, ptr %allocaN, align 4 %fpext = fpext float %loadN to double @@ -2100,7 +2103,6 @@ if.else.38: ; preds = %entry if.merge.39: ; preds = %if.else.38, %if.then.37 %bp = phi double [ %fpext, %if.then.37 ], [ 1.000000e+02, %if.else.38 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load { { float, i1 }, { float, i1 } }, ptr %alloca, align 4 %sgN = extractvalue { { float, i1 }, { float, i1 } } %loadN, 1 @@ -2109,7 +2111,6 @@ if.merge.39: ; preds = %if.else.38, %if.the if.then.40: ; preds = %if.merge.39 %ou.val7 = extractvalue { float, i1 } %sgN, 0 - %allocaN = alloca float, align 4 store float %ou.val7, ptr %allocaN, align 4 %loadN = load float, ptr %allocaN, align 4 %fpextN = fpext float %loadN to double @@ -2120,7 +2121,6 @@ if.else.41: ; preds = %if.merge.39 if.merge.42: ; preds = %if.else.41, %if.then.40 %bpN = phi double [ %fpextN, %if.then.40 ], [ 1.000000e+02, %if.else.41 ] - %allocaN = alloca double, align 8 store double %bpN, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 @@ -2133,6 +2133,10 @@ if.merge.42: ; preds = %if.else.41, %if.the define internal float @Widget.size(ptr %0, ptr %1, { { float, i1 }, { float, i1 } } %2) #0 { entry: %alloca = alloca ptr, align 8 + %allocaN = alloca float, align 4 + %allocaN = alloca double, align 8 + %allocaN = alloca float, align 4 + %allocaN = alloca double, align 8 store ptr %1, ptr %alloca, align 8 %allocaN = alloca { { float, i1 }, { float, i1 } }, align 8 store { { float, i1 }, { float, i1 } } %2, ptr %allocaN, align 4 @@ -2143,7 +2147,6 @@ entry: if.then.43: ; preds = %entry %ou.val = extractvalue { float, i1 } %sg, 0 - %allocaN = alloca float, align 4 store float %ou.val, ptr %allocaN, align 4 %loadN = load float, ptr %allocaN, align 4 %fpext = fpext float %loadN to double @@ -2154,7 +2157,6 @@ if.else.44: ; preds = %entry if.merge.45: ; preds = %if.else.44, %if.then.43 %bp = phi double [ %fpext, %if.then.43 ], [ 1.000000e+02, %if.else.44 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load { { float, i1 }, { float, i1 } }, ptr %allocaN, align 4 %sgN = extractvalue { { float, i1 }, { float, i1 } } %loadN, 1 @@ -2163,7 +2165,6 @@ if.merge.45: ; preds = %if.else.44, %if.the if.then.46: ; preds = %if.merge.45 %ou.val8 = extractvalue { float, i1 } %sgN, 0 - %allocaN = alloca float, align 4 store float %ou.val8, ptr %allocaN, align 4 %loadN = load float, ptr %allocaN, align 4 %fpextN = fpext float %loadN to double @@ -2174,7 +2175,6 @@ if.else.47: ; preds = %if.merge.45 if.merge.48: ; preds = %if.else.47, %if.then.46 %bpN = phi double [ %fpextN, %if.then.46 ], [ 1.000000e+02, %if.else.47 ] - %allocaN = alloca double, align 8 store double %bpN, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 @@ -2777,6 +2777,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.143, i64 15 }, { ptr, i64 } { ptr @str.144, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2841,7 +2843,6 @@ fv.default: ; preds = %if.merge.125 fv.case: ; preds = %if.merge.125 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2861,7 +2862,6 @@ fv.case20: ; preds = %if.merge.125 fv.case24: ; preds = %if.merge.125 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -3156,6 +3156,7 @@ fv.case17: ; preds = %if.merge.145 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.181, i64 5 }, { ptr, i64 } { ptr @str.182, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3230,7 +3231,6 @@ fv.case17: ; preds = %if.merge.150 fv.case20: ; preds = %if.merge.150 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3323,6 +3323,7 @@ fv.case20: ; preds = %if.merge.155 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.199, i64 17 }, { ptr, i64 } { ptr @str.200, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3387,7 +3388,6 @@ fv.default: ; preds = %if.merge.160 fv.case: ; preds = %if.merge.160 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3413,6 +3413,7 @@ fv.case23: ; preds = %if.merge.160 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.209, i64 7 }, { ptr, i64 } { ptr @str.210, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3475,7 +3476,6 @@ fv.default: ; preds = %if.merge.165 fv.case: ; preds = %if.merge.165 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3492,6 +3492,8 @@ fv.case17: ; preds = %if.merge.165 define internal { ptr, i64 } @struct_to_string__ProposedSize(ptr %0, { { float, i1 }, { float, i1 } } %1) #0 { entry: %alloca = alloca { { float, i1 }, { float, i1 } }, align 8 + %ba.tmp = alloca { float, i1 }, align 8 + %ba.tmp19 = alloca { float, i1 }, align 8 store { { float, i1 }, { float, i1 } } %1, ptr %alloca, align 4 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.217, i64 12 }, { ptr, i64 } { ptr @str.218, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3554,7 +3556,6 @@ fv.default: ; preds = %if.merge.170 fv.case: ; preds = %if.merge.170 %fv.field = extractvalue { { float, i1 }, { float, i1 } } %loadN, 0 - %ba.tmp = alloca { float, i1 }, align 8 store { float, i1 } %fv.field, ptr %ba.tmp, align 4 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 37, i64 undef }, i64 %ba.p2i, 1 @@ -3562,7 +3563,6 @@ fv.case: ; preds = %if.merge.170 fv.case17: ; preds = %if.merge.170 %fv.field18 = extractvalue { { float, i1 }, { float, i1 } } %loadN, 1 - %ba.tmp19 = alloca { float, i1 }, align 8 store { float, i1 } %fv.field18, ptr %ba.tmp19, align 4 %ba.p2i20 = ptrtoint ptr %ba.tmp19 to i64 %fv.val21 = insertvalue { i64, i64 } { i64 37, i64 undef }, i64 %ba.p2i20, 1 @@ -3775,6 +3775,7 @@ if.merge.185: ; preds = %if.then.184, %while define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.246, i64 1 }, ptr %allocaN, align 8 @@ -3807,7 +3808,6 @@ if.merge.194: ; preds = %if.then.193, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3825,6 +3825,8 @@ if.merge.194: ; preds = %if.then.193, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.249, i64 1 }, ptr %allocaN, align 8 @@ -3857,11 +3859,9 @@ if.merge.199: ; preds = %if.then.198, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3878,6 +3878,7 @@ if.merge.199: ; preds = %if.then.198, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.252, i64 1 }, ptr %allocaN, align 8 @@ -3915,7 +3916,6 @@ if.merge.208: ; preds = %if.then.207, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3932,6 +3932,7 @@ if.merge.208: ; preds = %if.then.207, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.255, i64 1 }, ptr %allocaN, align 8 @@ -3969,7 +3970,6 @@ if.merge.213: ; preds = %if.then.212, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/0904-optionals-any-to-string-optional.ir b/examples/expected/0904-optionals-any-to-string-optional.ir index e2a465f..6571adc 100644 --- a/examples/expected/0904-optionals-any-to-string-optional.ir +++ b/examples/expected/0904-optionals-any-to-string-optional.ir @@ -390,6 +390,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -401,15 +406,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -421,7 +422,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -479,6 +479,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -490,18 +501,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -509,9 +516,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -526,7 +531,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -539,7 +543,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -552,7 +555,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -573,12 +575,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -631,6 +631,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -650,11 +662,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -662,7 +672,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -677,19 +686,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -702,20 +707,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -751,7 +752,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -779,6 +779,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -802,7 +803,6 @@ while.hdr.209: ; preds = %if.merge.214, %entr while.body.210: ; preds = %while.hdr.209 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -843,6 +843,13 @@ if.merge.214: ; preds = %if.else.213, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -863,11 +870,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -884,11 +889,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -905,11 +908,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -922,7 +923,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -944,6 +944,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -955,40 +962,33 @@ if.then.207: ; preds = %entry if.merge.208: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.215 @@ -1099,6 +1099,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1182,7 +1189,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1202,7 +1208,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1211,7 +1216,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1238,7 +1242,6 @@ match.arm.47: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.157 [ i64 35, label %dispatch.case.158 i64 48, label %dispatch.case.159 @@ -1248,7 +1251,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.171 [ i64 36, label %dispatch.case.172 i64 46, label %dispatch.case.173 @@ -1258,7 +1260,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.185 [ i64 18, label %dispatch.case.186 i64 22, label %dispatch.case.187 @@ -1284,7 +1285,6 @@ match.arm.50: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.272 [ i64 37, label %dispatch.case.273 i64 38, label %dispatch.case.274 @@ -2024,6 +2024,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.108, i64 15 }, { ptr, i64 } { ptr @str.109, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2088,7 +2090,6 @@ fv.default: ; preds = %if.merge.110 fv.case: ; preds = %if.merge.110 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2108,7 +2109,6 @@ fv.case20: ; preds = %if.merge.110 fv.case24: ; preds = %if.merge.110 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2403,6 +2403,7 @@ fv.case17: ; preds = %if.merge.130 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.146, i64 5 }, { ptr, i64 } { ptr @str.147, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2477,7 +2478,6 @@ fv.case17: ; preds = %if.merge.135 fv.case20: ; preds = %if.merge.135 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2570,6 +2570,7 @@ fv.case20: ; preds = %if.merge.140 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.164, i64 17 }, { ptr, i64 } { ptr @str.165, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2634,7 +2635,6 @@ fv.default: ; preds = %if.merge.145 fv.case: ; preds = %if.merge.145 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2660,6 +2660,7 @@ fv.case23: ; preds = %if.merge.145 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.174, i64 7 }, { ptr, i64 } { ptr @str.175, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2722,7 +2723,6 @@ fv.default: ; preds = %if.merge.150 fv.case: ; preds = %if.merge.150 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2739,6 +2739,9 @@ fv.case17: ; preds = %if.merge.150 define internal { ptr, i64 } @struct_to_string__S(ptr %0, { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } } %1) #0 { entry: %alloca = alloca { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } }, align 8 + %ba.tmp = alloca { i64, i1 }, align 8 + %ba.tmp19 = alloca { { ptr, i64 }, i1 }, align 8 + %ba.tmp24 = alloca { i1, i1 }, align 8 store { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.182, i64 1 }, { ptr, i64 } { ptr @str.183, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2802,7 +2805,6 @@ fv.default: ; preds = %if.merge.155 fv.case: ; preds = %if.merge.155 %fv.field = extractvalue { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } } %loadN, 0 - %ba.tmp = alloca { i64, i1 }, align 8 store { i64, i1 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 37, i64 undef }, i64 %ba.p2i, 1 @@ -2810,7 +2812,6 @@ fv.case: ; preds = %if.merge.155 fv.case17: ; preds = %if.merge.155 %fv.field18 = extractvalue { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } } %loadN, 1 - %ba.tmp19 = alloca { { ptr, i64 }, i1 }, align 8 store { { ptr, i64 }, i1 } %fv.field18, ptr %ba.tmp19, align 8 %ba.p2i20 = ptrtoint ptr %ba.tmp19 to i64 %fv.val21 = insertvalue { i64, i64 } { i64 38, i64 undef }, i64 %ba.p2i20, 1 @@ -2818,7 +2819,6 @@ fv.case17: ; preds = %if.merge.155 fv.case22: ; preds = %if.merge.155 %fv.field23 = extractvalue { { i64, i1 }, { { ptr, i64 }, i1 }, { i1, i1 } } %loadN, 2 - %ba.tmp24 = alloca { i1, i1 }, align 8 store { i1, i1 } %fv.field23, ptr %ba.tmp24, align 1 %ba.p2i25 = ptrtoint ptr %ba.tmp24 to i64 %fv.val26 = insertvalue { i64, i64 } { i64 39, i64 undef }, i64 %ba.p2i25, 1 @@ -2829,6 +2829,7 @@ fv.case22: ; preds = %if.merge.155 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.191, i64 1 }, ptr %allocaN, align 8 @@ -2861,7 +2862,6 @@ if.merge.164: ; preds = %if.then.163, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2879,6 +2879,8 @@ if.merge.164: ; preds = %if.then.163, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.194, i64 1 }, ptr %allocaN, align 8 @@ -2911,11 +2913,9 @@ if.merge.169: ; preds = %if.then.168, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2932,6 +2932,7 @@ if.merge.169: ; preds = %if.then.168, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.197, i64 1 }, ptr %allocaN, align 8 @@ -2969,7 +2970,6 @@ if.merge.178: ; preds = %if.then.177, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2986,6 +2986,7 @@ if.merge.178: ; preds = %if.then.177, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.200, i64 1 }, ptr %allocaN, align 8 @@ -3023,7 +3024,6 @@ if.merge.183: ; preds = %if.then.182, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3564,6 +3564,7 @@ if.merge.277: ; preds = %entry define internal { ptr, i64 } @optional_to_string__opt_string(ptr %0, { { ptr, i64 }, i1 } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i1 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i1 } %1, ptr %alloca, align 8 %load = load { { ptr, i64 }, i1 }, ptr %alloca, align 8 %oh.has = extractvalue { { ptr, i64 }, i1 } %load, 1 @@ -3576,7 +3577,6 @@ if.then.278: ; preds = %entry if.merge.279: ; preds = %entry %loadN = load { { ptr, i64 }, i1 }, ptr %alloca, align 8 %ou.val = extractvalue { { ptr, i64 }, i1 } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ou.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1004-errors-try.ir b/examples/expected/1004-errors-try.ir index d091a5b..8cfbd70 100644 --- a/examples/expected/1004-errors-try.ir +++ b/examples/expected/1004-errors-try.ir @@ -387,6 +387,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -398,15 +403,11 @@ if.then.24: ; preds = %entry if.merge.25: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.26 @@ -418,7 +419,6 @@ while.hdr.26: ; preds = %if.merge.30, %if.me while.body.27: ; preds = %while.hdr.26 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -476,6 +476,17 @@ if.merge.32: ; preds = %if.then.31, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -487,18 +498,14 @@ if.then.66: ; preds = %entry if.merge.67: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.76 while.hdr.76: ; preds = %while.exit.87, %if.merge.67 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -506,9 +513,7 @@ while.hdr.76: ; preds = %while.exit.87, %if. br i1 %icmpN, label %or.merge.80, label %or.rhs.79 while.body.77: ; preds = %or.merge.84 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.85 @@ -523,7 +528,6 @@ while.exit.78: ; preds = %or.merge.84 or.rhs.79: ; preds = %while.hdr.76 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -536,7 +540,6 @@ or.merge.80: ; preds = %or.rhs.79, %while.h or.rhs.81: ; preds = %or.merge.80 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -549,7 +552,6 @@ or.merge.82: ; preds = %or.rhs.81, %or.merg or.rhs.83: ; preds = %or.merge.82 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -570,12 +572,10 @@ while.body.86: ; preds = %while.hdr.85 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -628,6 +628,18 @@ if.merge.90: ; preds = %if.else.89, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -647,11 +659,9 @@ if.else.95: ; preds = %entry if.merge.96: ; preds = %if.else.95, %if.then.94 %bp = phi double [ %fsub, %if.then.94 ], [ %loadN, %if.else.95 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -659,7 +669,6 @@ if.merge.96: ; preds = %if.else.95, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -674,19 +683,15 @@ if.then.97: ; preds = %if.merge.96 if.merge.98: ; preds = %if.then.97, %if.merge.96 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.99, label %if.else.100 @@ -699,20 +704,16 @@ if.else.100: ; preds = %if.merge.98 if.merge.101: ; preds = %if.else.100, %if.then.99 %bpN = phi i64 [ 1, %if.then.99 ], [ 0, %if.else.100 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.102, label %if.merge.103 @@ -748,7 +749,6 @@ if.merge.103: ; preds = %if.then.102, %if.me store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -776,6 +776,7 @@ if.merge.103: ; preds = %if.then.102, %if.me define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -799,7 +800,6 @@ while.hdr.214: ; preds = %if.merge.219, %entr while.body.215: ; preds = %while.hdr.214 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -840,6 +840,13 @@ if.merge.219: ; preds = %if.else.218, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -860,11 +867,9 @@ if.merge.69: ; preds = %if.then.68, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -881,11 +886,9 @@ if.merge.71: ; preds = %if.then.70, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -902,11 +905,9 @@ if.merge.73: ; preds = %if.then.72, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -919,7 +920,6 @@ if.then.74: ; preds = %if.merge.73 br label %if.merge.75 if.merge.75: ; preds = %if.then.74, %if.merge.73 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -941,6 +941,13 @@ if.merge.75: ; preds = %if.then.74, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -952,40 +959,33 @@ if.then.212: ; preds = %entry if.merge.213: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.220 @@ -1096,6 +1096,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i32, align 4 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1177,7 +1184,6 @@ match.arm.49: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.63, label %if.else.64 match.arm.50: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1197,7 +1203,6 @@ match.arm.51: ; preds = %entry match.arm.52: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.91, label %fN.unbox.92 @@ -1206,7 +1211,6 @@ match.arm.53: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.105 [ i64 19, label %dispatch.case.106 i64 20, label %dispatch.case.107 @@ -1223,7 +1227,6 @@ match.arm.54: ; No predecessors! unreachable match.arm.55: ; preds = %entry - %allocaN = alloca i32, align 4 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw21 = extractvalue { i64, i64 } %loadN, 1 %trN = trunc i64 %ua.raw21 to i32 @@ -1242,7 +1245,6 @@ match.arm.57: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw25 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw25, label %dispatch.default.161 [ i64 35, label %dispatch.case.162 i64 46, label %dispatch.case.163 @@ -1252,7 +1254,6 @@ match.arm.58: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw29 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw29, label %dispatch.default.175 [ i64 36, label %dispatch.case.176 i64 44, label %dispatch.case.177 @@ -1262,7 +1263,6 @@ match.arm.59: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw33 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw33, label %dispatch.default.189 [ i64 18, label %dispatch.case.190 i64 22, label %dispatch.case.191 @@ -2058,6 +2058,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.110, i64 15 }, { ptr, i64 } { ptr @str.111, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2122,7 +2124,6 @@ fv.default: ; preds = %if.merge.119 fv.case: ; preds = %if.merge.119 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2142,7 +2143,6 @@ fv.case20: ; preds = %if.merge.119 fv.case24: ; preds = %if.merge.119 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2437,6 +2437,7 @@ fv.case17: ; preds = %if.merge.139 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.148, i64 5 }, { ptr, i64 } { ptr @str.149, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2511,7 +2512,6 @@ fv.case17: ; preds = %if.merge.144 fv.case20: ; preds = %if.merge.144 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2604,6 +2604,7 @@ fv.case20: ; preds = %if.merge.149 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.166, i64 17 }, { ptr, i64 } { ptr @str.167, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2668,7 +2669,6 @@ fv.default: ; preds = %if.merge.154 fv.case: ; preds = %if.merge.154 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2694,6 +2694,7 @@ fv.case23: ; preds = %if.merge.154 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.176, i64 7 }, { ptr, i64 } { ptr @str.177, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2756,7 +2757,6 @@ fv.default: ; preds = %if.merge.159 fv.case: ; preds = %if.merge.159 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2773,6 +2773,7 @@ fv.case17: ; preds = %if.merge.159 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.184, i64 1 }, ptr %allocaN, align 8 @@ -2805,7 +2806,6 @@ if.merge.168: ; preds = %if.then.167, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2823,6 +2823,8 @@ if.merge.168: ; preds = %if.then.167, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.187, i64 1 }, ptr %allocaN, align 8 @@ -2855,11 +2857,9 @@ if.merge.173: ; preds = %if.then.172, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2876,6 +2876,7 @@ if.merge.173: ; preds = %if.then.172, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.190, i64 1 }, ptr %allocaN, align 8 @@ -2913,7 +2914,6 @@ if.merge.182: ; preds = %if.then.181, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2930,6 +2930,7 @@ if.merge.182: ; preds = %if.then.181, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.193, i64 1 }, ptr %allocaN, align 8 @@ -2967,7 +2968,6 @@ if.merge.187: ; preds = %if.then.186, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1006-errors-inferred-error-sets.ir b/examples/expected/1006-errors-inferred-error-sets.ir index 33a164b..e197571 100644 --- a/examples/expected/1006-errors-inferred-error-sets.ir +++ b/examples/expected/1006-errors-inferred-error-sets.ir @@ -393,6 +393,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -404,15 +409,11 @@ if.then.26: ; preds = %entry if.merge.27: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.28 @@ -424,7 +425,6 @@ while.hdr.28: ; preds = %if.merge.32, %if.me while.body.29: ; preds = %while.hdr.28 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -482,6 +482,17 @@ if.merge.34: ; preds = %if.then.33, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -493,18 +504,14 @@ if.then.68: ; preds = %entry if.merge.69: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.78 while.hdr.78: ; preds = %while.exit.89, %if.merge.69 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -512,9 +519,7 @@ while.hdr.78: ; preds = %while.exit.89, %if. br i1 %icmpN, label %or.merge.82, label %or.rhs.81 while.body.79: ; preds = %or.merge.86 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.87 @@ -529,7 +534,6 @@ while.exit.80: ; preds = %or.merge.86 or.rhs.81: ; preds = %while.hdr.78 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -542,7 +546,6 @@ or.merge.82: ; preds = %or.rhs.81, %while.h or.rhs.83: ; preds = %or.merge.82 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -555,7 +558,6 @@ or.merge.84: ; preds = %or.rhs.83, %or.merg or.rhs.85: ; preds = %or.merge.84 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -576,12 +578,10 @@ while.body.88: ; preds = %while.hdr.87 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -634,6 +634,18 @@ if.merge.92: ; preds = %if.else.91, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -653,11 +665,9 @@ if.else.97: ; preds = %entry if.merge.98: ; preds = %if.else.97, %if.then.96 %bp = phi double [ %fsub, %if.then.96 ], [ %loadN, %if.else.97 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -665,7 +675,6 @@ if.merge.98: ; preds = %if.else.97, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -680,19 +689,15 @@ if.then.99: ; preds = %if.merge.98 if.merge.100: ; preds = %if.then.99, %if.merge.98 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.101, label %if.else.102 @@ -705,20 +710,16 @@ if.else.102: ; preds = %if.merge.100 if.merge.103: ; preds = %if.else.102, %if.then.101 %bpN = phi i64 [ 1, %if.then.101 ], [ 0, %if.else.102 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.104, label %if.merge.105 @@ -754,7 +755,6 @@ if.merge.105: ; preds = %if.then.104, %if.me store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -782,6 +782,7 @@ if.merge.105: ; preds = %if.then.104, %if.me define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -805,7 +806,6 @@ while.hdr.216: ; preds = %if.merge.221, %entr while.body.217: ; preds = %while.hdr.216 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -846,6 +846,13 @@ if.merge.221: ; preds = %if.else.220, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -866,11 +873,9 @@ if.merge.71: ; preds = %if.then.70, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -887,11 +892,9 @@ if.merge.73: ; preds = %if.then.72, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -908,11 +911,9 @@ if.merge.75: ; preds = %if.then.74, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -925,7 +926,6 @@ if.then.76: ; preds = %if.merge.75 br label %if.merge.77 if.merge.77: ; preds = %if.then.76, %if.merge.75 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -947,6 +947,13 @@ if.merge.77: ; preds = %if.then.76, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -958,40 +965,33 @@ if.then.214: ; preds = %entry if.merge.215: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.222 @@ -1102,6 +1102,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i32, align 4 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1184,7 +1191,6 @@ match.arm.51: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.65, label %if.else.66 match.arm.52: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1204,7 +1210,6 @@ match.arm.53: ; preds = %entry match.arm.54: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.93, label %fN.unbox.94 @@ -1213,7 +1218,6 @@ match.arm.55: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.107 [ i64 19, label %dispatch.case.108 i64 20, label %dispatch.case.109 @@ -1230,7 +1234,6 @@ match.arm.56: ; No predecessors! unreachable match.arm.57: ; preds = %entry, %entry - %allocaN = alloca i32, align 4 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw21 = extractvalue { i64, i64 } %loadN, 1 %trN = trunc i64 %ua.raw21 to i32 @@ -1249,7 +1252,6 @@ match.arm.59: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw25 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw25, label %dispatch.default.163 [ i64 35, label %dispatch.case.164 i64 47, label %dispatch.case.165 @@ -1259,7 +1261,6 @@ match.arm.60: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw29 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw29, label %dispatch.default.177 [ i64 36, label %dispatch.case.178 i64 45, label %dispatch.case.179 @@ -1269,7 +1270,6 @@ match.arm.61: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw33 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw33, label %dispatch.default.191 [ i64 18, label %dispatch.case.192 i64 22, label %dispatch.case.193 @@ -2077,6 +2077,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.116, i64 15 }, { ptr, i64 } { ptr @str.117, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2141,7 +2143,6 @@ fv.default: ; preds = %if.merge.121 fv.case: ; preds = %if.merge.121 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2161,7 +2162,6 @@ fv.case20: ; preds = %if.merge.121 fv.case24: ; preds = %if.merge.121 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2456,6 +2456,7 @@ fv.case17: ; preds = %if.merge.141 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.154, i64 5 }, { ptr, i64 } { ptr @str.155, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2530,7 +2531,6 @@ fv.case17: ; preds = %if.merge.146 fv.case20: ; preds = %if.merge.146 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2623,6 +2623,7 @@ fv.case20: ; preds = %if.merge.151 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.172, i64 17 }, { ptr, i64 } { ptr @str.173, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2687,7 +2688,6 @@ fv.default: ; preds = %if.merge.156 fv.case: ; preds = %if.merge.156 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2713,6 +2713,7 @@ fv.case23: ; preds = %if.merge.156 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.182, i64 7 }, { ptr, i64 } { ptr @str.183, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2775,7 +2776,6 @@ fv.default: ; preds = %if.merge.161 fv.case: ; preds = %if.merge.161 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2792,6 +2792,7 @@ fv.case17: ; preds = %if.merge.161 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.190, i64 1 }, ptr %allocaN, align 8 @@ -2824,7 +2825,6 @@ if.merge.170: ; preds = %if.then.169, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2842,6 +2842,8 @@ if.merge.170: ; preds = %if.then.169, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.193, i64 1 }, ptr %allocaN, align 8 @@ -2874,11 +2876,9 @@ if.merge.175: ; preds = %if.then.174, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2895,6 +2895,7 @@ if.merge.175: ; preds = %if.then.174, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.196, i64 1 }, ptr %allocaN, align 8 @@ -2932,7 +2933,6 @@ if.merge.184: ; preds = %if.then.183, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2949,6 +2949,7 @@ if.merge.184: ; preds = %if.then.183, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.199, i64 1 }, ptr %allocaN, align 8 @@ -2986,7 +2987,6 @@ if.merge.189: ; preds = %if.then.188, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1009-errors-catch.ir b/examples/expected/1009-errors-catch.ir index 72ef893..9a44a9e 100644 --- a/examples/expected/1009-errors-catch.ir +++ b/examples/expected/1009-errors-catch.ir @@ -389,6 +389,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -400,15 +405,11 @@ if.then.44: ; preds = %entry if.merge.45: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.46 @@ -420,7 +421,6 @@ while.hdr.46: ; preds = %if.merge.50, %if.me while.body.47: ; preds = %while.hdr.46 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -478,6 +478,17 @@ if.merge.52: ; preds = %if.then.51, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -489,18 +500,14 @@ if.then.86: ; preds = %entry if.merge.87: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.96 while.hdr.96: ; preds = %while.exit.107, %if.merge.87 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -508,9 +515,7 @@ while.hdr.96: ; preds = %while.exit.107, %if br i1 %icmpN, label %or.merge.100, label %or.rhs.99 while.body.97: ; preds = %or.merge.104 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.105 @@ -525,7 +530,6 @@ while.exit.98: ; preds = %or.merge.104 or.rhs.99: ; preds = %while.hdr.96 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -538,7 +542,6 @@ or.merge.100: ; preds = %or.rhs.99, %while.h or.rhs.101: ; preds = %or.merge.100 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -551,7 +554,6 @@ or.merge.102: ; preds = %or.rhs.101, %or.mer or.rhs.103: ; preds = %or.merge.102 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -572,12 +574,10 @@ while.body.106: ; preds = %while.hdr.105 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -630,6 +630,18 @@ if.merge.110: ; preds = %if.else.109, %if.th define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -649,11 +661,9 @@ if.else.115: ; preds = %entry if.merge.116: ; preds = %if.else.115, %if.then.114 %bp = phi double [ %fsub, %if.then.114 ], [ %loadN, %if.else.115 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -661,7 +671,6 @@ if.merge.116: ; preds = %if.else.115, %if.th %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -676,19 +685,15 @@ if.then.117: ; preds = %if.merge.116 if.merge.118: ; preds = %if.then.117, %if.merge.116 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.119, label %if.else.120 @@ -701,20 +706,16 @@ if.else.120: ; preds = %if.merge.118 if.merge.121: ; preds = %if.else.120, %if.then.119 %bpN = phi i64 [ 1, %if.then.119 ], [ 0, %if.else.120 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.122, label %if.merge.123 @@ -750,7 +751,6 @@ if.merge.123: ; preds = %if.then.122, %if.me store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -778,6 +778,7 @@ if.merge.123: ; preds = %if.then.122, %if.me define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -801,7 +802,6 @@ while.hdr.234: ; preds = %if.merge.239, %entr while.body.235: ; preds = %while.hdr.234 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -842,6 +842,13 @@ if.merge.239: ; preds = %if.else.238, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -862,11 +869,9 @@ if.merge.89: ; preds = %if.then.88, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -883,11 +888,9 @@ if.merge.91: ; preds = %if.then.90, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -904,11 +907,9 @@ if.merge.93: ; preds = %if.then.92, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -921,7 +922,6 @@ if.then.94: ; preds = %if.merge.93 br label %if.merge.95 if.merge.95: ; preds = %if.then.94, %if.merge.93 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -943,6 +943,13 @@ if.merge.95: ; preds = %if.then.94, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -954,40 +961,33 @@ if.then.232: ; preds = %entry if.merge.233: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.240 @@ -1098,6 +1098,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i32, align 4 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1179,7 +1186,6 @@ match.arm.69: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.83, label %if.else.84 match.arm.70: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1199,7 +1205,6 @@ match.arm.71: ; preds = %entry match.arm.72: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.111, label %fN.unbox.112 @@ -1208,7 +1213,6 @@ match.arm.73: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.125 [ i64 19, label %dispatch.case.126 i64 20, label %dispatch.case.127 @@ -1225,7 +1229,6 @@ match.arm.74: ; No predecessors! unreachable match.arm.75: ; preds = %entry - %allocaN = alloca i32, align 4 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw21 = extractvalue { i64, i64 } %loadN, 1 %trN = trunc i64 %ua.raw21 to i32 @@ -1244,7 +1247,6 @@ match.arm.77: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw25 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw25, label %dispatch.default.181 [ i64 35, label %dispatch.case.182 i64 46, label %dispatch.case.183 @@ -1254,7 +1256,6 @@ match.arm.78: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw29 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw29, label %dispatch.default.195 [ i64 36, label %dispatch.case.196 i64 44, label %dispatch.case.197 @@ -1264,7 +1265,6 @@ match.arm.79: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw33 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw33, label %dispatch.default.209 [ i64 18, label %dispatch.case.210 i64 22, label %dispatch.case.211 @@ -2023,6 +2023,8 @@ if.merge.19: ; preds = %catch.handle.16 define i32 @main() #0 { entry: %alloca = alloca i32, align 4 + %allocaN = alloca i32, align 4 + %allocaN = alloca i32, align 4 store i32 0, ptr %alloca, align 4 %call = call i32 @must(ptr @__sx_default_context, i32 -1) %icmp = icmp ne i32 %call, 0 @@ -2062,7 +2064,6 @@ catch.merge.9: ; preds = %catch.handle.8, %ca %addN = add i32 %loadN, %callN store i32 %addN, ptr %alloca, align 4 %callN = call i32 @handle_some(ptr @__sx_default_context, i32 0) - %allocaN = alloca i32, align 4 store i32 %callN, ptr %allocaN, align 4 %loadN = load i32, ptr %allocaN, align 4 %icmpN = icmp eq i32 %loadN, 2 @@ -2076,7 +2077,6 @@ if.then.20: ; preds = %catch.merge.9 if.merge.21: ; preds = %if.then.20, %catch.merge.9 %callN = call i32 @handle_some(ptr @__sx_default_context, i32 -1) - %allocaN = alloca i32, align 4 store i32 %callN, ptr %allocaN, align 4 %loadN = load i32, ptr %allocaN, align 4 %icmpN = icmp eq i32 %loadN, 1 @@ -2169,6 +2169,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.112, i64 15 }, { ptr, i64 } { ptr @str.113, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2233,7 +2235,6 @@ fv.default: ; preds = %if.merge.139 fv.case: ; preds = %if.merge.139 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2253,7 +2254,6 @@ fv.case20: ; preds = %if.merge.139 fv.case24: ; preds = %if.merge.139 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2548,6 +2548,7 @@ fv.case17: ; preds = %if.merge.159 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.150, i64 5 }, { ptr, i64 } { ptr @str.151, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2622,7 +2623,6 @@ fv.case17: ; preds = %if.merge.164 fv.case20: ; preds = %if.merge.164 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2715,6 +2715,7 @@ fv.case20: ; preds = %if.merge.169 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.168, i64 17 }, { ptr, i64 } { ptr @str.169, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2779,7 +2780,6 @@ fv.default: ; preds = %if.merge.174 fv.case: ; preds = %if.merge.174 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2805,6 +2805,7 @@ fv.case23: ; preds = %if.merge.174 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.178, i64 7 }, { ptr, i64 } { ptr @str.179, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2867,7 +2868,6 @@ fv.default: ; preds = %if.merge.179 fv.case: ; preds = %if.merge.179 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2884,6 +2884,7 @@ fv.case17: ; preds = %if.merge.179 define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.186, i64 1 }, ptr %allocaN, align 8 @@ -2916,7 +2917,6 @@ if.merge.188: ; preds = %if.then.187, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -2934,6 +2934,8 @@ if.merge.188: ; preds = %if.then.187, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.189, i64 1 }, ptr %allocaN, align 8 @@ -2966,11 +2968,9 @@ if.merge.193: ; preds = %if.then.192, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -2987,6 +2987,7 @@ if.merge.193: ; preds = %if.then.192, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.192, i64 1 }, ptr %allocaN, align 8 @@ -3024,7 +3025,6 @@ if.merge.202: ; preds = %if.then.201, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3041,6 +3041,7 @@ if.merge.202: ; preds = %if.then.201, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.195, i64 1 }, ptr %allocaN, align 8 @@ -3078,7 +3079,6 @@ if.merge.207: ; preds = %if.then.206, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1309-ffi-objc-class-method-lowering.ir b/examples/expected/1309-ffi-objc-class-method-lowering.ir index 54b3dbf..c04d484 100644 --- a/examples/expected/1309-ffi-objc-class-method-lowering.ir +++ b/examples/expected/1309-ffi-objc-class-method-lowering.ir @@ -160,6 +160,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -171,15 +176,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -191,7 +192,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 diff --git a/examples/expected/1314-ffi-objc-class-dealloc-roundtrip.ir b/examples/expected/1314-ffi-objc-class-dealloc-roundtrip.ir index 4b28bd2..a15ad93 100644 --- a/examples/expected/1314-ffi-objc-class-dealloc-roundtrip.ir +++ b/examples/expected/1314-ffi-objc-class-dealloc-roundtrip.ir @@ -176,6 +176,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -187,15 +192,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -207,7 +208,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -831,6 +831,14 @@ define i32 @main() #0 { entry: call void @__sx_objc_defined_class_init() %alloca = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 %call = call ptr @objc_getClass(ptr @str.16) store ptr %call, ptr %alloca, align 8 %load = load ptr, ptr %alloca, align 8 @@ -842,10 +850,8 @@ if.then.0: ; preds = %entry ret i32 1 if.merge.1: ; preds = %entry - %allocaN = alloca ptr, align 8 %callN = call ptr @sel_registerName(ptr @str.17) store ptr %callN, ptr %allocaN, align 8 - %allocaN = alloca ptr, align 8 %loadN = load ptr, ptr %alloca, align 8 %loadN = load ptr, ptr %allocaN, align 8 %callN = call ptr @class_getMethodImplementation(ptr %loadN, ptr %loadN) @@ -859,12 +865,9 @@ if.then.39: ; preds = %if.merge.1 ret i32 1 if.merge.40: ; preds = %if.merge.1 - %allocaN = alloca ptr, align 8 %callN = call ptr @sel_registerName(ptr @str.18) store ptr %callN, ptr %allocaN, align 8 - %allocaN = alloca ptr, align 8 store ptr @objc_msgSend, ptr %allocaN, align 8 - %allocaN = alloca ptr, align 8 %loadN = load ptr, ptr %alloca, align 8 %loadN = load ptr, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 @@ -879,16 +882,13 @@ if.then.41: ; preds = %if.merge.40 ret i32 1 if.merge.42: ; preds = %if.merge.40 - %allocaN = alloca ptr, align 8 %callN = call ptr @sel_registerName(ptr @str.19) store ptr %callN, ptr %allocaN, align 8 - %allocaN = alloca ptr, align 8 store ptr @objc_msgSend, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 call void %loadN(ptr %loadN, ptr %loadN) - %allocaN = alloca ptr, align 8 %loadN = load ptr, ptr %alloca, align 8 %loadN = load ptr, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 diff --git a/examples/expected/1319-ffi-objc-property-sx-defined.ir b/examples/expected/1319-ffi-objc-property-sx-defined.ir index d682c2b..38eb321 100644 --- a/examples/expected/1319-ffi-objc-property-sx-defined.ir +++ b/examples/expected/1319-ffi-objc-property-sx-defined.ir @@ -506,6 +506,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -517,15 +522,11 @@ if.then.18: ; preds = %entry if.merge.19: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.20 @@ -537,7 +538,6 @@ while.hdr.20: ; preds = %if.merge.24, %if.me while.body.21: ; preds = %while.hdr.20 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -595,6 +595,17 @@ if.merge.26: ; preds = %if.then.25, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -606,18 +617,14 @@ if.then.64: ; preds = %entry if.merge.65: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.74 while.hdr.74: ; preds = %while.exit.85, %if.merge.65 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -625,9 +632,7 @@ while.hdr.74: ; preds = %while.exit.85, %if. br i1 %icmpN, label %or.merge.78, label %or.rhs.77 while.body.75: ; preds = %or.merge.82 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.83 @@ -642,7 +647,6 @@ while.exit.76: ; preds = %or.merge.82 or.rhs.77: ; preds = %while.hdr.74 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -655,7 +659,6 @@ or.merge.78: ; preds = %or.rhs.77, %while.h or.rhs.79: ; preds = %or.merge.78 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -668,7 +671,6 @@ or.merge.80: ; preds = %or.rhs.79, %or.merg or.rhs.81: ; preds = %or.merge.80 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -689,12 +691,10 @@ while.body.84: ; preds = %while.hdr.83 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -747,6 +747,18 @@ if.merge.88: ; preds = %if.else.87, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -766,11 +778,9 @@ if.else.93: ; preds = %entry if.merge.94: ; preds = %if.else.93, %if.then.92 %bp = phi double [ %fsub, %if.then.92 ], [ %loadN, %if.else.93 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -778,7 +788,6 @@ if.merge.94: ; preds = %if.else.93, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -793,19 +802,15 @@ if.then.95: ; preds = %if.merge.94 if.merge.96: ; preds = %if.then.95, %if.merge.94 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.97, label %if.else.98 @@ -818,20 +823,16 @@ if.else.98: ; preds = %if.merge.96 if.merge.99: ; preds = %if.else.98, %if.then.97 %bpN = phi i64 [ 1, %if.then.97 ], [ 0, %if.else.98 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.100, label %if.merge.101 @@ -867,7 +868,6 @@ if.merge.101: ; preds = %if.then.100, %if.me store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -895,6 +895,7 @@ if.merge.101: ; preds = %if.then.100, %if.me define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -918,7 +919,6 @@ while.hdr.253: ; preds = %if.merge.258, %entr while.body.254: ; preds = %while.hdr.253 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -959,6 +959,13 @@ if.merge.258: ; preds = %if.else.257, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -979,11 +986,9 @@ if.merge.67: ; preds = %if.then.66, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1000,11 +1005,9 @@ if.merge.69: ; preds = %if.then.68, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1021,11 +1024,9 @@ if.merge.71: ; preds = %if.then.70, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -1038,7 +1039,6 @@ if.then.72: ; preds = %if.merge.71 br label %if.merge.73 if.merge.73: ; preds = %if.then.72, %if.merge.71 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1060,6 +1060,13 @@ if.merge.73: ; preds = %if.then.72, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1071,40 +1078,33 @@ if.then.251: ; preds = %entry if.merge.252: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.259 @@ -1215,6 +1215,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1305,7 +1312,6 @@ match.arm.47: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.61, label %if.else.62 match.arm.48: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1325,7 +1331,6 @@ match.arm.49: ; preds = %entry match.arm.50: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.89, label %fN.unbox.90 @@ -1334,7 +1339,6 @@ match.arm.51: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.103 [ i64 19, label %dispatch.case.104 i64 20, label %dispatch.case.105 @@ -1355,7 +1359,6 @@ match.arm.52: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.183 [ i64 37, label %dispatch.case.184 i64 38, label %dispatch.case.185 @@ -1371,7 +1374,6 @@ match.arm.55: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.191 [ i64 35, label %dispatch.case.192 i64 58, label %dispatch.case.193 @@ -1382,7 +1384,6 @@ match.arm.56: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.211 [ i64 36, label %dispatch.case.212 i64 53, label %dispatch.case.213 @@ -1392,7 +1393,6 @@ match.arm.57: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.225 [ i64 18, label %dispatch.case.226 i64 22, label %dispatch.case.227 @@ -2290,6 +2290,10 @@ entry: call void @__sx_objc_selector_init() call void @__sx_objc_defined_class_init() call void @__sx_objc_class_init() + %allocaN = alloca i32, align 4 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 %load = load ptr, ptr @OBJC_CLASSLIST_REFERENCES_SxBox, align 8 %call = call ptr @class_createInstance(ptr %load, i64 0) %loadN = load { { ptr, ptr, ptr }, ptr }, ptr @__sx_default_context, align 8 @@ -2345,7 +2349,6 @@ if.merge.3: ; preds = %or.merge.1 %loadN = load ptr, ptr %alloca, align 8 %loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_area, align 8 %objc.msg25 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN) - %allocaN = alloca i32, align 4 store i32 %objc.msg25, ptr %allocaN, align 4 %loadN = load i32, ptr %allocaN, align 4 %cmp.ext28 = sext i32 %loadN to i64 @@ -2358,16 +2361,13 @@ if.then.41: ; preds = %if.merge.3 ret i32 1 if.merge.42: ; preds = %if.merge.3 - %allocaN = alloca ptr, align 8 %callN = call ptr @objc_getClass(ptr @str.120) store ptr %callN, ptr %allocaN, align 8 - %allocaN = alloca ptr, align 8 %callN = call ptr @sel_registerName(ptr @str.121) store ptr %callN, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 %callN = call ptr @class_getInstanceMethod(ptr %loadN, ptr %loadN) - %allocaN = alloca ptr, align 8 store ptr %callN, ptr %allocaN, align 8 %loadN = load ptr, ptr %allocaN, align 8 %icmpN = icmp ne ptr %loadN, null @@ -2607,6 +2607,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.134, i64 15 }, { ptr, i64 } { ptr @str.135, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2671,7 +2673,6 @@ fv.default: ; preds = %if.merge.121 fv.case: ; preds = %if.merge.121 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2691,7 +2692,6 @@ fv.case20: ; preds = %if.merge.121 fv.case24: ; preds = %if.merge.121 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2986,6 +2986,7 @@ fv.case17: ; preds = %if.merge.141 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.172, i64 5 }, { ptr, i64 } { ptr @str.173, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3060,7 +3061,6 @@ fv.case17: ; preds = %if.merge.146 fv.case20: ; preds = %if.merge.146 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3153,6 +3153,7 @@ fv.case20: ; preds = %if.merge.151 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.190, i64 17 }, { ptr, i64 } { ptr @str.191, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3217,7 +3218,6 @@ fv.default: ; preds = %if.merge.156 fv.case: ; preds = %if.merge.156 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3243,6 +3243,7 @@ fv.case23: ; preds = %if.merge.156 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.200, i64 7 }, { ptr, i64 } { ptr @str.201, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3305,7 +3306,6 @@ fv.default: ; preds = %if.merge.161 fv.case: ; preds = %if.merge.161 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3487,6 +3487,7 @@ if.merge.176: ; preds = %if.then.175, %while define internal { ptr, i64 } @struct_to_string____SxBoxState(ptr %0, { { ptr, ptr, ptr }, i32, i32, i32 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i32, i32, i32 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i32, i32, i32 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.226, i64 12 }, { ptr, i64 } { ptr @str.227, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3551,7 +3552,6 @@ fv.default: ; preds = %if.merge.181 fv.case: ; preds = %if.merge.181 %fv.field = extractvalue { { ptr, ptr, ptr }, i32, i32, i32 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3662,6 +3662,7 @@ if.merge.189: ; preds = %if.then.188, %entry define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.256, i64 1 }, ptr %allocaN, align 8 @@ -3694,7 +3695,6 @@ if.merge.199: ; preds = %if.then.198, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3712,6 +3712,8 @@ if.merge.199: ; preds = %if.then.198, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.259, i64 1 }, ptr %allocaN, align 8 @@ -3744,11 +3746,9 @@ if.merge.204: ; preds = %if.then.203, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3765,6 +3765,8 @@ if.merge.204: ; preds = %if.then.203, %while define internal { ptr, i64 } @array_to_string__AR_3_Any(ptr %0, [3 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 + %ig.tmp = alloca [3 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [3 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.262, i64 1 }, ptr %allocaN, align 8 @@ -3797,11 +3799,9 @@ if.merge.209: ; preds = %if.then.208, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [3 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3818,6 +3818,7 @@ if.merge.209: ; preds = %if.then.208, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.265, i64 1 }, ptr %allocaN, align 8 @@ -3855,7 +3856,6 @@ if.merge.218: ; preds = %if.then.217, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3872,6 +3872,7 @@ if.merge.218: ; preds = %if.then.217, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.268, i64 1 }, ptr %allocaN, align 8 @@ -3909,7 +3910,6 @@ if.merge.223: ; preds = %if.then.222, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1329-ffi-objc-call-03-selector-sharing.ir b/examples/expected/1329-ffi-objc-call-03-selector-sharing.ir index 0bd7302..1efd580 100644 --- a/examples/expected/1329-ffi-objc-call-03-selector-sharing.ir +++ b/examples/expected/1329-ffi-objc-call-03-selector-sharing.ir @@ -152,6 +152,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -163,15 +168,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -183,7 +184,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 diff --git a/examples/expected/1332-ffi-objc-call-06-sret-return.ir b/examples/expected/1332-ffi-objc-call-06-sret-return.ir index 85a0636..31a5f68 100644 --- a/examples/expected/1332-ffi-objc-call-06-sret-return.ir +++ b/examples/expected/1332-ffi-objc-call-06-sret-return.ir @@ -448,6 +448,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -459,15 +464,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -479,7 +480,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -537,6 +537,17 @@ if.merge.22: ; preds = %if.then.21, %while. define internal { ptr, i64 } @uint_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %ig.tmp15 = alloca [4 x i64], align 8 + %ig.tmp20 = alloca [4 x i64], align 8 + %ig.tmp26 = alloca [4 x i64], align 8 + %ig.tmp36 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -548,18 +559,14 @@ if.then.56: ; preds = %entry if.merge.57: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 @@ -567,9 +574,7 @@ while.hdr.66: ; preds = %while.exit.77, %if. br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.75 @@ -584,7 +589,6 @@ while.exit.68: ; preds = %or.merge.74 or.rhs.69: ; preds = %while.hdr.66 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp15 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp15, align 8 %ig.ptr16 = getelementptr [4 x i64], ptr %ig.tmp15, i64 0, i64 1 %ig.val17 = load i64, ptr %ig.ptr16, align 8 @@ -597,7 +601,6 @@ or.merge.70: ; preds = %or.rhs.69, %while.h or.rhs.71: ; preds = %or.merge.70 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp20 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp20, align 8 %ig.ptr21 = getelementptr [4 x i64], ptr %ig.tmp20, i64 0, i64 2 %ig.val22 = load i64, ptr %ig.ptr21, align 8 @@ -610,7 +613,6 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg or.rhs.73: ; preds = %or.merge.72 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp26 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp26, align 8 %ig.ptr27 = getelementptr [4 x i64], ptr %ig.tmp26, i64 0, i64 3 %ig.val28 = load i64, ptr %ig.ptr27, align 8 @@ -631,12 +633,10 @@ while.body.76: ; preds = %while.hdr.75 %mul = mul i64 %loadN, 65536 %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp36 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp36, align 8 %ig.ptr37 = getelementptr [4 x i64], ptr %ig.tmp36, i64 0, i64 %loadN %ig.val38 = load i64, ptr %ig.ptr37, align 8 %addN = add i64 %mul, %ig.val38 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 @@ -689,6 +689,18 @@ if.merge.80: ; preds = %if.else.79, %if.the define internal { ptr, i64 } @float_to_string(ptr %0, double %1) #0 { entry: %alloca = alloca double, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store double %1, ptr %alloca, align 8 %load = load double, ptr %alloca, align 8 %fcmp = fcmp olt double %load, 0.000000e+00 @@ -708,11 +720,9 @@ if.else.85: ; preds = %entry if.merge.86: ; preds = %if.else.85, %if.then.84 %bp = phi double [ %fsub, %if.then.84 ], [ %loadN, %if.else.85 ] - %allocaN = alloca double, align 8 store double %bp, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %fptosi = fptosi double %loadN to i64 - %allocaN = alloca i64, align 8 store i64 %fptosi, ptr %allocaN, align 8 %loadN = load double, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -720,7 +730,6 @@ if.merge.86: ; preds = %if.else.85, %if.the %fsubN = fsub double %loadN, %sitofp %fmul = fmul double %fsubN, 1.000000e+06 %fptosiN = fptosi double %fmul to i64 - %allocaN = alloca i64, align 8 store i64 %fptosiN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %loadN, 0 @@ -735,19 +744,15 @@ if.then.87: ; preds = %if.merge.86 if.merge.88: ; preds = %if.then.87, %if.merge.86 %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %len, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %lenN = extractvalue { ptr, i64 } %loadN, 1 - %allocaN = alloca i64, align 8 store i64 %lenN, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.89, label %if.else.90 @@ -760,20 +765,16 @@ if.else.90: ; preds = %if.merge.88 if.merge.91: ; preds = %if.else.90, %if.then.89 %bpN = phi i64 [ 1, %if.then.89 ], [ 0, %if.else.90 ] - %allocaN = alloca i64, align 8 store i64 %bpN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, %loadN %addN = add i64 %add, 1 %addN = add i64 %addN, 6 - %allocaN = alloca i64, align 8 store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 %loadN) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 %loadN = load i1, ptr %allocaN, align 1 br i1 %loadN, label %if.then.92, label %if.merge.93 @@ -809,7 +810,6 @@ if.merge.93: ; preds = %if.then.92, %if.mer store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 6, %loadN - %allocaN = alloca i64, align 8 store i64 %subN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -837,6 +837,7 @@ if.merge.93: ; preds = %if.then.92, %if.mer define internal void @hex_group(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca i64, align 8 store i64 %2, ptr %allocaN, align 8 @@ -860,7 +861,6 @@ while.hdr.237: ; preds = %if.merge.242, %entr while.body.238: ; preds = %while.hdr.237 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 @@ -901,6 +901,13 @@ if.merge.242: ; preds = %if.else.241, %if.th define internal [4 x i64] @decompose_u16x4(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %srem = srem i64 %load, 65536 @@ -921,11 +928,9 @@ if.merge.59: ; preds = %if.then.58, %entry %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN %sdiv = sdiv i64 %sub, 65536 - %allocaN = alloca i64, align 8 store i64 %sdiv, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -942,11 +947,9 @@ if.merge.61: ; preds = %if.then.60, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -963,11 +966,9 @@ if.merge.63: ; preds = %if.then.62, %if.mer %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN %sdivN = sdiv i64 %subN, 65536 - %allocaN = alloca i64, align 8 store i64 %sdivN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sremN = srem i64 %loadN, 65536 - %allocaN = alloca i64, align 8 store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -980,7 +981,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - %allocaN = alloca [4 x i64], align 8 store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 @@ -1002,6 +1002,13 @@ if.merge.65: ; preds = %if.then.64, %if.mer define internal { ptr, i64 } @int_to_hex_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca [4 x i64], align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %ig.tmp = alloca [4 x i64], align 8 + %ig.tmp9 = alloca [4 x i64], align 8 + %ig.tmp14 = alloca [4 x i64], align 8 + %ig.tmp19 = alloca [4 x i64], align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -1013,40 +1020,33 @@ if.then.235: ; preds = %entry if.merge.236: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %call = call [4 x i64] @decompose_u16x4(ptr %0, i64 %loadN) - %allocaN = alloca [4 x i64], align 8 store [4 x i64] %call, ptr %allocaN, align 8 %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 0 %ig.val = load i64, ptr %ig.ptr, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %ig.val) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp9 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp9, align 8 %ig.ptr10 = getelementptr [4 x i64], ptr %ig.tmp9, i64 0, i64 1 %ig.val11 = load i64, ptr %ig.ptr10, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %ig.val11) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp14 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp14, align 8 %ig.ptr15 = getelementptr [4 x i64], ptr %ig.tmp14, i64 0, i64 2 %ig.val16 = load i64, ptr %ig.ptr15, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %ig.val16) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %allocaN, align 8 - %ig.tmp19 = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp19, align 8 %ig.ptr20 = getelementptr [4 x i64], ptr %ig.tmp19, i64 0, i64 3 %ig.val21 = load i64, ptr %ig.ptr20, align 8 call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %ig.val21) - %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 br label %while.hdr.243 @@ -1157,6 +1157,13 @@ declare ptr @path_join(ptr, ptr) #0 define internal { ptr, i64 } @any_to_string(ptr %0, { i64, i64 } %1) #0 { entry: %alloca = alloca { i64, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca double, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca { ptr, i64 }, align 8 store { i64, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.5, i64 3 }, ptr %allocaN, align 8 @@ -1244,7 +1251,6 @@ match.arm.39: ; preds = %entry, %entry, %ent br i1 %tiu.load, label %if.then.53, label %if.else.54 match.arm.40: ; preds = %entry - %allocaN = alloca { ptr, i64 }, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %ua.raw8 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr = inttoptr i64 %ua.raw8 to ptr @@ -1264,7 +1270,6 @@ match.arm.41: ; preds = %entry match.arm.42: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca double, align 8 %sgN = extractvalue { i64, i64 } %loadN, 0 %icmp = icmp eq i64 %sgN, 10 br i1 %icmp, label %fN.unbox.81, label %fN.unbox.82 @@ -1273,7 +1278,6 @@ match.arm.43: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw16 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw16, label %dispatch.default.95 [ i64 19, label %dispatch.case.96 i64 20, label %dispatch.case.97 @@ -1293,7 +1297,6 @@ match.arm.44: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw20 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw20, label %dispatch.default.169 [ i64 37, label %dispatch.case.170 i64 38, label %dispatch.case.171 @@ -1309,7 +1312,6 @@ match.arm.47: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw24 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw24, label %dispatch.default.177 [ i64 35, label %dispatch.case.178 i64 52, label %dispatch.case.179 @@ -1320,7 +1322,6 @@ match.arm.48: ; preds = %entry, %entry %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw28 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw28, label %dispatch.default.197 [ i64 36, label %dispatch.case.198 i64 50, label %dispatch.case.199 @@ -1330,7 +1331,6 @@ match.arm.49: ; preds = %entry, %entry, %ent %loadN = load { i64, i64 }, ptr %allocaN, align 8 %ua.raw32 = extractvalue { i64, i64 } %loadN, 1 %loadN = load { i64, i64 }, ptr %alloca, align 8 - %allocaN = alloca { ptr, i64 }, align 8 switch i64 %ua.raw32, label %dispatch.default.211 [ i64 18, label %dispatch.case.212 i64 22, label %dispatch.case.213 @@ -2404,6 +2404,8 @@ entry: define internal { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %1) #0 { entry: %alloca = alloca { { ptr, i64 }, i32, i32, { ptr, i64 } }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 + %ba.tmp26 = alloca { ptr, i64 }, align 8 store { { ptr, i64 }, i32, i32, { ptr, i64 } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.122, i64 15 }, { ptr, i64 } { ptr @str.123, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2468,7 +2470,6 @@ fv.default: ; preds = %if.merge.112 fv.case: ; preds = %if.merge.112 %fv.field = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 0 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -2488,7 +2489,6 @@ fv.case20: ; preds = %if.merge.112 fv.case24: ; preds = %if.merge.112 %fv.field25 = extractvalue { { ptr, i64 }, i32, i32, { ptr, i64 } } %loadN, 3 - %ba.tmp26 = alloca { ptr, i64 }, align 8 store { ptr, i64 } %fv.field25, ptr %ba.tmp26, align 8 %ba.p2i27 = ptrtoint ptr %ba.tmp26 to i64 %fv.val28 = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i27, 1 @@ -2783,6 +2783,7 @@ fv.case17: ; preds = %if.merge.132 define internal { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %1) #0 { entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.160, i64 5 }, { ptr, i64 } { ptr @str.161, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -2857,7 +2858,6 @@ fv.case17: ; preds = %if.merge.137 fv.case20: ; preds = %if.merge.137 %fv.field21 = extractvalue { ptr, i64, { ptr, ptr, ptr } } %loadN, 2 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field21, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val22 = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -2950,6 +2950,7 @@ fv.case20: ; preds = %if.merge.142 define internal { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, i64, i64, i64 }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, i64, i64, i64 } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.178, i64 17 }, { ptr, i64 } { ptr @str.179, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3014,7 +3015,6 @@ fv.default: ; preds = %if.merge.147 fv.case: ; preds = %if.merge.147 %fv.field = extractvalue { { ptr, ptr, ptr }, i64, i64, i64 } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3040,6 +3040,7 @@ fv.case23: ; preds = %if.merge.147 define internal { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %1) #0 { entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 + %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %1, ptr %alloca, align 8 %call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.188, i64 7 }, { ptr, i64 } { ptr @str.189, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 @@ -3102,7 +3103,6 @@ fv.default: ; preds = %if.merge.152 fv.case: ; preds = %if.merge.152 %fv.field = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0 - %ba.tmp = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %fv.field, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %fv.val = insertvalue { i64, i64 } { i64 20, i64 undef }, i64 %ba.p2i, 1 @@ -3392,6 +3392,7 @@ if.merge.175: ; preds = %if.then.174, %entry define internal { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %1) #0 { entry: %alloca = alloca [4 x i64], align 8 + %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.237, i64 1 }, ptr %allocaN, align 8 @@ -3424,7 +3425,6 @@ if.merge.185: ; preds = %if.then.184, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [4 x i64], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [4 x i64], align 8 store [4 x i64] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [4 x i64], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load i64, ptr %ig.ptr, align 8 @@ -3442,6 +3442,8 @@ if.merge.185: ; preds = %if.then.184, %while define internal { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [1 x { i64, i64 }], align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [1 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.240, i64 1 }, ptr %allocaN, align 8 @@ -3474,11 +3476,9 @@ if.merge.190: ; preds = %if.then.189, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [1 x { i64, i64 }], align 8 store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3495,6 +3495,8 @@ if.merge.190: ; preds = %if.then.189, %while define internal { ptr, i64 } @array_to_string__AR_3_Any(ptr %0, [3 x { i64, i64 }] %1) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 + %ig.tmp = alloca [3 x { i64, i64 }], align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store [3 x { i64, i64 }] %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.243, i64 1 }, ptr %allocaN, align 8 @@ -3527,11 +3529,9 @@ if.merge.195: ; preds = %if.then.194, %while %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 - %ig.tmp = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 %ig.ptr = getelementptr [3 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 @@ -3548,6 +3548,7 @@ if.merge.195: ; preds = %if.then.194, %while define internal { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.246, i64 1 }, ptr %allocaN, align 8 @@ -3585,7 +3586,6 @@ if.merge.204: ; preds = %if.then.203, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { ptr, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { ptr, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { ptr, i64 }, align 8 store { ptr, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 12, i64 undef }, i64 %ba.p2i, 1 @@ -3602,6 +3602,7 @@ if.merge.204: ; preds = %if.then.203, %while define internal { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %1) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 store { ptr, i64 } %1, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } { ptr @str.249, i64 1 }, ptr %allocaN, align 8 @@ -3639,7 +3640,6 @@ if.merge.209: ; preds = %if.then.208, %while %ig.data = extractvalue { ptr, i64 } %loadN, 0 %ig.ptr = getelementptr { i64, i64 }, ptr %ig.data, i64 %loadN %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 - %ba.tmp = alloca { i64, i64 }, align 8 store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 %ba.p2i = ptrtoint ptr %ba.tmp to i64 %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 diff --git a/examples/expected/1347-ffi-objc-dsl-07-mangling-table.ir b/examples/expected/1347-ffi-objc-dsl-07-mangling-table.ir index e2f8750..3355369 100644 --- a/examples/expected/1347-ffi-objc-dsl-07-mangling-table.ir +++ b/examples/expected/1347-ffi-objc-dsl-07-mangling-table.ir @@ -178,6 +178,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -189,15 +194,11 @@ if.then.14: ; preds = %entry if.merge.15: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.16 @@ -209,7 +210,6 @@ while.hdr.16: ; preds = %if.merge.20, %if.me while.body.17: ; preds = %while.hdr.16 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 diff --git a/examples/expected/1402-ffi-jni-call-03-methodid-sharing.ir b/examples/expected/1402-ffi-jni-call-03-methodid-sharing.ir index 086ecfc..82ae255 100644 --- a/examples/expected/1402-ffi-jni-call-03-methodid-sharing.ir +++ b/examples/expected/1402-ffi-jni-call-03-methodid-sharing.ir @@ -151,6 +151,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -162,15 +167,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -182,7 +183,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 diff --git a/examples/expected/1403-ffi-jni-call-04-jint-return.ir b/examples/expected/1403-ffi-jni-call-04-jint-return.ir index f0965d4..4cabccf 100644 --- a/examples/expected/1403-ffi-jni-call-04-jint-return.ir +++ b/examples/expected/1403-ffi-jni-call-04-jint-return.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -658,12 +658,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca i32, align 4 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call i32 @read_int(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca i32, align 4 store i32 %call, ptr %alloca, align 4 br label %if.merge.1 diff --git a/examples/expected/1404-ffi-jni-call-05-jlong-return.ir b/examples/expected/1404-ffi-jni-call-05-jlong-return.ir index 0344725..dbc0bb0 100644 --- a/examples/expected/1404-ffi-jni-call-05-jlong-return.ir +++ b/examples/expected/1404-ffi-jni-call-05-jlong-return.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -658,12 +658,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca i64, align 8 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call i64 @read_long(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca i64, align 8 store i64 %call, ptr %alloca, align 8 br label %if.merge.1 diff --git a/examples/expected/1405-ffi-jni-call-06-jdouble-return.ir b/examples/expected/1405-ffi-jni-call-06-jdouble-return.ir index 26558b7..5c28303 100644 --- a/examples/expected/1405-ffi-jni-call-06-jdouble-return.ir +++ b/examples/expected/1405-ffi-jni-call-06-jdouble-return.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -658,12 +658,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca double, align 8 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call double @read_double(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca double, align 8 store double %call, ptr %alloca, align 8 br label %if.merge.1 diff --git a/examples/expected/1406-ffi-jni-call-07-jboolean-return.ir b/examples/expected/1406-ffi-jni-call-07-jboolean-return.ir index aca6390..e3eb6be 100644 --- a/examples/expected/1406-ffi-jni-call-07-jboolean-return.ir +++ b/examples/expected/1406-ffi-jni-call-07-jboolean-return.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -658,12 +658,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca i1, align 1 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call i1 @read_bool(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca i1, align 1 store i1 %call, ptr %alloca, align 1 br label %if.merge.1 diff --git a/examples/expected/1407-ffi-jni-call-08-jobject-return.ir b/examples/expected/1407-ffi-jni-call-08-jobject-return.ir index 65ca09b..4a2d4b2 100644 --- a/examples/expected/1407-ffi-jni-call-08-jobject-return.ir +++ b/examples/expected/1407-ffi-jni-call-08-jobject-return.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -658,12 +658,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca ptr, align 8 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call ptr @get_window(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca ptr, align 8 store ptr %call, ptr %alloca, align 8 br label %if.merge.1 diff --git a/examples/expected/1408-ffi-jni-call-09-static.ir b/examples/expected/1408-ffi-jni-call-09-static.ir index 5e92c38..4309382 100644 --- a/examples/expected/1408-ffi-jni-call-09-static.ir +++ b/examples/expected/1408-ffi-jni-call-09-static.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -655,12 +655,12 @@ jni.cont: ; preds = %jni.miss, %entry ; Function Attrs: nounwind define i32 @main() #0 { entry: + %alloca = alloca i32, align 4 %gload = load i1, ptr @g_should_call, align 1 br i1 %gload, label %if.then.0, label %if.merge.1 if.then.0: ; preds = %entry %call = call i32 @call_static_max(ptr @__sx_default_context, ptr null, ptr null) - %alloca = alloca i32, align 4 store i32 %call, ptr %alloca, align 4 br label %if.merge.1 diff --git a/examples/expected/1418-ffi-jni-class-08-call.ir b/examples/expected/1418-ffi-jni-class-08-call.ir index 20eb039..33220cf 100644 --- a/examples/expected/1418-ffi-jni-class-08-call.ir +++ b/examples/expected/1418-ffi-jni-class-08-call.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 @@ -620,6 +620,7 @@ if.merge.38: ; preds = %if.then.37, %while. define internal void @unused_jni(ptr %0, ptr %1, ptr %2) #0 { entry: %alloca = alloca ptr, align 8 + %allocaN = alloca ptr, align 8 store ptr %1, ptr %alloca, align 8 %allocaN = alloca ptr, align 8 store ptr %2, ptr %allocaN, align 8 @@ -651,7 +652,6 @@ jni.cont: ; preds = %jni.miss, %entry %6 = getelementptr inbounds ptr, ptr %jni.ifs, i32 34 %jni.callfn = load ptr, ptr %6, align 8 %jni.ret = call ptr %jni.callfn(ptr %load, ptr %loadN, ptr %jni.mid) - %allocaN = alloca ptr, align 8 store ptr %jni.ret, ptr %allocaN, align 8 call void @sx_jni_env_tl_set(ptr %call) ret void diff --git a/examples/expected/1421-ffi-jni-env-02-lexical-direct.ir b/examples/expected/1421-ffi-jni-env-02-lexical-direct.ir index ad00e91..7b18dfd 100644 --- a/examples/expected/1421-ffi-jni-env-02-lexical-direct.ir +++ b/examples/expected/1421-ffi-jni-env-02-lexical-direct.ir @@ -149,6 +149,11 @@ entry: define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 { entry: %alloca = alloca i64, align 8 + %allocaN = alloca i1, align 1 + %allocaN = alloca { ptr, i64 }, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 + %allocaN = alloca i64, align 8 store i64 %1, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 @@ -160,15 +165,11 @@ if.then.16: ; preds = %entry if.merge.17: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %icmpN = icmp slt i64 %loadN, 0 - %allocaN = alloca i1, align 1 store i1 %icmpN, ptr %allocaN, align 1 %call = call { ptr, i64 } @cstring(ptr %0, i64 20) - %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 - %allocaN = alloca i64, align 8 store i64 19, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 - %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 br label %while.hdr.18 @@ -180,7 +181,6 @@ while.hdr.18: ; preds = %if.merge.22, %if.me while.body.19: ; preds = %while.hdr.18 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 - %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 diff --git a/issues/0109-loop-body-alloca-stack-growth.md b/issues/0109-loop-body-alloca-stack-growth.md new file mode 100644 index 0000000..98e4059 --- /dev/null +++ b/issues/0109-loop-body-alloca-stack-growth.md @@ -0,0 +1,136 @@ +# RESOLVED — 0109: allocas inside loop bodies accumulate stack per iteration + +**Root cause:** `emitAlloca` (and ~18 sibling `LLVMBuildAlloca` temp sites in the +LLVM backend) built allocas at the builder's current position. An alloca inside a +loop body re-executes per iteration and LLVM reclaims allocas only at `ret`, so +the frame grew with the trip count — body locals, nested-loop index slots, and +spill temps (`ig.tmp` etc.) all segfaulted long loops on stack exhaustion. + +**Fix:** new `LLVMEmitter.buildEntryAlloca` (src/ir/emit_llvm.zig) builds every +per-instruction alloca in the function's entry block (after existing entry +allocas, builder position restored); all `LLVMBuildAlloca` sites reachable +during instruction emission in src/backend/llvm/ops.zig, src/backend/llvm/abi.zig +and src/ir/emit_llvm.zig route through it. Initialization stores stay at the +use site, so per-iteration re-init semantics are unchanged; entry-block slots +are also mem2reg-promotable. ~35 `.ir` snapshots churned (pure alloca position +moves — verified type-multiset-identical per file). + +**Regression test:** `examples/0047-basic-loop-local-stack-reuse.sx` (1M-iteration +body-local loop prints `sum=499999500000`; 3M-iteration nested loop prints +`n=3000000`; both segfaulted pre-fix). + +--- + +# 0109 — allocas inside loop bodies accumulate stack per iteration → segfault on long loops + +**Symptom.** Any `alloca` that lands inside a loop's body block executes anew +on every iteration, and LLVM stack allocas are only reclaimed at function +return — so the frame grows monotonically with the trip count. Observed: a +1M-iteration loop with a body-local array segfaults (stack overflow, fault +address at the guard page); so does a 3M-iteration nested loop with **no user +locals at all** (the inner loop's hidden index slot is itself a body-block +alloca of the outer loop). Expected: loop-local storage is reused across +iterations; stack usage is static per frame regardless of trip count. + +This hits three shapes, all confirmed: + +1. user locals declared in a loop body (`buf : [128]s64 = ---;`), +2. nested loops (inner `for`'s `idx_slot` alloca sits in the outer body), +3. compiler temporaries spilled in the body (e.g. `index_get`'s `ig.tmp` — + see issue 0110 for the for-over-array case specifically). + +## Reproduction + +Repro A — body local (`issues/0109-loop-body-alloca-stack-growth.sx`): + +```sx +#import "modules/std.sx"; + +main :: () -> s32 { + sum := 0; + for 0..1000000: (i) { + buf : [128]s64 = ---; + buf[0] = i; + sum += buf[0]; + } + print("sum={}\n", sum); + 0 +} +``` + +- **Observed**: `Segmentation fault at address 0x16e70ffd0` (guard page). + With `0..1000` instead it prints `sum=499500` and exits 0 — the program is + correct, only the stack accumulation kills it. +- **Expected**: prints `sum=499999500000`, exit 0, at any trip count. + +Repro B — pure nested loops, zero user locals: + +```sx +#import "modules/std.sx"; + +main :: () -> s32 { + n := 0; + for 0..3000000: (i) { + for 0..1: (j) { n += 1; } + } + print("n={}\n", n); + 0 +} +``` + +- **Observed**: segfault. **Expected**: `n=3000000`, exit 0. + +The emitted IR shows the cause directly (`sx ir`, body of repro A): + +```llvm +for.body.1: + %alloca2 = alloca [128 x i64], align 8 ; fresh 1KB every iteration + ... + %ig.tmp = alloca [128 x i64], align 8 ; plus a 1KB spill temp +``` + +## Root cause (suspected area) + +`Builder.alloca` (`src/ir/module.zig` ~474) emits the `.alloca` instruction +into the current block, and the LLVM emitter (`src/backend/llvm/ops.zig` +`emitAlloca` ~327) builds `LLVMBuildAlloca` at the current insertion point — +so loop-body allocas are *executed* per iteration. LLVM only treats +entry-block allocas as static frame slots (and mem2reg/SROA only promote +those); a non-entry alloca re-executes and grows the stack each time, until +`ret`. + +The standard fix (what clang does): emit **all** static allocas into the +function's entry block. Least-invasive locus is the emitter — in +`emitAlloca`, save the current insertion point, position the builder at the +entry block's first non-alloca instruction (or end of entry if empty), build +the alloca there, restore the position, `mapRef` as before. The IR shape and +the interpreter are untouched. All sx allocas are statically sized (TypeId), +so every one is hoistable. + +## Investigation prompt (paste into a fresh session) + +> Fix issue 0109: loop-body allocas grow the stack per iteration and long +> loops segfault. In `src/backend/llvm/ops.zig` `emitAlloca` (~327), hoist the +> alloca to the current function's entry block: get the function via the +> current insert block's parent, position the builder before the entry +> block's first non-alloca instruction (`LLVMGetEntryBasicBlock` + +> `LLVMGetFirstInstruction` walk past `LLVMAlloca` opcodes — same positioning +> pattern as `injectCtorIntoMain` in `src/ir/emit_llvm.zig` ~466), build the +> alloca + `mapRef`, then restore the previous insertion point +> (`LLVMGetInsertBlock` before / `LLVMPositionBuilderAtEnd` after). Audit the +> other in-place `LLVMBuildAlloca` temporaries in `src/ir/emit_llvm.zig` +> (`ba.tmp`, `abi.tmp`, `ig.tmp`, etc. — grep `BuildAlloca`) and route the +> ones reachable inside loops through the same hoist helper. +> +> Semantics note: per-iteration re-zeroing must not regress — initialization +> stores (e.g. `store undef` / `= .{...}` inits) stay where the decl was, in +> the body block; only the `alloca` itself moves to entry. +> +> Verify: both repros in `issues/0109-loop-body-alloca-stack-growth.md` (A is +> `issues/0109-loop-body-alloca-stack-growth.sx`) now print +> `sum=499999500000` / `n=3000000` and exit 0; `sx ir` on repro A shows no +> `alloca` inside `for.body.*`. Then `zig build && zig build test && bash +> tests/run_examples.sh` — any `.ir` snapshot churn from alloca placement must +> be reviewed (`git diff examples/expected/`) before `--update`. Promote a +> trip-count-bounded variant (e.g. 200k iterations, small buf) to +> `examples/00xx-basic-loop-local-stack-reuse.sx` as the pinned regression. diff --git a/src/backend/llvm/abi.zig b/src/backend/llvm/abi.zig index e02ca48..7247917 100644 --- a/src/backend/llvm/abi.zig +++ b/src/backend/llvm/abi.zig @@ -116,7 +116,7 @@ pub const AbiLowering = struct { } pub fn materializeByvalArg(self: AbiLowering, val: c.LLVMValueRef, struct_ty: c.LLVMTypeRef) c.LLVMValueRef { - const tmp = c.LLVMBuildAlloca(self.e.builder, struct_ty, "byval.tmp"); + const tmp = self.e.buildEntryAlloca(struct_ty, "byval.tmp"); _ = c.LLVMBuildStore(self.e.builder, val, tmp); return tmp; } diff --git a/src/backend/llvm/ops.zig b/src/backend/llvm/ops.zig index f7865bd..a22b8b6 100644 --- a/src/backend/llvm/ops.zig +++ b/src/backend/llvm/ops.zig @@ -326,7 +326,7 @@ pub const Ops = struct { // ── Memory ──────────────────────────────────────────── pub fn emitAlloca(self: Ops, elem_ty: TypeId) void { const llvm_ty = self.e.toLLVMType(elem_ty); - const result = c.LLVMBuildAlloca(self.e.builder, llvm_ty, "alloca"); + const result = self.e.buildEntryAlloca(llvm_ty, "alloca"); self.e.mapRef(result); } @@ -503,7 +503,7 @@ pub const Ops = struct { var sret_slot: c.LLVMValueRef = null; if (uses_sret) { - sret_slot = c.LLVMBuildAlloca(self.e.builder, raw_ret_ty, "objc.sret"); + sret_slot = self.e.buildEntryAlloca(raw_ret_ty, "objc.sret"); param_types[0] = self.e.cached_ptr; call_args[0] = sret_slot; } @@ -710,7 +710,7 @@ pub const Ops = struct { // outer phi shape. Instead, return both via tuple // through an auxiliary local — simplest is to attach // `cls` to a per-invocation slot. Use a stack alloca. - const cls_slot = c.LLVMBuildAlloca(self.e.builder, self.e.cached_ptr, "jni.parent.cls.slot"); + const cls_slot = self.e.buildEntryAlloca(self.e.cached_ptr, "jni.parent.cls.slot"); _ = c.LLVMBuildStore(self.e.builder, cls, cls_slot); // Tag the slot pointer onto the phi result via the // generated metadata: we'll re-extract by re-running @@ -814,7 +814,7 @@ pub const Ops = struct { defer self.e.alloc.free(args); var sret_slot: c.LLVMValueRef = null; if (callee_uses_sret) { - sret_slot = c.LLVMBuildAlloca(self.e.builder, callee_raw_ret, "sret.slot"); + sret_slot = self.e.buildEntryAlloca(callee_raw_ret, "sret.slot"); args[0] = sret_slot; } for (call_op.args, 0..) |arg_ref, j| { @@ -1345,7 +1345,7 @@ pub const Ops = struct { const payload_val = self.e.resolveRef(ei.payload); // alloca union, store tag, bitcast payload area, store payload - const tmp = c.LLVMBuildAlloca(self.e.builder, union_ty, "ei.tmp"); + const tmp = self.e.buildEntryAlloca(union_ty, "ei.tmp"); // Store tag at field 0 const tag_ptr = c.LLVMBuildStructGEP2(self.e.builder, union_ty, tmp, 0, "ei.tagp"); _ = c.LLVMBuildStore(self.e.builder, tag_val, tag_ptr); @@ -1389,7 +1389,7 @@ pub const Ops = struct { const base_kind = c.LLVMGetTypeKind(base_ty); if (base_kind == c.LLVMStructTypeKind) { // Tagged union: alloca, store, GEP field 1 (payload area), bitcast, load - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "ep.tmp"); + const tmp = self.e.buildEntryAlloca(base_ty, "ep.tmp"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); const payload_ptr = c.LLVMBuildStructGEP2(self.e.builder, base_ty, tmp, 1, "ep.pp"); const typed_ptr = c.LLVMBuildBitCast(self.e.builder, payload_ptr, self.e.cached_ptr, "ep.cast"); @@ -1408,13 +1408,13 @@ pub const Ops = struct { const kind = c.LLVMGetTypeKind(base_ty); if (kind == c.LLVMStructTypeKind) { // Tagged union { header, payload_bytes } — access payload at field 1 - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "ug.tmp"); + const tmp = self.e.buildEntryAlloca(base_ty, "ug.tmp"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); const payload_ptr = c.LLVMBuildStructGEP2(self.e.builder, base_ty, tmp, 1, "ug.pp"); self.e.mapRef(c.LLVMBuildLoad2(self.e.builder, result_ty, payload_ptr, "ug.val")); } else { // Untagged union [N x i8] — alloca, store, reinterpret-load - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "ug.tmp"); + const tmp = self.e.buildEntryAlloca(base_ty, "ug.tmp"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); self.e.mapRef(c.LLVMBuildLoad2(self.e.builder, result_ty, tmp, "ug.val")); } @@ -1455,7 +1455,7 @@ pub const Ops = struct { self.e.mapRef(c.LLVMBuildExtractElement(self.e.builder, base, idx32, "ve")); } else if (kind == c.LLVMArrayTypeKind) { // Fixed-size array value — alloca, store, GEP, load - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "ig.tmp"); + const tmp = self.e.buildEntryAlloca(base_ty, "ig.tmp"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); const elem_ty = self.e.toLLVMType(instruction.ty); var indices = [_]c.LLVMValueRef{ c.LLVMConstInt(self.e.cached_i64, 0, 0), idx }; @@ -1487,7 +1487,7 @@ pub const Ops = struct { const kind = c.LLVMGetTypeKind(base_ty); if (kind == c.LLVMArrayTypeKind) { // Fixed-size array value — alloca, store, GEP - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "igp.tmp"); + const tmp = self.e.buildEntryAlloca(base_ty, "igp.tmp"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); var indices = [_]c.LLVMValueRef{ c.LLVMConstInt(self.e.cached_i64, 0, 0), idx }; self.e.mapRef(c.LLVMBuildGEP2(self.e.builder, base_ty, tmp, &indices, 2, "igp.ptr")); @@ -1587,7 +1587,7 @@ pub const Ops = struct { self.e.mapRef(result); } else if (base_kind == c.LLVMArrayTypeKind) { // Array: alloca, GEP to element at lo, compute len - const tmp = c.LLVMBuildAlloca(self.e.builder, base_ty, "ss.arr"); + const tmp = self.e.buildEntryAlloca(base_ty, "ss.arr"); _ = c.LLVMBuildStore(self.e.builder, base, tmp); var indices = [_]c.LLVMValueRef{ c.LLVMConstInt(self.e.cached_i64, 0, 0), lo }; const new_ptr = c.LLVMBuildGEP2(self.e.builder, base_ty, tmp, &indices, 2, "ss.ptr"); @@ -1611,7 +1611,7 @@ pub const Ops = struct { const arr_kind = c.LLVMGetTypeKind(arr_ty); if (arr_kind == c.LLVMArrayTypeKind) { const len = c.LLVMGetArrayLength2(arr_ty); - const tmp = c.LLVMBuildAlloca(self.e.builder, arr_ty, "a2s.tmp"); + const tmp = self.e.buildEntryAlloca(arr_ty, "a2s.tmp"); _ = c.LLVMBuildStore(self.e.builder, arr, tmp); var indices = [_]c.LLVMValueRef{ c.LLVMConstInt(self.e.cached_i64, 0, 0), c.LLVMConstInt(self.e.cached_i64, 0, 0) }; const elem_ptr = c.LLVMBuildGEP2(self.e.builder, arr_ty, tmp, &indices, 2, "a2s.ptr"); diff --git a/src/ir/emit_llvm.zig b/src/ir/emit_llvm.zig index 48a68b8..966c34d 100644 --- a/src/ir/emit_llvm.zig +++ b/src/ir/emit_llvm.zig @@ -1386,6 +1386,33 @@ pub const LLVMEmitter = struct { self.debugInfo().endFunctionDebug(); } + /// Build an alloca in the current function's ENTRY block, not at the + /// builder's position. An alloca executed inside a loop body allocates + /// fresh stack on every iteration (LLVM only reclaims at `ret`), so any + /// alloca reachable per-instruction must be hoisted here; only entry-block + /// allocas are static frame slots (and mem2reg-promotable). Insertion goes + /// after existing entry allocas; the builder position is restored. + pub fn buildEntryAlloca(self: *LLVMEmitter, ty: c.LLVMTypeRef, name: [*:0]const u8) c.LLVMValueRef { + const cur_bb = c.LLVMGetInsertBlock(self.builder); + const func = c.LLVMGetBasicBlockParent(cur_bb); + const entry_bb = c.LLVMGetEntryBasicBlock(func); + if (entry_bb == cur_bb) { + return c.LLVMBuildAlloca(self.builder, ty, name); + } + var insert_before = c.LLVMGetFirstInstruction(entry_bb); + while (insert_before != null) : (insert_before = c.LLVMGetNextInstruction(insert_before)) { + if (c.LLVMGetInstructionOpcode(insert_before) != c.LLVMAlloca) break; + } + if (insert_before != null) { + c.LLVMPositionBuilderBefore(self.builder, insert_before); + } else { + c.LLVMPositionBuilderAtEnd(self.builder, entry_bb); + } + const result = c.LLVMBuildAlloca(self.builder, ty, name); + c.LLVMPositionBuilderAtEnd(self.builder, cur_bb); + return result; + } + /// After emitting all blocks, fill in PHI incoming values from branch args. fn fixupPhiNodes(self: *LLVMEmitter, func: *const Function, func_idx: u32) void { if (self.pending_phis.items.len == 0) return; @@ -2101,7 +2128,7 @@ pub const LLVMEmitter = struct { } // Struct/Array/Vector types: store to alloca, ptrtoint for the pointer if (kind == c.LLVMStructTypeKind or kind == c.LLVMArrayTypeKind or kind == c.LLVMVectorTypeKind or kind == c.LLVMScalableVectorTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, ty, "ba.tmp"); + const tmp = self.buildEntryAlloca(ty, "ba.tmp"); _ = c.LLVMBuildStore(self.builder, val, tmp); return c.LLVMBuildPtrToInt(self.builder, tmp, self.cached_i64, "ba.p2i"); } @@ -2279,14 +2306,14 @@ pub const LLVMEmitter = struct { } // Struct → Integer (C ABI coercion: store struct to memory, load as integer) if (val_kind == c.LLVMStructTypeKind and param_kind == c.LLVMIntegerTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, param_ty, "abi.tmp"); + const tmp = self.buildEntryAlloca(param_ty, "abi.tmp"); _ = c.LLVMBuildStore(self.builder, c.LLVMConstNull(param_ty), tmp); _ = c.LLVMBuildStore(self.builder, val, tmp); return c.LLVMBuildLoad2(self.builder, param_ty, tmp, "abi.coerce"); } // Integer → Struct (C ABI return coercion: store integer to memory, load as struct) if (val_kind == c.LLVMIntegerTypeKind and param_kind == c.LLVMStructTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, val_ty, "abi.ret.tmp"); + const tmp = self.buildEntryAlloca(val_ty, "abi.ret.tmp"); _ = c.LLVMBuildStore(self.builder, val, tmp); return c.LLVMBuildLoad2(self.builder, param_ty, tmp, "abi.ret.coerce"); } @@ -2295,19 +2322,19 @@ pub const LLVMEmitter = struct { // memory-bitcast pattern as the integer case; the array type carries // 16 bytes of storage so we alloca with param_ty to guarantee size. if (val_kind == c.LLVMStructTypeKind and param_kind == c.LLVMArrayTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, param_ty, "abi.struct2arr"); + const tmp = self.buildEntryAlloca(param_ty, "abi.struct2arr"); _ = c.LLVMBuildStore(self.builder, val, tmp); return c.LLVMBuildLoad2(self.builder, param_ty, tmp, "abi.coerce.arr"); } // Array → Struct (return-side counterpart for 9..16-byte structs) if (val_kind == c.LLVMArrayTypeKind and param_kind == c.LLVMStructTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, val_ty, "abi.arr2struct"); + const tmp = self.buildEntryAlloca(val_ty, "abi.arr2struct"); _ = c.LLVMBuildStore(self.builder, val, tmp); return c.LLVMBuildLoad2(self.builder, param_ty, tmp, "abi.ret.coerce.arr"); } // Array → Ptr (array decay: alloca + GEP to first element) if (val_kind == c.LLVMArrayTypeKind and param_kind == c.LLVMPointerTypeKind) { - const tmp = c.LLVMBuildAlloca(self.builder, val_ty, "ca.arr"); + const tmp = self.buildEntryAlloca(val_ty, "ca.arr"); _ = c.LLVMBuildStore(self.builder, val, tmp); const zero = c.LLVMConstInt(self.cached_i64, 0, 0); var indices = [_]c.LLVMValueRef{ zero, zero }; @@ -2720,7 +2747,7 @@ pub const LLVMEmitter = struct { field_val = c.LLVMConstInt(self.cached_i64, 0, 0); } else { const base_ty = c.LLVMTypeOf(base_val); - const tmp = c.LLVMBuildAlloca(self.builder, base_ty, "fv.utmp"); + const tmp = self.buildEntryAlloca(base_ty, "fv.utmp"); _ = c.LLVMBuildStore(self.builder, base_val, tmp); const payload_ptr = c.LLVMBuildStructGEP2(self.builder, base_ty, tmp, 1, "fv.pp"); const field_llvm_ty = self.toLLVMType(field.ty);