From 837b5d375ff493d8eff16068a04cd669d5426578 Mon Sep 17 00:00:00 2001 From: agra Date: Fri, 12 Jun 2026 08:19:20 +0300 Subject: [PATCH] fix(0124): large stack arrays lower to in-place access, not first-class values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two lowering sites materialized a local array as a whole LLVM value; the legalizer scalarizes each such op into one SelectionDAG node per element, and at ~64K elements the DAG combiner segfaults (DAGCombiner::visitMERGE_VALUES → ReplaceAllUsesWith). - lowerVarDecl: an array-typed `---` initializer emits NO store — the slot stays uninitialized instead of receiving a whole-array undef store. The tuple zero-init carve-out stays; non-array `---` keeps the undef store. The interp is unchanged either way (slots start .undef). - lowerIndexExpr: element reads on an array with addressable storage GEP the storage and load one element — the general-expression sibling of 0110's lowerFor fix — without value-lowering the object (a dead whole-array load would still reach the DAG). Storage-less arrays keep the index_get fallback. Sibling shape filed as 0125: any_to_string's per-array-type arms still pass the array by value, so a 64K+ array type + any {} print crashes. Regression: examples/0055-basic-large-stack-array.sx (sx build segfaulted pre-fix). 22 .ir snapshots re-pinned: removed undef stores and ig.tmp spills, in-place gep+load (instruction-shape-only churn, reviewed). --- examples/0055-basic-large-stack-array.sx | 45 +++++++++ .../expected/0031-basic-local-fn-return.ir | 96 +++++++------------ .../expected/0032-basic-ufcs-return-type.ir | 96 +++++++------------ .../0044-basic-default-arg-expansion.ir | 96 +++++++------------ .../0055-basic-large-stack-array.exit | 1 + .../0055-basic-large-stack-array.stderr | 1 + .../0055-basic-large-stack-array.stdout | 2 + .../0107-types-int-cmp-in-float-ternary.ir | 96 +++++++------------ examples/expected/0200-generics-generic.ir | 96 +++++++------------ .../expected/0201-generics-generic-struct.ir | 96 +++++++------------ .../expected/0301-closures-fn-pointers.ir | 96 +++++++------------ .../0400-protocols-impl-for-builtin.ir | 96 +++++++------------ ...-protocols-parameterized-protocol-value.ir | 96 +++++++------------ ...protocols-generic-struct-protocol-erase.ir | 96 +++++++------------ .../0416-protocols-auto-type-erasure.ir | 96 +++++++------------ .../expected/0507-packs-pack-mono-dedup.ir | 96 +++++++------------ .../0513-packs-pack-mixed-comptime.ir | 96 +++++++------------ .../0518-packs-pack-value-dispatch.ir | 96 +++++++------------ .../0528-packs-protocol-pack-methods.ir | 96 +++++++------------ .../0903-optionals-optional-roundtrip.ir | 96 +++++++------------ .../0904-optionals-any-to-string-optional.ir | 96 +++++++------------ examples/expected/1004-errors-try.ir | 96 +++++++------------ .../1006-errors-inferred-error-sets.ir | 96 +++++++------------ examples/expected/1009-errors-catch.ir | 96 +++++++------------ .../1319-ffi-objc-property-sx-defined.ir | 96 +++++++------------ .../1332-ffi-objc-call-06-sret-return.ir | 96 +++++++------------ ...ge-stack-array-aggregate-ops-crash-llvm.md | 24 ++++- src/ir/lower/expr.zig | 19 +++- src/ir/lower/stmt.zig | 12 ++- 29 files changed, 848 insertions(+), 1368 deletions(-) create mode 100644 examples/0055-basic-large-stack-array.sx create mode 100644 examples/expected/0055-basic-large-stack-array.exit create mode 100644 examples/expected/0055-basic-large-stack-array.stderr create mode 100644 examples/expected/0055-basic-large-stack-array.stdout diff --git a/examples/0055-basic-large-stack-array.sx b/examples/0055-basic-large-stack-array.sx new file mode 100644 index 0000000..9445c80 --- /dev/null +++ b/examples/0055-basic-large-stack-array.sx @@ -0,0 +1,45 @@ +// Large (64KB+) stack arrays compile and are accessed in place: `---` +// emits no initializer store, and element reads GEP the array's storage +// instead of loading the whole array as a value. +// +// Regression (issue 0124): both whole-aggregate shapes — the undef +// store from `---` and `index_get` on the loaded array value — +// scalarized into one SelectionDAG node per element and segfaulted +// `sx build` at [65536]u8. +// +// Results print via out/int_to_string: `{}` formatting would pull the +// any_to_string dispatcher, whose array arms materialize every interned +// array type BY VALUE — the separate issue 0125. + +#import "modules/std.sx"; + +checksum :: () -> s64 { + buf : [65536]u8 = ---; + i := 0; + while i < 65536 { + buf[i] = xx (i % 251); + i += 1; + } + sum := 0; + i = 0; + while i < 65536 { + sum += xx buf[i]; + i += 1; + } + return sum; +} + +big :: () -> s64 { + buf : [131072]s64 = ---; + buf[0] = 11; + buf[131071] = 31; + return buf[0] + buf[131071]; +} + +main :: () -> s32 { + out(int_to_string(checksum())); + out("\n"); + out(int_to_string(big())); + out("\n"); + return 0; +} diff --git a/examples/expected/0031-basic-local-fn-return.ir b/examples/expected/0031-basic-local-fn-return.ir index 02957ae..c1afc4a 100644 --- a/examples/expected/0031-basic-local-fn-return.ir +++ b/examples/expected/0031-basic-local-fn-return.ir @@ -817,13 +817,8 @@ entry: %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 @@ -843,11 +838,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -865,11 +858,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -877,11 +868,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -889,11 +878,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -908,18 +895,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -934,9 +919,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1258,7 +1243,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1281,10 +1265,6 @@ 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 @@ -1301,29 +1281,21 @@ if.merge.411: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.418 @@ -1336,9 +1308,9 @@ while.body.419: ; preds = %while.hdr.418 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.421, label %if.merge.422 diff --git a/examples/expected/0032-basic-ufcs-return-type.ir b/examples/expected/0032-basic-ufcs-return-type.ir index 2d96337..df2336b 100644 --- a/examples/expected/0032-basic-ufcs-return-type.ir +++ b/examples/expected/0032-basic-ufcs-return-type.ir @@ -785,13 +785,8 @@ entry: %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 @@ -811,11 +806,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -833,11 +826,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -845,11 +836,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -857,11 +846,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -876,18 +863,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -902,9 +887,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1226,7 +1211,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1249,10 +1233,6 @@ 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 @@ -1269,29 +1249,21 @@ if.merge.394: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.401 @@ -1304,9 +1276,9 @@ while.body.402: ; preds = %while.hdr.401 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.404, label %if.merge.405 diff --git a/examples/expected/0044-basic-default-arg-expansion.ir b/examples/expected/0044-basic-default-arg-expansion.ir index f01dce2..32037a8 100644 --- a/examples/expected/0044-basic-default-arg-expansion.ir +++ b/examples/expected/0044-basic-default-arg-expansion.ir @@ -762,13 +762,8 @@ entry: %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 @@ -788,11 +783,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -810,11 +803,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -822,11 +813,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -834,11 +823,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -853,18 +840,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -879,9 +864,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1203,7 +1188,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1226,10 +1210,6 @@ 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 @@ -1246,29 +1226,21 @@ if.merge.376: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.383 @@ -1281,9 +1253,9 @@ while.body.384: ; preds = %while.hdr.383 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.386, label %if.merge.387 diff --git a/examples/expected/0055-basic-large-stack-array.exit b/examples/expected/0055-basic-large-stack-array.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/examples/expected/0055-basic-large-stack-array.exit @@ -0,0 +1 @@ +0 diff --git a/examples/expected/0055-basic-large-stack-array.stderr b/examples/expected/0055-basic-large-stack-array.stderr new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/expected/0055-basic-large-stack-array.stderr @@ -0,0 +1 @@ + diff --git a/examples/expected/0055-basic-large-stack-array.stdout b/examples/expected/0055-basic-large-stack-array.stdout new file mode 100644 index 0000000..a02ed8e --- /dev/null +++ b/examples/expected/0055-basic-large-stack-array.stdout @@ -0,0 +1,2 @@ +8189175 +42 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 9456819..be5ae0f 100644 --- a/examples/expected/0107-types-int-cmp-in-float-ternary.ir +++ b/examples/expected/0107-types-int-cmp-in-float-ternary.ir @@ -747,13 +747,8 @@ entry: %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 @@ -773,11 +768,9 @@ if.merge.62: ; preds = %entry br label %while.hdr.71 while.hdr.71: ; preds = %while.exit.82, %if.merge.62 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.75, label %or.rhs.74 while.body.72: ; preds = %or.merge.79 @@ -795,11 +788,9 @@ while.exit.73: ; preds = %or.merge.79 ret { ptr, i64 } %callN or.rhs.74: ; preds = %while.hdr.71 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.75 or.merge.75: ; preds = %or.rhs.74, %while.hdr.71 @@ -807,11 +798,9 @@ or.merge.75: ; preds = %or.rhs.74, %while.h br i1 %bp, label %or.merge.77, label %or.rhs.76 or.rhs.76: ; preds = %or.merge.75 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.77 or.merge.77: ; preds = %or.rhs.76, %or.merge.75 @@ -819,11 +808,9 @@ or.merge.77: ; preds = %or.rhs.76, %or.merg br i1 %bpN, label %or.merge.79, label %or.rhs.78 or.rhs.78: ; preds = %or.merge.77 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.79 or.merge.79: ; preds = %or.rhs.78, %or.merge.77 @@ -838,18 +825,16 @@ while.hdr.80: ; preds = %while.body.81, %whi while.body.81: ; preds = %while.hdr.80 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -864,9 +849,9 @@ while.exit.82: ; preds = %while.hdr.80 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1188,7 +1173,6 @@ if.then.69: ; preds = %if.merge.68 br label %if.merge.70 if.merge.70: ; preds = %if.then.69, %if.merge.68 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1211,10 +1195,6 @@ 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 @@ -1231,29 +1211,21 @@ if.merge.375: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.382 @@ -1266,9 +1238,9 @@ while.body.383: ; preds = %while.hdr.382 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.385, label %if.merge.386 diff --git a/examples/expected/0200-generics-generic.ir b/examples/expected/0200-generics-generic.ir index 572f708..e8414ad 100644 --- a/examples/expected/0200-generics-generic.ir +++ b/examples/expected/0200-generics-generic.ir @@ -748,13 +748,8 @@ entry: %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 @@ -774,11 +769,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -796,11 +789,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -808,11 +799,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -820,11 +809,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -839,18 +826,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -865,9 +850,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1189,7 +1174,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1212,10 +1196,6 @@ 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 @@ -1232,29 +1212,21 @@ if.merge.370: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.377 @@ -1267,9 +1239,9 @@ while.body.378: ; preds = %while.hdr.377 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.380, label %if.merge.381 diff --git a/examples/expected/0201-generics-generic-struct.ir b/examples/expected/0201-generics-generic-struct.ir index f838637..923526c 100644 --- a/examples/expected/0201-generics-generic-struct.ir +++ b/examples/expected/0201-generics-generic-struct.ir @@ -884,13 +884,8 @@ entry: %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 @@ -910,11 +905,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -932,11 +925,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -944,11 +935,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -956,11 +945,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -975,18 +962,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -1001,9 +986,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1325,7 +1310,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1348,10 +1332,6 @@ 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 @@ -1368,29 +1348,21 @@ if.merge.435: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.442 @@ -1403,9 +1375,9 @@ while.body.443: ; preds = %while.hdr.442 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.445, label %if.merge.446 diff --git a/examples/expected/0301-closures-fn-pointers.ir b/examples/expected/0301-closures-fn-pointers.ir index a110b07..edf83eb 100644 --- a/examples/expected/0301-closures-fn-pointers.ir +++ b/examples/expected/0301-closures-fn-pointers.ir @@ -753,13 +753,8 @@ entry: %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 @@ -779,11 +774,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -801,11 +794,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -813,11 +804,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -825,11 +814,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -844,18 +831,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -870,9 +855,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1194,7 +1179,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1217,10 +1201,6 @@ 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 @@ -1237,29 +1217,21 @@ if.merge.370: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.377 @@ -1272,9 +1244,9 @@ while.body.378: ; preds = %while.hdr.377 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.380, label %if.merge.381 diff --git a/examples/expected/0400-protocols-impl-for-builtin.ir b/examples/expected/0400-protocols-impl-for-builtin.ir index 01dbf1a..a1aac8a 100644 --- a/examples/expected/0400-protocols-impl-for-builtin.ir +++ b/examples/expected/0400-protocols-impl-for-builtin.ir @@ -833,13 +833,8 @@ entry: %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 @@ -859,11 +854,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -881,11 +874,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -893,11 +884,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -905,11 +894,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -924,18 +911,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -950,9 +935,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1274,7 +1259,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1297,10 +1281,6 @@ 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 @@ -1317,29 +1297,21 @@ if.merge.378: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.385 @@ -1352,9 +1324,9 @@ while.body.386: ; preds = %while.hdr.385 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.388, label %if.merge.389 diff --git a/examples/expected/0413-protocols-parameterized-protocol-value.ir b/examples/expected/0413-protocols-parameterized-protocol-value.ir index 88e1fcf..bc66bca 100644 --- a/examples/expected/0413-protocols-parameterized-protocol-value.ir +++ b/examples/expected/0413-protocols-parameterized-protocol-value.ir @@ -835,13 +835,8 @@ entry: %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 @@ -861,11 +856,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -883,11 +876,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -895,11 +886,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -907,11 +896,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -926,18 +913,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -952,9 +937,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1276,7 +1261,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1299,10 +1283,6 @@ 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 @@ -1319,29 +1299,21 @@ if.merge.413: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.420 @@ -1354,9 +1326,9 @@ while.body.421: ; preds = %while.hdr.420 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.423, label %if.merge.424 diff --git a/examples/expected/0414-protocols-generic-struct-protocol-erase.ir b/examples/expected/0414-protocols-generic-struct-protocol-erase.ir index 4232884..5f68c46 100644 --- a/examples/expected/0414-protocols-generic-struct-protocol-erase.ir +++ b/examples/expected/0414-protocols-generic-struct-protocol-erase.ir @@ -840,13 +840,8 @@ entry: %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 @@ -866,11 +861,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -888,11 +881,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -900,11 +891,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -912,11 +901,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -931,18 +918,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -957,9 +942,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1281,7 +1266,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1304,10 +1288,6 @@ 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 @@ -1324,29 +1304,21 @@ if.merge.424: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.431 @@ -1359,9 +1331,9 @@ while.body.432: ; preds = %while.hdr.431 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.434, label %if.merge.435 diff --git a/examples/expected/0416-protocols-auto-type-erasure.ir b/examples/expected/0416-protocols-auto-type-erasure.ir index b22747c..7490b76 100644 --- a/examples/expected/0416-protocols-auto-type-erasure.ir +++ b/examples/expected/0416-protocols-auto-type-erasure.ir @@ -891,13 +891,8 @@ entry: %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 @@ -917,11 +912,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -939,11 +932,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -951,11 +942,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -963,11 +952,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -982,18 +969,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -1008,9 +993,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1332,7 +1317,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1355,10 +1339,6 @@ 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 @@ -1375,29 +1355,21 @@ if.merge.443: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.450 @@ -1410,9 +1382,9 @@ while.body.451: ; preds = %while.hdr.450 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.453, label %if.merge.454 diff --git a/examples/expected/0507-packs-pack-mono-dedup.ir b/examples/expected/0507-packs-pack-mono-dedup.ir index dff8dbf..abb88a6 100644 --- a/examples/expected/0507-packs-pack-mono-dedup.ir +++ b/examples/expected/0507-packs-pack-mono-dedup.ir @@ -769,13 +769,8 @@ entry: %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 @@ -795,11 +790,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -817,11 +810,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -829,11 +820,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -841,11 +830,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -860,18 +847,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -886,9 +871,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1210,7 +1195,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1233,10 +1217,6 @@ 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 @@ -1253,29 +1233,21 @@ if.merge.390: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.397 @@ -1288,9 +1260,9 @@ while.body.398: ; preds = %while.hdr.397 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.400, label %if.merge.401 diff --git a/examples/expected/0513-packs-pack-mixed-comptime.ir b/examples/expected/0513-packs-pack-mixed-comptime.ir index ed22ed8..e222f0a 100644 --- a/examples/expected/0513-packs-pack-mixed-comptime.ir +++ b/examples/expected/0513-packs-pack-mixed-comptime.ir @@ -750,13 +750,8 @@ entry: %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 @@ -776,11 +771,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -798,11 +791,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -810,11 +801,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -822,11 +811,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -841,18 +828,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -867,9 +852,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1191,7 +1176,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1214,10 +1198,6 @@ 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 @@ -1234,29 +1214,21 @@ if.merge.376: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.383 @@ -1269,9 +1241,9 @@ while.body.384: ; preds = %while.hdr.383 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.386, label %if.merge.387 diff --git a/examples/expected/0518-packs-pack-value-dispatch.ir b/examples/expected/0518-packs-pack-value-dispatch.ir index 97c0866..3aabe1e 100644 --- a/examples/expected/0518-packs-pack-value-dispatch.ir +++ b/examples/expected/0518-packs-pack-value-dispatch.ir @@ -754,13 +754,8 @@ entry: %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 @@ -780,11 +775,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -802,11 +795,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -814,11 +805,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -826,11 +815,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -845,18 +832,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -871,9 +856,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1195,7 +1180,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1218,10 +1202,6 @@ 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 @@ -1238,29 +1218,21 @@ if.merge.370: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.377 @@ -1273,9 +1245,9 @@ while.body.378: ; preds = %while.hdr.377 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.380, label %if.merge.381 diff --git a/examples/expected/0528-packs-protocol-pack-methods.ir b/examples/expected/0528-packs-protocol-pack-methods.ir index 2c34e97..f4cfd96 100644 --- a/examples/expected/0528-packs-protocol-pack-methods.ir +++ b/examples/expected/0528-packs-protocol-pack-methods.ir @@ -814,13 +814,8 @@ entry: %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 @@ -840,11 +835,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -862,11 +855,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -874,11 +865,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -886,11 +875,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -905,18 +892,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -931,9 +916,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1255,7 +1240,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1278,10 +1262,6 @@ 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 @@ -1298,29 +1278,21 @@ if.merge.410: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.417 @@ -1333,9 +1305,9 @@ while.body.418: ; preds = %while.hdr.417 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.420, label %if.merge.421 diff --git a/examples/expected/0903-optionals-optional-roundtrip.ir b/examples/expected/0903-optionals-optional-roundtrip.ir index d25d2b5..d8df3bb 100644 --- a/examples/expected/0903-optionals-optional-roundtrip.ir +++ b/examples/expected/0903-optionals-optional-roundtrip.ir @@ -838,13 +838,8 @@ entry: %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 @@ -864,11 +859,9 @@ if.merge.69: ; preds = %entry br label %while.hdr.78 while.hdr.78: ; preds = %while.exit.89, %if.merge.69 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.82, label %or.rhs.81 while.body.79: ; preds = %or.merge.86 @@ -886,11 +879,9 @@ while.exit.80: ; preds = %or.merge.86 ret { ptr, i64 } %callN or.rhs.81: ; preds = %while.hdr.78 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.82 or.merge.82: ; preds = %or.rhs.81, %while.hdr.78 @@ -898,11 +889,9 @@ or.merge.82: ; preds = %or.rhs.81, %while.h br i1 %bp, label %or.merge.84, label %or.rhs.83 or.rhs.83: ; preds = %or.merge.82 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.84 or.merge.84: ; preds = %or.rhs.83, %or.merge.82 @@ -910,11 +899,9 @@ or.merge.84: ; preds = %or.rhs.83, %or.merg br i1 %bpN, label %or.merge.86, label %or.rhs.85 or.rhs.85: ; preds = %or.merge.84 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.86 or.merge.86: ; preds = %or.rhs.85, %or.merge.84 @@ -929,18 +916,16 @@ while.hdr.87: ; preds = %while.body.88, %whi while.body.88: ; preds = %while.hdr.87 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -955,9 +940,9 @@ while.exit.89: ; preds = %while.hdr.87 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1279,7 +1264,6 @@ if.then.76: ; preds = %if.merge.75 br label %if.merge.77 if.merge.77: ; preds = %if.then.76, %if.merge.75 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1302,10 +1286,6 @@ 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 @@ -1322,29 +1302,21 @@ if.merge.412: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.419 @@ -1357,9 +1329,9 @@ while.body.420: ; preds = %while.hdr.419 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.422, label %if.merge.423 diff --git a/examples/expected/0904-optionals-any-to-string-optional.ir b/examples/expected/0904-optionals-any-to-string-optional.ir index af65532..1300a49 100644 --- a/examples/expected/0904-optionals-any-to-string-optional.ir +++ b/examples/expected/0904-optionals-any-to-string-optional.ir @@ -763,13 +763,8 @@ entry: %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 @@ -789,11 +784,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -811,11 +804,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -823,11 +814,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -835,11 +824,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -854,18 +841,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -880,9 +865,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1204,7 +1189,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1227,10 +1211,6 @@ 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 @@ -1247,29 +1227,21 @@ if.merge.376: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.383 @@ -1282,9 +1254,9 @@ while.body.384: ; preds = %while.hdr.383 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.386, label %if.merge.387 diff --git a/examples/expected/1004-errors-try.ir b/examples/expected/1004-errors-try.ir index 6dcd3c4..1a76be3 100644 --- a/examples/expected/1004-errors-try.ir +++ b/examples/expected/1004-errors-try.ir @@ -756,13 +756,8 @@ entry: %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 @@ -782,11 +777,9 @@ if.merge.67: ; preds = %entry br label %while.hdr.76 while.hdr.76: ; preds = %while.exit.87, %if.merge.67 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.80, label %or.rhs.79 while.body.77: ; preds = %or.merge.84 @@ -804,11 +797,9 @@ while.exit.78: ; preds = %or.merge.84 ret { ptr, i64 } %callN or.rhs.79: ; preds = %while.hdr.76 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.80 or.merge.80: ; preds = %or.rhs.79, %while.hdr.76 @@ -816,11 +807,9 @@ or.merge.80: ; preds = %or.rhs.79, %while.h br i1 %bp, label %or.merge.82, label %or.rhs.81 or.rhs.81: ; preds = %or.merge.80 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.82 or.merge.82: ; preds = %or.rhs.81, %or.merge.80 @@ -828,11 +817,9 @@ or.merge.82: ; preds = %or.rhs.81, %or.merg br i1 %bpN, label %or.merge.84, label %or.rhs.83 or.rhs.83: ; preds = %or.merge.82 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.84 or.merge.84: ; preds = %or.rhs.83, %or.merge.82 @@ -847,18 +834,16 @@ while.hdr.85: ; preds = %while.body.86, %whi while.body.86: ; preds = %while.hdr.85 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -873,9 +858,9 @@ while.exit.87: ; preds = %while.hdr.85 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1197,7 +1182,6 @@ if.then.74: ; preds = %if.merge.73 br label %if.merge.75 if.merge.75: ; preds = %if.then.74, %if.merge.73 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1220,10 +1204,6 @@ 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 @@ -1240,29 +1220,21 @@ if.merge.380: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.387 @@ -1275,9 +1247,9 @@ while.body.388: ; preds = %while.hdr.387 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.390, label %if.merge.391 diff --git a/examples/expected/1006-errors-inferred-error-sets.ir b/examples/expected/1006-errors-inferred-error-sets.ir index b78abcd..3766d54 100644 --- a/examples/expected/1006-errors-inferred-error-sets.ir +++ b/examples/expected/1006-errors-inferred-error-sets.ir @@ -762,13 +762,8 @@ entry: %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 @@ -788,11 +783,9 @@ if.merge.69: ; preds = %entry br label %while.hdr.78 while.hdr.78: ; preds = %while.exit.89, %if.merge.69 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.82, label %or.rhs.81 while.body.79: ; preds = %or.merge.86 @@ -810,11 +803,9 @@ while.exit.80: ; preds = %or.merge.86 ret { ptr, i64 } %callN or.rhs.81: ; preds = %while.hdr.78 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.82 or.merge.82: ; preds = %or.rhs.81, %while.hdr.78 @@ -822,11 +813,9 @@ or.merge.82: ; preds = %or.rhs.81, %while.h br i1 %bp, label %or.merge.84, label %or.rhs.83 or.rhs.83: ; preds = %or.merge.82 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.84 or.merge.84: ; preds = %or.rhs.83, %or.merge.82 @@ -834,11 +823,9 @@ or.merge.84: ; preds = %or.rhs.83, %or.merg br i1 %bpN, label %or.merge.86, label %or.rhs.85 or.rhs.85: ; preds = %or.merge.84 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.86 or.merge.86: ; preds = %or.rhs.85, %or.merge.84 @@ -853,18 +840,16 @@ while.hdr.87: ; preds = %while.body.88, %whi while.body.88: ; preds = %while.hdr.87 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -879,9 +864,9 @@ while.exit.89: ; preds = %while.hdr.87 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1203,7 +1188,6 @@ if.then.76: ; preds = %if.merge.75 br label %if.merge.77 if.merge.77: ; preds = %if.then.76, %if.merge.75 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1226,10 +1210,6 @@ 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 @@ -1246,29 +1226,21 @@ if.merge.382: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.389 @@ -1281,9 +1253,9 @@ while.body.390: ; preds = %while.hdr.389 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.392, label %if.merge.393 diff --git a/examples/expected/1009-errors-catch.ir b/examples/expected/1009-errors-catch.ir index 4d7be50..02e53a2 100644 --- a/examples/expected/1009-errors-catch.ir +++ b/examples/expected/1009-errors-catch.ir @@ -758,13 +758,8 @@ entry: %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 @@ -784,11 +779,9 @@ if.merge.87: ; preds = %entry br label %while.hdr.96 while.hdr.96: ; preds = %while.exit.107, %if.merge.87 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.100, label %or.rhs.99 while.body.97: ; preds = %or.merge.104 @@ -806,11 +799,9 @@ while.exit.98: ; preds = %or.merge.104 ret { ptr, i64 } %callN or.rhs.99: ; preds = %while.hdr.96 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.100 or.merge.100: ; preds = %or.rhs.99, %while.hdr.96 @@ -818,11 +809,9 @@ or.merge.100: ; preds = %or.rhs.99, %while.h br i1 %bp, label %or.merge.102, label %or.rhs.101 or.rhs.101: ; preds = %or.merge.100 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.102 or.merge.102: ; preds = %or.rhs.101, %or.merge.100 @@ -830,11 +819,9 @@ or.merge.102: ; preds = %or.rhs.101, %or.mer br i1 %bpN, label %or.merge.104, label %or.rhs.103 or.rhs.103: ; preds = %or.merge.102 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.104 or.merge.104: ; preds = %or.rhs.103, %or.merge.102 @@ -849,18 +836,16 @@ while.hdr.105: ; preds = %while.body.106, %wh while.body.106: ; preds = %while.hdr.105 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -875,9 +860,9 @@ while.exit.107: ; preds = %while.hdr.105 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1199,7 +1184,6 @@ if.then.94: ; preds = %if.merge.93 br label %if.merge.95 if.merge.95: ; preds = %if.then.94, %if.merge.93 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1222,10 +1206,6 @@ 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 @@ -1242,29 +1222,21 @@ if.merge.400: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.407 @@ -1277,9 +1249,9 @@ while.body.408: ; preds = %while.hdr.407 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.410, label %if.merge.411 diff --git a/examples/expected/1319-ffi-objc-property-sx-defined.ir b/examples/expected/1319-ffi-objc-property-sx-defined.ir index 6e50aee..66358d2 100644 --- a/examples/expected/1319-ffi-objc-property-sx-defined.ir +++ b/examples/expected/1319-ffi-objc-property-sx-defined.ir @@ -841,13 +841,8 @@ entry: %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 @@ -867,11 +862,9 @@ if.merge.65: ; preds = %entry br label %while.hdr.74 while.hdr.74: ; preds = %while.exit.85, %if.merge.65 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.78, label %or.rhs.77 while.body.75: ; preds = %or.merge.82 @@ -889,11 +882,9 @@ while.exit.76: ; preds = %or.merge.82 ret { ptr, i64 } %callN or.rhs.77: ; preds = %while.hdr.74 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.78 or.merge.78: ; preds = %or.rhs.77, %while.hdr.74 @@ -901,11 +892,9 @@ or.merge.78: ; preds = %or.rhs.77, %while.h br i1 %bp, label %or.merge.80, label %or.rhs.79 or.rhs.79: ; preds = %or.merge.78 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.80 or.merge.80: ; preds = %or.rhs.79, %or.merge.78 @@ -913,11 +902,9 @@ or.merge.80: ; preds = %or.rhs.79, %or.merg br i1 %bpN, label %or.merge.82, label %or.rhs.81 or.rhs.81: ; preds = %or.merge.80 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.82 or.merge.82: ; preds = %or.rhs.81, %or.merge.80 @@ -932,18 +919,16 @@ while.hdr.83: ; preds = %while.body.84, %whi while.body.84: ; preds = %while.hdr.83 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -958,9 +943,9 @@ while.exit.85: ; preds = %while.hdr.83 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1282,7 +1267,6 @@ if.then.72: ; preds = %if.merge.71 br label %if.merge.73 if.merge.73: ; preds = %if.then.72, %if.merge.71 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1305,10 +1289,6 @@ 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 @@ -1325,29 +1305,21 @@ if.merge.405: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.412 @@ -1360,9 +1332,9 @@ while.body.413: ; preds = %while.hdr.412 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.415, label %if.merge.416 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 09b531c..cb657eb 100644 --- a/examples/expected/1332-ffi-objc-call-06-sret-return.ir +++ b/examples/expected/1332-ffi-objc-call-06-sret-return.ir @@ -788,13 +788,8 @@ entry: %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 @@ -814,11 +809,9 @@ if.merge.57: ; preds = %entry br label %while.hdr.66 while.hdr.66: ; preds = %while.exit.77, %if.merge.57 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val, 0 + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + %icmpN = icmp ne i64 %loadN, 0 br i1 %icmpN, label %or.merge.70, label %or.rhs.69 while.body.67: ; preds = %or.merge.74 @@ -836,11 +829,9 @@ while.exit.68: ; preds = %or.merge.74 ret { ptr, i64 } %callN or.rhs.69: ; preds = %while.hdr.66 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val17, 0 + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr14, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.70 or.merge.70: ; preds = %or.rhs.69, %while.hdr.66 @@ -848,11 +839,9 @@ or.merge.70: ; preds = %or.rhs.69, %while.h br i1 %bp, label %or.merge.72, label %or.rhs.71 or.rhs.71: ; preds = %or.merge.70 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val22, 0 + %igp.ptr17 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr17, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.72 or.merge.72: ; preds = %or.rhs.71, %or.merge.70 @@ -860,11 +849,9 @@ or.merge.72: ; preds = %or.rhs.71, %or.merg br i1 %bpN, label %or.merge.74, label %or.rhs.73 or.rhs.73: ; preds = %or.merge.72 - %loadN = load [4 x i64], ptr %allocaN, 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 - %icmpN = icmp ne i64 %ig.val28, 0 + %igp.ptr21 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr21, align 8 + %icmpN = icmp ne i64 %loadN, 0 br label %or.merge.74 or.merge.74: ; preds = %or.rhs.73, %or.merge.72 @@ -879,18 +866,16 @@ while.hdr.75: ; preds = %while.body.76, %whi while.body.76: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %mul = mul i64 %loadN, 65536 - %loadN = load [4 x i64], ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, 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 + %igp.ptr29 = getelementptr i64, ptr %allocaN, i64 %loadN + %loadN = load i64, ptr %igp.ptr29, align 8 + %addN = add i64 %mul, %loadN store i64 %addN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %sdiv = sdiv i64 %loadN, 10 %loadN = load i64, ptr %allocaN, align 8 - %igp.ptr = getelementptr i64, ptr %allocaN, i64 %loadN - store i64 %sdiv, ptr %igp.ptr, align 8 + %igp.ptr35 = getelementptr i64, ptr %allocaN, i64 %loadN + store i64 %sdiv, ptr %igp.ptr35, align 8 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 10 store i64 %srem, ptr %allocaN, align 8 @@ -905,9 +890,9 @@ while.exit.77: ; preds = %while.hdr.75 %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 - %igp.ptr50 = getelementptr i8, ptr %igp.data, i64 %loadN + %igp.ptr43 = getelementptr i8, ptr %igp.data, i64 %loadN %trunc = trunc i64 %addN to i8 - store i8 %trunc, ptr %igp.ptr50, align 1 + store i8 %trunc, ptr %igp.ptr43, align 1 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 @@ -1229,7 +1214,6 @@ if.then.64: ; preds = %if.merge.63 br label %if.merge.65 if.merge.65: ; preds = %if.then.64, %if.merge.63 - store [4 x i64] undef, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 store i64 %loadN, ptr %igp.ptr, align 8 @@ -1252,10 +1236,6 @@ 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 @@ -1272,29 +1252,21 @@ if.merge.390: ; preds = %entry %callN = call { ptr, i64 } @cstring(ptr %0, i64 16) 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 - 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) + %igp.ptr = getelementptr i64, ptr %allocaN, i64 0 + %loadN = load i64, ptr %igp.ptr, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 0, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr8 = getelementptr i64, ptr %allocaN, i64 1 + %loadN = load i64, ptr %igp.ptr8, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 4, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr11 = getelementptr i64, ptr %allocaN, i64 2 + %loadN = load i64, ptr %igp.ptr11, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 8, i64 %loadN) %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %loadN = load [4 x i64], ptr %allocaN, 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) + %igp.ptr14 = getelementptr i64, ptr %allocaN, i64 3 + %loadN = load i64, ptr %igp.ptr14, align 8 + call void @hex_group(ptr %0, { ptr, i64 } %loadN, i64 12, i64 %loadN) store i64 0, ptr %allocaN, align 8 br label %while.hdr.397 @@ -1307,9 +1279,9 @@ while.body.398: ; preds = %while.hdr.397 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr27 = getelementptr i8, ptr %ig.data, i64 %loadN - %ig.val28 = load i8, ptr %ig.ptr27, align 1 - %cmp.ext = zext i8 %ig.val28 to i64 + %ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN + %ig.val = load i8, ptr %ig.ptr, align 1 + %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 br i1 %icmpN, label %if.then.400, label %if.merge.401 diff --git a/issues/0124-large-stack-array-aggregate-ops-crash-llvm.md b/issues/0124-large-stack-array-aggregate-ops-crash-llvm.md index e8aecaa..3eb88e4 100644 --- a/issues/0124-large-stack-array-aggregate-ops-crash-llvm.md +++ b/issues/0124-large-stack-array-aggregate-ops-crash-llvm.md @@ -1,4 +1,26 @@ -# 0124 — 64K+ stack arrays emit whole-aggregate load/store ops that segfault LLVM +# RESOLVED — 0124: 64K+ stack arrays emit whole-aggregate load/store ops that segfault LLVM + +> **RESOLVED** (2026-06-12). Root cause: two lowering sites materialized +> a local array as a first-class LLVM value, which the legalizer +> scalarizes into one SelectionDAG node per element. Fix: (1) +> `lowerVarDecl` (src/ir/lower/stmt.zig) emits NO store for an +> array-typed `---` initializer — the slot stays uninitialized instead +> of receiving a whole-array undef store (tuple zero-init carve-out +> kept; non-array `---` keeps the undef store); (2) `lowerIndexExpr` +> (src/ir/lower/expr.zig) reads elements of an array with addressable +> storage via `index_gep` on the storage + a single-element load — the +> general-expression sibling of 0110's `lowerFor` fix — without +> value-lowering the object (a dead whole-array load would still reach +> the DAG). Storage-less arrays (rvalues, by-value params) keep the +> `index_get` fallback. Residual sibling shapes filed as issue 0125 +> (`any_to_string`'s per-array-type arms pass the array by value — any +> 64K+ array type + any `{}` print still crashes). +> Regression test: `examples/0055-basic-large-stack-array.sx` +> ([65536]u8 write/read loops + [131072]s64 first/last — `sx build` +> segfaulted pre-fix). 22 `.ir` snapshots re-pinned (removed undef +> stores / `ig.tmp` spills → in-place gep+load; reviewed +> instruction-shape-only). Gates: zig build test 426/426, suite +> 592/592, distribution repo 14/14. ## Symptom diff --git a/src/ir/lower/expr.zig b/src/ir/lower/expr.zig index 3a904b5..fe527ba 100644 --- a/src/ir/lower/expr.zig +++ b/src/ir/lower/expr.zig @@ -1275,10 +1275,25 @@ pub fn lowerIndexExpr(self: *Lowering, ie: *const ast.IndexExpr) Ref { } } } - const obj = self.lowerExpr(ie.object); - const idx = self.lowerExpr(ie.index); // Infer element type from the object's slice/array type const obj_ty = self.inferExprType(ie.object); + // Array with addressable storage: GEP the element in place + load, + // never `index_get` on the loaded array VALUE — that realizes as + // copy-whole-array-to-temp per read (the general-expression sibling + // of 0110's `lowerFor` fix), and on a 64K+ array the whole-aggregate + // load/store ops segfault LLVM's SelectionDAG (issue 0124). The + // object must not be lowered as a value on this path or the dead + // whole-array load still reaches the DAG. + if (!obj_ty.isBuiltin() and self.module.types.get(obj_ty) == .array) { + if (self.getExprAlloca(ie.object)) |storage| { + const idx = self.lowerExpr(ie.index); + const elem_ty = self.getElementType(obj_ty); + const gep = self.builder.emit(.{ .index_gep = .{ .lhs = storage, .rhs = idx } }, self.module.types.ptrTo(elem_ty)); + return self.builder.load(gep, elem_ty); + } + } + const obj = self.lowerExpr(ie.object); + const idx = self.lowerExpr(ie.index); // `*[N]T` receiver auto-derefs (issue 0117): `obj` IS the pointer // value — GEP the pointee array and load the element. if (self.ptrToArrayElem(obj_ty)) |elem| { diff --git a/src/ir/lower/stmt.zig b/src/ir/lower/stmt.zig index b55b669..28932eb 100644 --- a/src/ir/lower/stmt.zig +++ b/src/ir/lower/stmt.zig @@ -260,9 +260,9 @@ pub fn lowerVarDecl(self: *Lowering, vd: *const ast.VarDecl) void { const ty = self.resolveType(ta); const slot = self.builder.alloca(ty); if (vd.value) |val| { - // = --- (undef_literal) on tuple types: zero-initialize if (val.data == .undef_literal and !ty.isBuiltin()) { const ti = self.module.types.get(ty); + // = --- (undef_literal) on tuple types: zero-initialize if (ti == .tuple) { var field_vals = std.ArrayList(Ref).empty; defer field_vals.deinit(self.alloc); @@ -278,6 +278,16 @@ pub fn lowerVarDecl(self: *Lowering, vd: *const ast.VarDecl) void { } return; } + // `---` on an array: explicitly uninitialized — no store. + // A whole-array undef store is a store of nothing that + // LLVM's legalizer scalarizes into one DAG node per + // element (issue 0124: SelectionDAG segfault at ~64K). + if (ti == .array) { + if (self.scope) |scope| { + scope.put(vd.name, .{ .ref = slot, .ty = ty, .is_alloca = true }); + } + return; + } } // A compile-time float initializer narrowing into an integer // local follows the unified rule (integral folds, non-integral