fix(std): render integer formatter extremes — i64::MIN and unsigned all-ones [F0.8]
Resolves issue 0090. The `{}` integer formatter mis-rendered both ends of
the 64-bit range:
- `int_to_string` computed the magnitude as `0 - n`, which overflows for
`s64::MIN` (its magnitude is unrepresentable as a positive s64) — the
value stayed negative, the digit loop ran zero times, so only `-`
printed. It now extracts digits straight from `n` (per-digit
`|n % 10|`, `n` truncating toward zero), never negating MIN.
- `any_to_string`'s `case int:` formatted every integer as s64, so a u64
all-ones value printed as `-1`. There was no `uint` type-category to
distinguish signedness. Added an additive `type_is_unsigned(T)`
reflection builtin (static fold + dynamic interp/LLVM paths, mirroring
`type_name`), backed by the new `TypeTable.isUnsignedInt` predicate, and
a `uint_to_string` formatter (unsigned decimal via long-division over
four 16-bit limbs). `case int:` routes through `type_is_unsigned(type)`.
The 16-bit-limb split is factored into a shared `decompose_u16x4`, now
reused by `int_to_hex_string` (no second unsigned-math routine).
Regression: examples/0046-basic-int-formatter-extremes pins both extremes
plus a width spread; unit tests cover `isUnsignedInt`. Docs (specs.md
representation note, readme std API) updated for unsigned/extreme `{}`
behavior. IR snapshots refreshed for the two new std functions.
This commit is contained in:
37
examples/0046-basic-int-formatter-extremes.sx
Normal file
37
examples/0046-basic-int-formatter-extremes.sx
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// Integer `{}` formatting across the full signed/unsigned range.
|
||||||
|
//
|
||||||
|
// Regression (issue 0090): the `{}` formatter was s64-based — it negated
|
||||||
|
// the value to print the sign (so s64::MIN, whose magnitude is
|
||||||
|
// unrepresentable as a positive s64, rendered as a bare "-"), and it had
|
||||||
|
// no unsigned-aware path (so a u64 all-ones value printed as the s64
|
||||||
|
// reinterpretation, "-1"). Both extremes now render correctly: signed
|
||||||
|
// MIN prints all its digits, and unsigned integers print as unsigned
|
||||||
|
// decimal across all 64 bits.
|
||||||
|
|
||||||
|
#import "modules/std.sx";
|
||||||
|
|
||||||
|
main :: () {
|
||||||
|
// Signed extreme: magnitude is never negated, so MIN survives.
|
||||||
|
print("s64.min={}\n", s64.min);
|
||||||
|
print("s64.max={}\n", s64.max);
|
||||||
|
|
||||||
|
// Unsigned extreme: all 64 bits as unsigned decimal, not -1.
|
||||||
|
print("u64.max={}\n", u64.max);
|
||||||
|
|
||||||
|
// Spread across widths — signed.
|
||||||
|
print("s8.min={} s8.max={}\n", s8.min, s8.max);
|
||||||
|
print("s16.min={} s16.max={}\n", s16.min, s16.max);
|
||||||
|
print("s32.min={} s32.max={}\n", s32.min, s32.max);
|
||||||
|
|
||||||
|
// Spread across widths — unsigned (max is all-ones for that width).
|
||||||
|
print("u8.max={} u16.max={}\n", u8.max, u16.max);
|
||||||
|
print("u32.max={}\n", u32.max);
|
||||||
|
|
||||||
|
// Mins of unsigned widths and zero.
|
||||||
|
print("u8.min={} u64.min={} zero={}\n", u8.min, u64.min, 0);
|
||||||
|
|
||||||
|
// Ordinary signed/unsigned values still print correctly.
|
||||||
|
neg : s32 = -42;
|
||||||
|
pos : u32 = 4000000000;
|
||||||
|
print("neg={} pos={}\n", neg, pos);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1
examples/expected/0046-basic-int-formatter-extremes.exit
Normal file
1
examples/expected/0046-basic-int-formatter-extremes.exit
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
10
examples/expected/0046-basic-int-formatter-extremes.stdout
Normal file
10
examples/expected/0046-basic-int-formatter-extremes.stdout
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
s64.min=-9223372036854775808
|
||||||
|
s64.max=9223372036854775807
|
||||||
|
u64.max=18446744073709551615
|
||||||
|
s8.min=-128 s8.max=127
|
||||||
|
s16.min=-32768 s16.max=32767
|
||||||
|
s32.min=-2147483648 s32.max=2147483647
|
||||||
|
u8.max=255 u16.max=65535
|
||||||
|
u32.max=4294967295
|
||||||
|
u8.min=0 u64.min=0 zero=0
|
||||||
|
neg=-42 pos=4000000000
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -96,6 +96,9 @@ declare ptr @cstring(ptr, i64) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_string(ptr, i64) #0
|
declare ptr @int_to_string(ptr, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -105,6 +108,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
|
|||||||
@@ -173,38 +173,43 @@ if.merge.15: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.16, label %if.else.17
|
|
||||||
|
|
||||||
if.then.16: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.else.17: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.merge.18: ; preds = %if.else.17, %if.then.16
|
|
||||||
%bp = phi i64 [ %sub, %if.then.16 ], [ %loadN, %if.else.17 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.hdr.19: ; preds = %while.body.20, %if.merge.18
|
while.hdr.16: ; preds = %if.merge.20, %if.merge.15
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.20, label %while.exit.21
|
br i1 %icmpN, label %while.body.17, label %while.exit.18
|
||||||
|
|
||||||
while.body.20: ; preds = %while.hdr.19
|
while.body.17: ; preds = %while.hdr.16
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.19, label %if.merge.20
|
||||||
|
|
||||||
|
while.exit.18: ; preds = %while.hdr.16
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
if.then.19: ; preds = %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.20
|
||||||
|
|
||||||
|
if.merge.20: ; preds = %if.then.19, %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -217,34 +222,32 @@ while.body.20: ; preds = %while.hdr.19
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.exit.21: ; preds = %while.hdr.19
|
if.then.21: ; preds = %while.exit.18
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.22, label %if.merge.23
|
|
||||||
|
|
||||||
if.then.22: ; preds = %while.exit.21
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.23
|
br label %if.merge.22
|
||||||
|
|
||||||
if.merge.23: ; preds = %if.then.22, %while.exit.21
|
if.merge.22: ; preds = %if.then.21, %while.exit.18
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -254,6 +257,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -367,7 +373,7 @@ while.exit.2: ; preds = %while.hdr.0
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.36, label %if.merge.37
|
br i1 %icmpN, label %if.then.35, label %if.merge.36
|
||||||
|
|
||||||
if.then.3: ; preds = %while.body.1
|
if.then.3: ; preds = %while.body.1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -385,9 +391,9 @@ if.else.4: ; preds = %while.body.1
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.27, label %if.else.28
|
br i1 %icmpN, label %if.then.26, label %if.else.27
|
||||||
|
|
||||||
if.merge.5: ; preds = %if.merge.29, %if.merge.8
|
if.merge.5: ; preds = %if.merge.28, %if.merge.8
|
||||||
br label %while.hdr.0
|
br label %while.hdr.0
|
||||||
|
|
||||||
if.then.6: ; preds = %if.then.3
|
if.then.6: ; preds = %if.then.3
|
||||||
@@ -425,9 +431,9 @@ if.else.10: ; preds = %if.then.6
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.24, label %if.else.25
|
br i1 %icmpN, label %if.then.23, label %if.else.24
|
||||||
|
|
||||||
if.merge.11: ; preds = %if.merge.26, %if.merge.13
|
if.merge.11: ; preds = %if.merge.25, %if.merge.13
|
||||||
br label %if.merge.8
|
br label %if.merge.8
|
||||||
|
|
||||||
if.then.12: ; preds = %if.then.9
|
if.then.12: ; preds = %if.then.9
|
||||||
@@ -476,7 +482,7 @@ if.merge.13: ; preds = %if.then.12, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.24: ; preds = %if.else.10
|
if.then.23: ; preds = %if.else.10
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -504,35 +510,35 @@ if.then.24: ; preds = %if.else.10
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.else.25: ; preds = %if.else.10
|
if.else.24: ; preds = %if.else.10
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.merge.26: ; preds = %if.else.25, %if.then.24
|
if.merge.25: ; preds = %if.else.24, %if.then.23
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.27: ; preds = %if.else.4
|
if.then.26: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.30, label %if.else.31
|
br i1 %icmpN, label %if.then.29, label %if.else.30
|
||||||
|
|
||||||
if.else.28: ; preds = %if.else.4
|
if.else.27: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.merge.29: ; preds = %if.merge.32, %if.else.28
|
if.merge.28: ; preds = %if.merge.31, %if.else.27
|
||||||
br label %if.merge.5
|
br label %if.merge.5
|
||||||
|
|
||||||
if.then.30: ; preds = %if.then.27
|
if.then.29: ; preds = %if.then.26
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -541,18 +547,18 @@ if.then.30: ; preds = %if.then.27
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.33, label %if.else.34
|
br i1 %icmpN, label %if.then.32, label %if.else.33
|
||||||
|
|
||||||
if.else.31: ; preds = %if.then.27
|
if.else.30: ; preds = %if.then.26
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.merge.32: ; preds = %if.merge.35, %if.else.31
|
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.then.33: ; preds = %if.then.30
|
if.then.32: ; preds = %if.then.29
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -580,18 +586,18 @@ if.then.33: ; preds = %if.then.30
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.else.34: ; preds = %if.then.30
|
if.else.33: ; preds = %if.then.29
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.merge.35: ; preds = %if.else.34, %if.then.33
|
if.merge.34: ; preds = %if.else.33, %if.then.32
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.then.36: ; preds = %while.exit.2
|
if.then.35: ; preds = %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -614,9 +620,9 @@ if.then.36: ; preds = %while.exit.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.then.36, %while.exit.2
|
if.merge.36: ; preds = %if.then.35, %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,38 +189,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -233,34 +238,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -270,6 +273,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -383,7 +389,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -401,9 +407,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -441,9 +447,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -492,7 +498,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -520,35 +526,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -557,18 +563,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -596,18 +602,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -630,9 +636,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
@@ -846,13 +852,13 @@ if.merge.1: ; preds = %entry
|
|||||||
store ptr %callN, ptr %allocaN, align 8
|
store ptr %callN, ptr %allocaN, align 8
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
%icmpN = icmp eq ptr %loadN, null
|
%icmpN = icmp eq ptr %loadN, null
|
||||||
br i1 %icmpN, label %if.then.40, label %if.merge.41
|
br i1 %icmpN, label %if.then.39, label %if.merge.40
|
||||||
|
|
||||||
if.then.40: ; preds = %if.merge.1
|
if.then.39: ; preds = %if.merge.1
|
||||||
call void @print__ct_sfe783e2b27a4beff__pack(ptr @__sx_default_context)
|
call void @print__ct_sfe783e2b27a4beff__pack(ptr @__sx_default_context)
|
||||||
ret i32 1
|
ret i32 1
|
||||||
|
|
||||||
if.merge.41: ; preds = %if.merge.1
|
if.merge.40: ; preds = %if.merge.1
|
||||||
%allocaN = alloca ptr, align 8
|
%allocaN = alloca ptr, align 8
|
||||||
%callN = call ptr @sel_registerName(ptr @str.18)
|
%callN = call ptr @sel_registerName(ptr @str.18)
|
||||||
store ptr %callN, ptr %allocaN, align 8
|
store ptr %callN, ptr %allocaN, align 8
|
||||||
@@ -866,13 +872,13 @@ if.merge.41: ; preds = %if.merge.1
|
|||||||
store ptr %icall, ptr %allocaN, align 8
|
store ptr %icall, ptr %allocaN, align 8
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
%icmpN = icmp eq ptr %loadN, null
|
%icmpN = icmp eq ptr %loadN, null
|
||||||
br i1 %icmpN, label %if.then.42, label %if.merge.43
|
br i1 %icmpN, label %if.then.41, label %if.merge.42
|
||||||
|
|
||||||
if.then.42: ; preds = %if.merge.41
|
if.then.41: ; preds = %if.merge.40
|
||||||
call void @print__ct_scaebdbbd10c81716__pack(ptr @__sx_default_context)
|
call void @print__ct_scaebdbbd10c81716__pack(ptr @__sx_default_context)
|
||||||
ret i32 1
|
ret i32 1
|
||||||
|
|
||||||
if.merge.43: ; preds = %if.merge.41
|
if.merge.42: ; preds = %if.merge.40
|
||||||
%allocaN = alloca ptr, align 8
|
%allocaN = alloca ptr, align 8
|
||||||
%callN = call ptr @sel_registerName(ptr @str.19)
|
%callN = call ptr @sel_registerName(ptr @str.19)
|
||||||
store ptr %callN, ptr %allocaN, align 8
|
store ptr %callN, ptr %allocaN, align 8
|
||||||
@@ -890,13 +896,13 @@ if.merge.43: ; preds = %if.merge.41
|
|||||||
store ptr %icallN, ptr %allocaN, align 8
|
store ptr %icallN, ptr %allocaN, align 8
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
%icmpN = icmp eq ptr %loadN, null
|
%icmpN = icmp eq ptr %loadN, null
|
||||||
br i1 %icmpN, label %if.then.44, label %if.merge.45
|
br i1 %icmpN, label %if.then.43, label %if.merge.44
|
||||||
|
|
||||||
if.then.44: ; preds = %if.merge.43
|
if.then.43: ; preds = %if.merge.42
|
||||||
call void @print__ct_s7c1052877b8cc801__pack(ptr @__sx_default_context)
|
call void @print__ct_s7c1052877b8cc801__pack(ptr @__sx_default_context)
|
||||||
ret i32 1
|
ret i32 1
|
||||||
|
|
||||||
if.merge.45: ; preds = %if.merge.43
|
if.merge.44: ; preds = %if.merge.42
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
%loadN = load ptr, ptr %allocaN, align 8
|
%loadN = load ptr, ptr %allocaN, align 8
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -165,38 +165,43 @@ if.merge.15: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.16, label %if.else.17
|
|
||||||
|
|
||||||
if.then.16: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.else.17: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.merge.18: ; preds = %if.else.17, %if.then.16
|
|
||||||
%bp = phi i64 [ %sub, %if.then.16 ], [ %loadN, %if.else.17 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.hdr.19: ; preds = %while.body.20, %if.merge.18
|
while.hdr.16: ; preds = %if.merge.20, %if.merge.15
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.20, label %while.exit.21
|
br i1 %icmpN, label %while.body.17, label %while.exit.18
|
||||||
|
|
||||||
while.body.20: ; preds = %while.hdr.19
|
while.body.17: ; preds = %while.hdr.16
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.19, label %if.merge.20
|
||||||
|
|
||||||
|
while.exit.18: ; preds = %while.hdr.16
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
if.then.19: ; preds = %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.20
|
||||||
|
|
||||||
|
if.merge.20: ; preds = %if.then.19, %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -209,34 +214,32 @@ while.body.20: ; preds = %while.hdr.19
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.exit.21: ; preds = %while.hdr.19
|
if.then.21: ; preds = %while.exit.18
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.22, label %if.merge.23
|
|
||||||
|
|
||||||
if.then.22: ; preds = %while.exit.21
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.23
|
br label %if.merge.22
|
||||||
|
|
||||||
if.merge.23: ; preds = %if.then.22, %while.exit.21
|
if.merge.22: ; preds = %if.then.21, %while.exit.18
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -246,6 +249,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -359,7 +365,7 @@ while.exit.2: ; preds = %while.hdr.0
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.36, label %if.merge.37
|
br i1 %icmpN, label %if.then.35, label %if.merge.36
|
||||||
|
|
||||||
if.then.3: ; preds = %while.body.1
|
if.then.3: ; preds = %while.body.1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -377,9 +383,9 @@ if.else.4: ; preds = %while.body.1
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.27, label %if.else.28
|
br i1 %icmpN, label %if.then.26, label %if.else.27
|
||||||
|
|
||||||
if.merge.5: ; preds = %if.merge.29, %if.merge.8
|
if.merge.5: ; preds = %if.merge.28, %if.merge.8
|
||||||
br label %while.hdr.0
|
br label %while.hdr.0
|
||||||
|
|
||||||
if.then.6: ; preds = %if.then.3
|
if.then.6: ; preds = %if.then.3
|
||||||
@@ -417,9 +423,9 @@ if.else.10: ; preds = %if.then.6
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.24, label %if.else.25
|
br i1 %icmpN, label %if.then.23, label %if.else.24
|
||||||
|
|
||||||
if.merge.11: ; preds = %if.merge.26, %if.merge.13
|
if.merge.11: ; preds = %if.merge.25, %if.merge.13
|
||||||
br label %if.merge.8
|
br label %if.merge.8
|
||||||
|
|
||||||
if.then.12: ; preds = %if.then.9
|
if.then.12: ; preds = %if.then.9
|
||||||
@@ -468,7 +474,7 @@ if.merge.13: ; preds = %if.then.12, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.24: ; preds = %if.else.10
|
if.then.23: ; preds = %if.else.10
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -496,35 +502,35 @@ if.then.24: ; preds = %if.else.10
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.else.25: ; preds = %if.else.10
|
if.else.24: ; preds = %if.else.10
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.merge.26: ; preds = %if.else.25, %if.then.24
|
if.merge.25: ; preds = %if.else.24, %if.then.23
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.27: ; preds = %if.else.4
|
if.then.26: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.30, label %if.else.31
|
br i1 %icmpN, label %if.then.29, label %if.else.30
|
||||||
|
|
||||||
if.else.28: ; preds = %if.else.4
|
if.else.27: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.merge.29: ; preds = %if.merge.32, %if.else.28
|
if.merge.28: ; preds = %if.merge.31, %if.else.27
|
||||||
br label %if.merge.5
|
br label %if.merge.5
|
||||||
|
|
||||||
if.then.30: ; preds = %if.then.27
|
if.then.29: ; preds = %if.then.26
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -533,18 +539,18 @@ if.then.30: ; preds = %if.then.27
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.33, label %if.else.34
|
br i1 %icmpN, label %if.then.32, label %if.else.33
|
||||||
|
|
||||||
if.else.31: ; preds = %if.then.27
|
if.else.30: ; preds = %if.then.26
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.merge.32: ; preds = %if.merge.35, %if.else.31
|
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.then.33: ; preds = %if.then.30
|
if.then.32: ; preds = %if.then.29
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -572,18 +578,18 @@ if.then.33: ; preds = %if.then.30
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.else.34: ; preds = %if.then.30
|
if.else.33: ; preds = %if.then.29
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.merge.35: ; preds = %if.else.34, %if.then.33
|
if.merge.34: ; preds = %if.else.33, %if.then.32
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.then.36: ; preds = %while.exit.2
|
if.then.35: ; preds = %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -606,9 +612,9 @@ if.then.36: ; preds = %while.exit.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.then.36, %while.exit.2
|
if.merge.36: ; preds = %if.then.35, %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -191,38 +191,43 @@ if.merge.15: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.16, label %if.else.17
|
|
||||||
|
|
||||||
if.then.16: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.else.17: ; preds = %if.merge.15
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.18
|
|
||||||
|
|
||||||
if.merge.18: ; preds = %if.else.17, %if.then.16
|
|
||||||
%bp = phi i64 [ %sub, %if.then.16 ], [ %loadN, %if.else.17 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.hdr.19: ; preds = %while.body.20, %if.merge.18
|
while.hdr.16: ; preds = %if.merge.20, %if.merge.15
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.20, label %while.exit.21
|
br i1 %icmpN, label %while.body.17, label %while.exit.18
|
||||||
|
|
||||||
while.body.20: ; preds = %while.hdr.19
|
while.body.17: ; preds = %while.hdr.16
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.19, label %if.merge.20
|
||||||
|
|
||||||
|
while.exit.18: ; preds = %while.hdr.16
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
if.then.19: ; preds = %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.20
|
||||||
|
|
||||||
|
if.merge.20: ; preds = %if.then.19, %while.body.17
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -235,34 +240,32 @@ while.body.20: ; preds = %while.hdr.19
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.19
|
br label %while.hdr.16
|
||||||
|
|
||||||
while.exit.21: ; preds = %while.hdr.19
|
if.then.21: ; preds = %while.exit.18
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.22, label %if.merge.23
|
|
||||||
|
|
||||||
if.then.22: ; preds = %while.exit.21
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.23
|
br label %if.merge.22
|
||||||
|
|
||||||
if.merge.23: ; preds = %if.then.22, %while.exit.21
|
if.merge.22: ; preds = %if.then.21, %while.exit.18
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -272,6 +275,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -385,7 +391,7 @@ while.exit.2: ; preds = %while.hdr.0
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.36, label %if.merge.37
|
br i1 %icmpN, label %if.then.35, label %if.merge.36
|
||||||
|
|
||||||
if.then.3: ; preds = %while.body.1
|
if.then.3: ; preds = %while.body.1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -403,9 +409,9 @@ if.else.4: ; preds = %while.body.1
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.27, label %if.else.28
|
br i1 %icmpN, label %if.then.26, label %if.else.27
|
||||||
|
|
||||||
if.merge.5: ; preds = %if.merge.29, %if.merge.8
|
if.merge.5: ; preds = %if.merge.28, %if.merge.8
|
||||||
br label %while.hdr.0
|
br label %while.hdr.0
|
||||||
|
|
||||||
if.then.6: ; preds = %if.then.3
|
if.then.6: ; preds = %if.then.3
|
||||||
@@ -443,9 +449,9 @@ if.else.10: ; preds = %if.then.6
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.24, label %if.else.25
|
br i1 %icmpN, label %if.then.23, label %if.else.24
|
||||||
|
|
||||||
if.merge.11: ; preds = %if.merge.26, %if.merge.13
|
if.merge.11: ; preds = %if.merge.25, %if.merge.13
|
||||||
br label %if.merge.8
|
br label %if.merge.8
|
||||||
|
|
||||||
if.then.12: ; preds = %if.then.9
|
if.then.12: ; preds = %if.then.9
|
||||||
@@ -494,7 +500,7 @@ if.merge.13: ; preds = %if.then.12, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.24: ; preds = %if.else.10
|
if.then.23: ; preds = %if.else.10
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -522,35 +528,35 @@ if.then.24: ; preds = %if.else.10
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.else.25: ; preds = %if.else.10
|
if.else.24: ; preds = %if.else.10
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.26
|
br label %if.merge.25
|
||||||
|
|
||||||
if.merge.26: ; preds = %if.else.25, %if.then.24
|
if.merge.25: ; preds = %if.else.24, %if.then.23
|
||||||
br label %if.merge.11
|
br label %if.merge.11
|
||||||
|
|
||||||
if.then.27: ; preds = %if.else.4
|
if.then.26: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.30, label %if.else.31
|
br i1 %icmpN, label %if.then.29, label %if.else.30
|
||||||
|
|
||||||
if.else.28: ; preds = %if.else.4
|
if.else.27: ; preds = %if.else.4
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.merge.29: ; preds = %if.merge.32, %if.else.28
|
if.merge.28: ; preds = %if.merge.31, %if.else.27
|
||||||
br label %if.merge.5
|
br label %if.merge.5
|
||||||
|
|
||||||
if.then.30: ; preds = %if.then.27
|
if.then.29: ; preds = %if.then.26
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -559,18 +565,18 @@ if.then.30: ; preds = %if.then.27
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.33, label %if.else.34
|
br i1 %icmpN, label %if.then.32, label %if.else.33
|
||||||
|
|
||||||
if.else.31: ; preds = %if.then.27
|
if.else.30: ; preds = %if.then.26
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.merge.32: ; preds = %if.merge.35, %if.else.31
|
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
||||||
br label %if.merge.29
|
br label %if.merge.28
|
||||||
|
|
||||||
if.then.33: ; preds = %if.then.30
|
if.then.32: ; preds = %if.then.29
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -598,18 +604,18 @@ if.then.33: ; preds = %if.then.30
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.else.34: ; preds = %if.then.30
|
if.else.33: ; preds = %if.then.29
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.35
|
br label %if.merge.34
|
||||||
|
|
||||||
if.merge.35: ; preds = %if.else.34, %if.then.33
|
if.merge.34: ; preds = %if.else.33, %if.then.32
|
||||||
br label %if.merge.32
|
br label %if.merge.31
|
||||||
|
|
||||||
if.then.36: ; preds = %while.exit.2
|
if.then.35: ; preds = %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -632,9 +638,9 @@ if.then.36: ; preds = %while.exit.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.then.36, %while.exit.2
|
if.merge.36: ; preds = %if.then.35, %while.exit.2
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,38 +164,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -208,34 +213,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -245,6 +248,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -358,7 +364,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -376,9 +382,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -416,9 +422,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -467,7 +473,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -495,35 +501,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -532,18 +538,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -571,18 +577,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -605,9 +611,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,38 +162,43 @@ if.merge.17: ; preds = %entry
|
|||||||
%icmpN = icmp slt i64 %loadN, 0
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
%allocaN = alloca i1, align 1
|
%allocaN = alloca i1, align 1
|
||||||
store i1 %icmpN, ptr %allocaN, align 1
|
store i1 %icmpN, ptr %allocaN, align 1
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.18, label %if.else.19
|
|
||||||
|
|
||||||
if.then.18: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
%sub = sub i64 0, %loadN
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.else.19: ; preds = %if.merge.17
|
|
||||||
%loadN = load i64, ptr %alloca, align 8
|
|
||||||
br label %if.merge.20
|
|
||||||
|
|
||||||
if.merge.20: ; preds = %if.else.19, %if.then.18
|
|
||||||
%bp = phi i64 [ %sub, %if.then.18 ], [ %loadN, %if.else.19 ]
|
|
||||||
%allocaN = alloca i64, align 8
|
|
||||||
store i64 %bp, ptr %allocaN, align 8
|
|
||||||
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
||||||
%allocaN = alloca { ptr, i64 }, align 8
|
%allocaN = alloca { ptr, i64 }, align 8
|
||||||
store { ptr, i64 } %call, ptr %allocaN, align 8
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
||||||
%allocaN = alloca i64, align 8
|
%allocaN = alloca i64, align 8
|
||||||
store i64 19, ptr %allocaN, align 8
|
store i64 19, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
%loadN = load i64, ptr %alloca, align 8
|
||||||
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.hdr.21: ; preds = %while.body.22, %if.merge.20
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%icmpN = icmp sgt i64 %loadN, 0
|
%icmpN = icmp ne i64 %loadN, 0
|
||||||
br i1 %icmpN, label %while.body.22, label %while.exit.23
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
||||||
|
|
||||||
while.body.22: ; preds = %while.hdr.21
|
while.body.19: ; preds = %while.hdr.18
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%srem = srem i64 %loadN, 10
|
%srem = srem i64 %loadN, 10
|
||||||
%add = add i64 %srem, 48
|
%allocaN = alloca i64, align 8
|
||||||
|
store i64 %srem, ptr %allocaN, align 8
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%icmpN = icmp slt i64 %loadN, 0
|
||||||
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
||||||
|
|
||||||
|
while.exit.20: ; preds = %while.hdr.18
|
||||||
|
%loadN = load i1, ptr %allocaN, align 1
|
||||||
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
||||||
|
|
||||||
|
if.then.21: ; preds = %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%sub = sub i64 0, %loadN
|
||||||
|
store i64 %sub, ptr %allocaN, align 8
|
||||||
|
br label %if.merge.22
|
||||||
|
|
||||||
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
||||||
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
|
%add = add i64 %loadN, 48
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
||||||
@@ -206,34 +211,32 @@ while.body.22: ; preds = %while.hdr.21
|
|||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %while.hdr.21
|
br label %while.hdr.18
|
||||||
|
|
||||||
while.exit.23: ; preds = %while.hdr.21
|
if.then.23: ; preds = %while.exit.20
|
||||||
%loadN = load i1, ptr %allocaN, align 1
|
|
||||||
br i1 %loadN, label %if.then.24, label %if.merge.25
|
|
||||||
|
|
||||||
if.then.24: ; preds = %while.exit.23
|
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
||||||
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
||||||
store i8 45, ptr %igp.ptr22, align 1
|
store i8 45, ptr %igp.ptr25, align 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 %loadN, 1
|
%subN = sub i64 %loadN, 1
|
||||||
store i64 %subN, ptr %allocaN, align 8
|
store i64 %subN, ptr %allocaN, align 8
|
||||||
br label %if.merge.25
|
br label %if.merge.24
|
||||||
|
|
||||||
if.merge.25: ; preds = %if.then.24, %while.exit.23
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%subN = sub i64 20, %loadN
|
%subN = sub i64 19, %loadN
|
||||||
%subN = sub i64 %subN, 1
|
|
||||||
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
||||||
ret { ptr, i64 } %callN
|
ret { ptr, i64 } %callN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -243,6 +246,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ while.exit.4: ; preds = %while.hdr.2
|
|||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %loadN, %lenN
|
%icmpN = icmp slt i64 %loadN, %lenN
|
||||||
br i1 %icmpN, label %if.then.38, label %if.merge.39
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
||||||
|
|
||||||
if.then.5: ; preds = %while.body.3
|
if.then.5: ; preds = %while.body.3
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
@@ -374,9 +380,9 @@ if.else.6: ; preds = %while.body.3
|
|||||||
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
||||||
%cmp.ext22 = zext i8 %ig.val21 to i64
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext22, 125
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
||||||
br i1 %icmpN, label %if.then.29, label %if.else.30
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
||||||
|
|
||||||
if.merge.7: ; preds = %if.merge.31, %if.merge.10
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
||||||
br label %while.hdr.2
|
br label %while.hdr.2
|
||||||
|
|
||||||
if.then.8: ; preds = %if.then.5
|
if.then.8: ; preds = %if.then.5
|
||||||
@@ -414,9 +420,9 @@ if.else.12: ; preds = %if.then.8
|
|||||||
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
||||||
%cmp.ext43 = zext i8 %ig.val42 to i64
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext43, 123
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
||||||
br i1 %icmpN, label %if.then.26, label %if.else.27
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
||||||
|
|
||||||
if.merge.13: ; preds = %if.merge.28, %if.merge.15
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
||||||
br label %if.merge.10
|
br label %if.merge.10
|
||||||
|
|
||||||
if.then.14: ; preds = %if.then.11
|
if.then.14: ; preds = %if.then.11
|
||||||
@@ -465,7 +471,7 @@ if.merge.15: ; preds = %if.then.14, %if.the
|
|||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.26: ; preds = %if.else.12
|
if.then.25: ; preds = %if.else.12
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -493,35 +499,35 @@ if.then.26: ; preds = %if.else.12
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.else.27: ; preds = %if.else.12
|
if.else.26: ; preds = %if.else.12
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.28
|
br label %if.merge.27
|
||||||
|
|
||||||
if.merge.28: ; preds = %if.else.27, %if.then.26
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
||||||
br label %if.merge.13
|
br label %if.merge.13
|
||||||
|
|
||||||
if.then.29: ; preds = %if.else.6
|
if.then.28: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
||||||
%icmpN = icmp slt i64 %addN, %lenN
|
%icmpN = icmp slt i64 %addN, %lenN
|
||||||
br i1 %icmpN, label %if.then.32, label %if.else.33
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
||||||
|
|
||||||
if.else.30: ; preds = %if.else.6
|
if.else.29: ; preds = %if.else.6
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
||||||
br label %if.merge.7
|
br label %if.merge.7
|
||||||
|
|
||||||
if.then.32: ; preds = %if.then.29
|
if.then.31: ; preds = %if.then.28
|
||||||
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
@@ -530,18 +536,18 @@ if.then.32: ; preds = %if.then.29
|
|||||||
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
||||||
%cmp.ext107 = zext i8 %ig.val106 to i64
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
||||||
%icmpN = icmp eq i64 %cmp.ext107, 125
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
||||||
br i1 %icmpN, label %if.then.35, label %if.else.36
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
||||||
|
|
||||||
if.else.33: ; preds = %if.then.29
|
if.else.32: ; preds = %if.then.28
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.merge.34: ; preds = %if.merge.37, %if.else.33
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
||||||
br label %if.merge.31
|
br label %if.merge.30
|
||||||
|
|
||||||
if.then.35: ; preds = %if.then.32
|
if.then.34: ; preds = %if.then.31
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -569,18 +575,18 @@ if.then.35: ; preds = %if.then.32
|
|||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
store i64 %loadN, ptr %allocaN, align 8
|
store i64 %loadN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.else.36: ; preds = %if.then.32
|
if.else.35: ; preds = %if.then.31
|
||||||
%loadN = load i64, ptr %allocaN, align 8
|
%loadN = load i64, ptr %allocaN, align 8
|
||||||
%addN = add i64 %loadN, 1
|
%addN = add i64 %loadN, 1
|
||||||
store i64 %addN, ptr %allocaN, align 8
|
store i64 %addN, ptr %allocaN, align 8
|
||||||
br label %if.merge.37
|
br label %if.merge.36
|
||||||
|
|
||||||
if.merge.37: ; preds = %if.else.36, %if.then.35
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
||||||
br label %if.merge.34
|
br label %if.merge.33
|
||||||
|
|
||||||
if.then.38: ; preds = %while.exit.4
|
if.then.37: ; preds = %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
@@ -603,9 +609,9 @@ if.then.38: ; preds = %while.exit.4
|
|||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
||||||
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
||||||
br label %if.merge.39
|
br label %if.merge.38
|
||||||
|
|
||||||
if.merge.39: ; preds = %if.then.38, %while.exit.4
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
||||||
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
||||||
ret { ptr, i64 } %loadN
|
ret { ptr, i64 } %loadN
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,6 +106,9 @@ declare ptr @cstring(ptr, i64) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_string(ptr, i64) #0
|
declare ptr @int_to_string(ptr, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare ptr @uint_to_string(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @bool_to_string(ptr, i1) #0
|
declare ptr @bool_to_string(ptr, i1) #0
|
||||||
|
|
||||||
@@ -115,6 +118,9 @@ declare ptr @float_to_string(ptr, double) #0
|
|||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare void @hex_group(ptr, ptr, i64, i64) #0
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
||||||
|
|
||||||
|
; Function Attrs: nounwind
|
||||||
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
||||||
|
|
||||||
; Function Attrs: nounwind
|
; Function Attrs: nounwind
|
||||||
declare ptr @int_to_hex_string(ptr, i64) #0
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
||||||
|
|
||||||
|
|||||||
83
issues/0090-int-formatter-extremes.md
Normal file
83
issues/0090-int-formatter-extremes.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# 0090 — integer formatter can't render i64::MIN or unsigned all-ones
|
||||||
|
|
||||||
|
> STATUS: RESOLVED (F0.8). Both extremes now render correctly:
|
||||||
|
> `s64.min` → `-9223372036854775808`, `u64.max` → `18446744073709551615`.
|
||||||
|
>
|
||||||
|
> **Root cause.**
|
||||||
|
> - Symptom 1 (i64::MIN): `std.int_to_string` computed the magnitude as
|
||||||
|
> `0 - n`, which overflows for `s64::MIN` (its magnitude is
|
||||||
|
> unrepresentable as a positive s64) — the value stayed negative, the
|
||||||
|
> `while v > 0` loop ran zero times, and only the `-` was emitted.
|
||||||
|
> - Symptom 2 (unsigned all-ones): `any_to_string`'s `case int:` arm
|
||||||
|
> formatted every integer as s64 (`int_to_string(xx val)`); there was no
|
||||||
|
> way to tell a `u64` from an `s64`, so an all-ones u64 printed as `-1`.
|
||||||
|
>
|
||||||
|
> **Fix per file.**
|
||||||
|
> - `library/modules/std.sx` — `int_to_string` now extracts digits straight
|
||||||
|
> from `n` (taking `|n % 10|` per digit, `n` truncates toward zero) so it
|
||||||
|
> never negates `s64::MIN`. Added `uint_to_string` (unsigned decimal via
|
||||||
|
> long-division-by-10 over four 16-bit limbs) and `decompose_u16x4` (the
|
||||||
|
> shared 16-bit-limb split, now reused by `int_to_hex_string` too).
|
||||||
|
> `any_to_string`'s `case int:` routes through the new
|
||||||
|
> `type_is_unsigned(type)` query to pick the unsigned vs signed formatter.
|
||||||
|
> Declared `type_is_unsigned :: ($T: Type) -> bool #builtin;`.
|
||||||
|
> - `src/ir/types.zig` — `TypeTable.isUnsignedInt` (canonical signedness
|
||||||
|
> predicate; single source of truth).
|
||||||
|
> - `src/ir/inst.zig` — `type_is_unsigned` BuiltinId.
|
||||||
|
> - `src/ir/calls.zig` — register `type_is_unsigned` as a `.bool` reflection
|
||||||
|
> builtin.
|
||||||
|
> - `src/ir/lower.zig` — `tryLowerReflectionCall` arm: static fold +
|
||||||
|
> dynamic `callBuiltin`.
|
||||||
|
> - `src/ir/interp.zig` — interp arm (reads the boxed TypeId / `type_of`
|
||||||
|
> aggregate shape).
|
||||||
|
> - `src/ir/emit_llvm.zig` + `src/backend/llvm/reflection.zig` +
|
||||||
|
> `src/backend/llvm/ops.zig` — lazy `[N x i1]` `__sx_type_is_unsigned`
|
||||||
|
> table built from `isUnsignedInt`; runtime arm GEPs in at the TypeId.
|
||||||
|
>
|
||||||
|
> **Regression test.** `examples/0046-basic-int-formatter-extremes.sx`
|
||||||
|
> pins both extremes plus a width spread (s8/s16/s32 + u8/u16/u32/u64,
|
||||||
|
> mins/maxes, 0, ordinary values). Unit tests: `isUnsignedInt` in
|
||||||
|
> `src/ir/types.test.zig`.
|
||||||
|
|
||||||
|
> STATUS (original): OPEN. Pre-existing + orthogonal; surfaced (not introduced) by NL.1.
|
||||||
|
> Manager-verified independent of the numeric-limit accessors. Scheduled separately.
|
||||||
|
|
||||||
|
## Symptom
|
||||||
|
|
||||||
|
`print("{}", x)` mis-renders the integer extremes the s64-based formatter can't
|
||||||
|
represent:
|
||||||
|
- `i64::MIN` (`-9223372036854775808`) prints a bare `-` (the minus sign with NO
|
||||||
|
digits).
|
||||||
|
- An unsigned all-ones value (e.g. `u64.max` = 18446744073709551615) prints `-1`
|
||||||
|
(the i64 bit-reinterpretation), not the unsigned decimal.
|
||||||
|
|
||||||
|
## Reproduction (no numeric-limit accessor needed — pre-existing)
|
||||||
|
|
||||||
|
```sx
|
||||||
|
#import "modules/std.sx";
|
||||||
|
main :: () {
|
||||||
|
x := -9223372036854775807 - 1; // i64::MIN
|
||||||
|
print("min={}\n", x); // prints "min=-" (should be -9223372036854775808)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`u64.max` (via the NL.1 accessor, or any all-ones u64) prints `-1` for the same
|
||||||
|
root reason.
|
||||||
|
|
||||||
|
## Root cause (suspected)
|
||||||
|
|
||||||
|
The integer-to-string path is `s64`-based (`std.int_to_string` / the `{}` formatter
|
||||||
|
takes `s64`): it negates the value to print the sign, but `-i64::MIN` overflows, and
|
||||||
|
it has no unsigned-aware path so an all-ones u64 is read as `-1`. Needs a width/
|
||||||
|
signedness-aware integer formatter (format by the value's actual integer TYPE:
|
||||||
|
unsigned types print the unsigned decimal; signed `MIN` is handled without negating).
|
||||||
|
|
||||||
|
## Investigation prompt
|
||||||
|
|
||||||
|
Make the `{}` integer formatter type-aware: render an unsigned integer as its
|
||||||
|
unsigned decimal (all 64 bits for u64), and handle signed `MIN` without the
|
||||||
|
`-MIN` overflow (e.g. format the magnitude via unsigned arithmetic, or special-case
|
||||||
|
MIN). Verify: `i64::MIN` prints `-9223372036854775808`; `u64.max` prints
|
||||||
|
`18446744073709551615`; existing numeric output (incl. the NL.1 examples, which
|
||||||
|
assert via bit-reinterpret) stays green. Likely area: the formatter / `int_to_string`
|
||||||
|
in the std print path and/or the comptime `{}` lowering.
|
||||||
@@ -20,6 +20,7 @@ field_count :: ($T: Type) -> s64 #builtin;
|
|||||||
field_name :: ($T: Type, idx: s64) -> string #builtin;
|
field_name :: ($T: Type, idx: s64) -> string #builtin;
|
||||||
field_value :: (s: $T, idx: s64) -> Any #builtin;
|
field_value :: (s: $T, idx: s64) -> Any #builtin;
|
||||||
is_flags :: ($T: Type) -> bool #builtin;
|
is_flags :: ($T: Type) -> bool #builtin;
|
||||||
|
type_is_unsigned :: ($T: Type) -> bool #builtin;
|
||||||
field_value_int :: ($T: Type, idx: s64) -> s64 #builtin;
|
field_value_int :: ($T: Type, idx: s64) -> s64 #builtin;
|
||||||
field_index :: ($T: Type, val: T) -> s64 #builtin;
|
field_index :: ($T: Type, val: T) -> s64 #builtin;
|
||||||
error_tag_name :: (e: $T) -> string #builtin;
|
error_tag_name :: (e: $T) -> string #builtin;
|
||||||
@@ -67,17 +68,50 @@ alloc_slice :: ($T: Type, count: s64) -> []T {
|
|||||||
int_to_string :: (n: s64) -> string {
|
int_to_string :: (n: s64) -> string {
|
||||||
if n == 0 { return "0"; }
|
if n == 0 { return "0"; }
|
||||||
neg := n < 0;
|
neg := n < 0;
|
||||||
v := if neg then 0 - n else n;
|
// Extract digits straight from `n` without ever negating it: `0 - n`
|
||||||
// Single pass: fill digits backwards into temp string, then substr
|
// overflows for s64::MIN (its magnitude is unrepresentable as a
|
||||||
|
// positive s64). sx `%` truncates toward zero, so `n % 10` keeps n's
|
||||||
|
// sign; take each remainder's absolute value for the digit.
|
||||||
tmp := cstring(20);
|
tmp := cstring(20);
|
||||||
i := 19;
|
i := 19;
|
||||||
while v > 0 {
|
v := n;
|
||||||
tmp[i] = (v % 10) + 48;
|
while v != 0 {
|
||||||
|
d := v % 10;
|
||||||
|
if d < 0 { d = 0 - d; }
|
||||||
|
tmp[i] = d + 48;
|
||||||
v = v / 10;
|
v = v / 10;
|
||||||
i -= 1;
|
i -= 1;
|
||||||
}
|
}
|
||||||
if neg { tmp[i] = 45; i -= 1; }
|
if neg { tmp[i] = 45; i -= 1; }
|
||||||
substr(tmp, i + 1, 20 - i - 1)
|
substr(tmp, i + 1, 19 - i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unsigned decimal of `n`'s 64 bits — renders the full u64 range
|
||||||
|
// (0 .. 18446744073709551615). Used by `any_to_string` for unsigned
|
||||||
|
// integer values, which an s64-based formatter would misread (e.g. a
|
||||||
|
// u64 all-ones value as -1).
|
||||||
|
uint_to_string :: (n: s64) -> string {
|
||||||
|
if n == 0 { return "0"; }
|
||||||
|
// Long division by 10 across the four unsigned 16-bit limbs, most
|
||||||
|
// significant first. Each step folds the running remainder into the
|
||||||
|
// next limb; the per-step accumulator stays well within s64
|
||||||
|
// (max 9*65536 + 65535), so signed `/` and `%` are exact.
|
||||||
|
g := decompose_u16x4(n);
|
||||||
|
tmp := cstring(20);
|
||||||
|
i := 19;
|
||||||
|
while g[0] != 0 or g[1] != 0 or g[2] != 0 or g[3] != 0 {
|
||||||
|
rem := 0;
|
||||||
|
k := 0;
|
||||||
|
while k < 4 {
|
||||||
|
acc := rem * 65536 + g[k];
|
||||||
|
g[k] = acc / 10;
|
||||||
|
rem = acc % 10;
|
||||||
|
k += 1;
|
||||||
|
}
|
||||||
|
tmp[i] = rem + 48;
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
|
substr(tmp, i + 1, 19 - i)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool_to_string :: (b: bool) -> string {
|
bool_to_string :: (b: bool) -> string {
|
||||||
@@ -121,10 +155,13 @@ hex_group :: (buf: string, offset: s64, val: s64) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int_to_hex_string :: (n: s64) -> string {
|
// Split the 64 bits of `n` into four unsigned 16-bit limbs, most
|
||||||
if n == 0 { return "0"; }
|
// significant first: [g3, g2, g1, g0]. A negative input is treated as
|
||||||
|
// its two's-complement unsigned bit pattern — each limb is corrected
|
||||||
// Split into four 16-bit groups for correct unsigned treatment
|
// back into 0..65535 — so callers get correct unsigned arithmetic out
|
||||||
|
// of a signed-only integer type. Shared by the hex and unsigned-decimal
|
||||||
|
// formatters.
|
||||||
|
decompose_u16x4 :: (n: s64) -> [4]s64 {
|
||||||
g0 := n % 65536;
|
g0 := n % 65536;
|
||||||
if g0 < 0 { g0 = g0 + 65536; }
|
if g0 < 0 { g0 = g0 + 65536; }
|
||||||
r1 := (n - g0) / 65536;
|
r1 := (n - g0) / 65536;
|
||||||
@@ -136,12 +173,23 @@ int_to_hex_string :: (n: s64) -> string {
|
|||||||
r3 := (r2 - g2) / 65536;
|
r3 := (r2 - g2) / 65536;
|
||||||
g3 := r3 % 65536;
|
g3 := r3 % 65536;
|
||||||
if g3 < 0 { g3 = g3 + 65536; }
|
if g3 < 0 { g3 = g3 + 65536; }
|
||||||
|
limbs : [4]s64 = ---;
|
||||||
|
limbs[0] = g3;
|
||||||
|
limbs[1] = g2;
|
||||||
|
limbs[2] = g1;
|
||||||
|
limbs[3] = g0;
|
||||||
|
limbs
|
||||||
|
}
|
||||||
|
|
||||||
|
int_to_hex_string :: (n: s64) -> string {
|
||||||
|
if n == 0 { return "0"; }
|
||||||
|
|
||||||
|
g := decompose_u16x4(n);
|
||||||
buf := cstring(16);
|
buf := cstring(16);
|
||||||
hex_group(buf, 0, g3);
|
hex_group(buf, 0, g[0]);
|
||||||
hex_group(buf, 4, g2);
|
hex_group(buf, 4, g[1]);
|
||||||
hex_group(buf, 8, g1);
|
hex_group(buf, 8, g[2]);
|
||||||
hex_group(buf, 12, g0);
|
hex_group(buf, 12, g[3]);
|
||||||
|
|
||||||
// Skip leading zeros (keep at least 1 digit)
|
// Skip leading zeros (keep at least 1 digit)
|
||||||
start := 0;
|
start := 0;
|
||||||
@@ -319,7 +367,10 @@ any_to_string :: (val: Any) -> string {
|
|||||||
type := type_of(val);
|
type := type_of(val);
|
||||||
if type == {
|
if type == {
|
||||||
case void: result = "";
|
case void: result = "";
|
||||||
case int: result = int_to_string(xx val);
|
case int: {
|
||||||
|
if type_is_unsigned(type) { result = uint_to_string(xx val); }
|
||||||
|
else { result = int_to_string(xx val); }
|
||||||
|
}
|
||||||
case string: { s : string = xx val; result = s; }
|
case string: { s : string = xx val; result = s; }
|
||||||
case bool: result = bool_to_string(xx val);
|
case bool: result = bool_to_string(xx val);
|
||||||
case float: result = float_to_string(xx val);
|
case float: result = float_to_string(xx val);
|
||||||
|
|||||||
@@ -429,10 +429,10 @@ The standard library (`modules/std.sx`) provides:
|
|||||||
|
|
||||||
- **I/O**: `print(fmt, args...)`, `out(str)`
|
- **I/O**: `print(fmt, args...)`, `out(str)`
|
||||||
- **Collections**: `List($T)` (dynamic array)
|
- **Collections**: `List($T)` (dynamic array)
|
||||||
- **Strings**: `concat`, `substr`, `int_to_string`, `float_to_string`, `cstring`
|
- **Strings**: `concat`, `substr`, `int_to_string`, `uint_to_string`, `float_to_string`, `cstring`
|
||||||
- **Memory**: `Allocator` protocol, `GPA` (general purpose), `Arena` (bump allocator)
|
- **Memory**: `Allocator` protocol, `GPA` (general purpose), `Arena` (bump allocator)
|
||||||
- **Math**: `sqrt`, `sin`, `cos`
|
- **Math**: `sqrt`, `sin`, `cos`
|
||||||
- **Introspection**: `type_of`, `type_name`, `field_count`, `field_name`, `field_value`, `size_of`
|
- **Introspection**: `type_of`, `type_name`, `type_is_unsigned`, `field_count`, `field_name`, `field_value`, `size_of`
|
||||||
|
|
||||||
### Command-line interface (`modules/std/cli.sx`)
|
### Command-line interface (`modules/std/cli.sx`)
|
||||||
|
|
||||||
|
|||||||
8
specs.md
8
specs.md
@@ -277,8 +277,12 @@ n := u64.max; // 18446744073709551615 (all-ones)
|
|||||||
(`18446744073709551615`), which exceeds the signed `i64` range used for
|
(`18446744073709551615`), which exceeds the signed `i64` range used for
|
||||||
integer constants; it is stored as that exact bit pattern carrying the `u64`
|
integer constants; it is stored as that exact bit pattern carrying the `u64`
|
||||||
type (it reinterprets to `-1` as an `s64`). It cannot be written as a decimal
|
type (it reinterprets to `-1` as an `s64`). It cannot be written as a decimal
|
||||||
literal, and the default integer formatter (which is `s64`-based) prints it as
|
literal. The default integer formatter is signedness-aware:
|
||||||
`-1`; assert it exactly through a bit reinterpret (`union { u: u64; s: s64 }`).
|
`print("{}", u64.max)` renders the full unsigned decimal
|
||||||
|
`18446744073709551615` (and any unsigned value across all 64 bits), while a
|
||||||
|
signed value — including `s64.min` — prints with all its digits. A bit
|
||||||
|
reinterpret (`union { u: u64; s: s64 }`) is still a valid way to inspect the
|
||||||
|
raw bits, but is no longer needed merely to print the value.
|
||||||
- **Non-numeric receivers.** `.min` / `.max` on a non-numeric type (`bool`,
|
- **Non-numeric receivers.** `.min` / `.max` on a non-numeric type (`bool`,
|
||||||
`string`, a pointer, a `struct`, `void`, an `enum`) is a compile error, never
|
`string`, a pointer, a `struct`, `void`, an `enum`) is a compile error, never
|
||||||
a silent value.
|
a silent value.
|
||||||
|
|||||||
@@ -1064,6 +1064,27 @@ pub const Ops = struct {
|
|||||||
const eq_res = c.LLVMBuildICmp(self.e.builder, c.LLVMIntEQ, a, b, "te.eq");
|
const eq_res = c.LLVMBuildICmp(self.e.builder, c.LLVMIntEQ, a, b, "te.eq");
|
||||||
self.e.mapRef(eq_res);
|
self.e.mapRef(eq_res);
|
||||||
},
|
},
|
||||||
|
.type_is_unsigned => {
|
||||||
|
// Dynamic `type_is_unsigned(t)`: extract the TypeId from
|
||||||
|
// the arg (Any-boxed Type → value field, or bare i64
|
||||||
|
// index), GEP into the `__sx_type_is_unsigned` table, load
|
||||||
|
// the i1. Mirrors the `type_name` runtime lookup.
|
||||||
|
const arg_ref = bi.args[0];
|
||||||
|
const arg_val = self.e.resolveRef(arg_ref);
|
||||||
|
const tid_idx = switch (self.e.reflectArgRepr(arg_ref)) {
|
||||||
|
.unresolved => @panic("type_is_unsigned: reflection arg IR-type unresolved — a type-resolution failure reached LLVM emission without a diagnostic"),
|
||||||
|
.boxed => c.LLVMBuildExtractValue(self.e.builder, arg_val, 1, "tiu.tid"),
|
||||||
|
.bare => arg_val,
|
||||||
|
};
|
||||||
|
const arr_global = self.e.reflection().getOrBuildTypeIsUnsignedArray();
|
||||||
|
const arr_len = self.e.type_is_unsigned_array_len;
|
||||||
|
const arr_ty = c.LLVMArrayType(self.e.cached_i1, arr_len);
|
||||||
|
const zero = c.LLVMConstInt(self.e.cached_i64, 0, 0);
|
||||||
|
var indices = [2]c.LLVMValueRef{ zero, tid_idx };
|
||||||
|
const gep = c.LLVMBuildInBoundsGEP2(self.e.builder, arr_ty, arr_global, &indices, 2, "tiu.gep");
|
||||||
|
const result = c.LLVMBuildLoad2(self.e.builder, self.e.cached_i1, gep, "tiu.load");
|
||||||
|
self.e.mapRef(result);
|
||||||
|
},
|
||||||
.has_impl => {
|
.has_impl => {
|
||||||
// Runtime has_impl needs a protocol-map
|
// Runtime has_impl needs a protocol-map
|
||||||
// snapshot — not wired yet. Silent false for
|
// snapshot — not wired yet. Silent false for
|
||||||
|
|||||||
@@ -60,6 +60,36 @@ pub const Reflection = struct {
|
|||||||
return global;
|
return global;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Lazy global `[N x i1]` indexed by `TypeId.index()`: 1 where the type is
|
||||||
|
/// an unsigned integer. Built on the first dynamic `type_is_unsigned(t)`
|
||||||
|
/// call site; the runtime arm GEPs in at the boxed TypeId and loads the bit.
|
||||||
|
/// Derives every entry from `TypeTable.isUnsignedInt` — the single
|
||||||
|
/// signedness source-of-truth, so no per-index magic lives in the emitter.
|
||||||
|
pub fn getOrBuildTypeIsUnsignedArray(self: Reflection) c.LLVMValueRef {
|
||||||
|
if (self.e.type_is_unsigned_array) |g| return g;
|
||||||
|
|
||||||
|
const n: u32 = @intCast(self.e.ir_mod.types.infos.items.len);
|
||||||
|
var field_vals = std.ArrayList(c.LLVMValueRef).empty;
|
||||||
|
defer field_vals.deinit(self.e.alloc);
|
||||||
|
var i: u32 = 0;
|
||||||
|
while (i < n) : (i += 1) {
|
||||||
|
const tid = TypeId.fromIndex(i);
|
||||||
|
const bit: u64 = if (self.e.ir_mod.types.isUnsignedInt(tid)) 1 else 0;
|
||||||
|
field_vals.append(self.e.alloc, c.LLVMConstInt(self.e.cached_i1, bit, 0)) catch unreachable;
|
||||||
|
}
|
||||||
|
|
||||||
|
const arr_ty = c.LLVMArrayType(self.e.cached_i1, n);
|
||||||
|
const arr_init = c.LLVMConstArray(self.e.cached_i1, field_vals.items.ptr, n);
|
||||||
|
const global = c.LLVMAddGlobal(self.e.llvm_module, arr_ty, "__sx_type_is_unsigned");
|
||||||
|
c.LLVMSetInitializer(global, arr_init);
|
||||||
|
c.LLVMSetGlobalConstant(global, 1);
|
||||||
|
c.LLVMSetLinkage(global, c.LLVMPrivateLinkage);
|
||||||
|
|
||||||
|
self.e.type_is_unsigned_array = global;
|
||||||
|
self.e.type_is_unsigned_array_len = n;
|
||||||
|
return global;
|
||||||
|
}
|
||||||
|
|
||||||
/// Build (or return cached) a global constant array of {ptr, i64} string values
|
/// Build (or return cached) a global constant array of {ptr, i64} string values
|
||||||
/// for the field names of a struct type.
|
/// for the field names of a struct type.
|
||||||
pub fn getOrBuildFieldNameArray(self: Reflection, struct_type: TypeId) c.LLVMValueRef {
|
pub fn getOrBuildFieldNameArray(self: Reflection, struct_type: TypeId) c.LLVMValueRef {
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ pub const CallResolver = struct {
|
|||||||
if (std.mem.eql(u8, bare_name, "__trace_resolve_frame"))
|
if (std.mem.eql(u8, bare_name, "__trace_resolve_frame"))
|
||||||
return refl(bare_name, self.l.module.types.findByName(self.l.module.types.internString("Frame")) orelse .unresolved);
|
return refl(bare_name, self.l.module.types.findByName(self.l.module.types.internString("Frame")) orelse .unresolved);
|
||||||
if (std.mem.eql(u8, bare_name, "is_flags")) return refl(bare_name, .bool);
|
if (std.mem.eql(u8, bare_name, "is_flags")) return refl(bare_name, .bool);
|
||||||
|
if (std.mem.eql(u8, bare_name, "type_is_unsigned")) return refl(bare_name, .bool);
|
||||||
if (std.mem.eql(u8, bare_name, "type_of")) return refl(bare_name, .any);
|
if (std.mem.eql(u8, bare_name, "type_of")) return refl(bare_name, .any);
|
||||||
if (std.mem.eql(u8, bare_name, "field_value")) return refl(bare_name, .any);
|
if (std.mem.eql(u8, bare_name, "field_value")) return refl(bare_name, .any);
|
||||||
// Generic function — infer return type via type bindings.
|
// Generic function — infer return type via type bindings.
|
||||||
|
|||||||
@@ -182,6 +182,12 @@ pub const LLVMEmitter = struct {
|
|||||||
type_name_array: ?c.LLVMValueRef = null,
|
type_name_array: ?c.LLVMValueRef = null,
|
||||||
type_name_array_len: u32 = 0,
|
type_name_array_len: u32 = 0,
|
||||||
|
|
||||||
|
// Lazy global `[N x i1]` indexed by TypeId.index(): true where the
|
||||||
|
// type is an unsigned integer. Built on the first dynamic
|
||||||
|
// `type_is_unsigned(t)` call site (the `{}` formatter's int branch).
|
||||||
|
type_is_unsigned_array: ?c.LLVMValueRef = null,
|
||||||
|
type_is_unsigned_array_len: u32 = 0,
|
||||||
|
|
||||||
// Target configuration (stored for ABI decisions during emission)
|
// Target configuration (stored for ABI decisions during emission)
|
||||||
target_config: TargetConfig,
|
target_config: TargetConfig,
|
||||||
|
|
||||||
|
|||||||
@@ -404,6 +404,7 @@ pub const BuiltinId = enum(u16) {
|
|||||||
// implements them; emit_llvm bails (Type is comptime-only).
|
// implements them; emit_llvm bails (Type is comptime-only).
|
||||||
type_name,
|
type_name,
|
||||||
type_eq,
|
type_eq,
|
||||||
|
type_is_unsigned,
|
||||||
has_impl,
|
has_impl,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1900,6 +1900,27 @@ pub const Interpreter = struct {
|
|||||||
const b = frame.getRef(bi.args[1]).asTypeId() orelse return bailDetail("comptime type_eq: second argument is not a Type value");
|
const b = frame.getRef(bi.args[1]).asTypeId() orelse return bailDetail("comptime type_eq: second argument is not a Type value");
|
||||||
return .{ .value = .{ .boolean = a == b } };
|
return .{ .value = .{ .boolean = a == b } };
|
||||||
},
|
},
|
||||||
|
.type_is_unsigned => {
|
||||||
|
if (bi.args.len < 1) return bailDetail("comptime type_is_unsigned: missing argument");
|
||||||
|
const arg = frame.getRef(bi.args[0]);
|
||||||
|
// Accept a bare `.type_tag`, an Any-boxed Type (`{tag,
|
||||||
|
// .type_tag}`), or the `type_of(x)` shape (`{.int(any),
|
||||||
|
// .int(typeid)}`) — the last is what `any_to_string`'s
|
||||||
|
// `case int:` passes, where the inner TypeId is carried
|
||||||
|
// as a plain integer rather than a `.type_tag`.
|
||||||
|
const tid = blk: {
|
||||||
|
if (arg.asTypeId()) |t| break :blk t;
|
||||||
|
if (arg == .aggregate) {
|
||||||
|
const fields = arg.aggregate;
|
||||||
|
if (fields.len >= 2) {
|
||||||
|
if (fields[1].asTypeId()) |t| break :blk t;
|
||||||
|
if (fields[1].asInt()) |iv| break :blk TypeId.fromIndex(@intCast(iv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bailDetail("comptime type_is_unsigned: argument is not a Type value (expected `.type_tag`, Any-boxed Type, or `type_of(x)`)");
|
||||||
|
};
|
||||||
|
return .{ .value = .{ .boolean = self.module.types.isUnsignedInt(tid) } };
|
||||||
|
},
|
||||||
.has_impl => {
|
.has_impl => {
|
||||||
// has_impl at interp time needs access to the host's
|
// has_impl at interp time needs access to the host's
|
||||||
// protocol-registration maps (protocol_thunk_map +
|
// protocol-registration maps (protocol_thunk_map +
|
||||||
|
|||||||
@@ -10561,6 +10561,24 @@ pub const Lowering = struct {
|
|||||||
const b = self.resolveTypeArg(c.args[1]);
|
const b = self.resolveTypeArg(c.args[1]);
|
||||||
return self.builder.constBool(a == b);
|
return self.builder.constBool(a == b);
|
||||||
}
|
}
|
||||||
|
if (std.mem.eql(u8, name, "type_is_unsigned")) {
|
||||||
|
// type_is_unsigned(T) → bool. Static arg (a spelled type or
|
||||||
|
// generic binding) folds to const_bool at lower time. A
|
||||||
|
// dynamic arg — the runtime `type_of(x)` value queried by
|
||||||
|
// `any_to_string` — emits a `callBuiltin`: the interp reads
|
||||||
|
// the boxed TypeId, LLVM GEPs a per-type signedness table.
|
||||||
|
// Mirrors `type_name`'s static/dynamic split; the same split
|
||||||
|
// avoids `resolveTypeArg`'s silent `.s64` default lying about
|
||||||
|
// a runtime Type value.
|
||||||
|
if (c.args.len < 1) return self.builder.constBool(false);
|
||||||
|
if (self.isStaticTypeArg(c.args[0])) {
|
||||||
|
const ty = self.resolveTypeArg(c.args[0]);
|
||||||
|
return self.builder.constBool(self.module.types.isUnsignedInt(ty));
|
||||||
|
}
|
||||||
|
const arg_ref = self.lowerExpr(c.args[0]);
|
||||||
|
const args_owned = self.alloc.dupe(Ref, &.{arg_ref}) catch return self.builder.constBool(false);
|
||||||
|
return self.builder.callBuiltin(.type_is_unsigned, args_owned, .bool);
|
||||||
|
}
|
||||||
if (std.mem.eql(u8, name, "has_impl")) {
|
if (std.mem.eql(u8, name, "has_impl")) {
|
||||||
// has_impl(P, T) → const_bool. Returns true when type T has
|
// has_impl(P, T) → const_bool. Returns true when type T has
|
||||||
// a reachable impl for protocol P. P is either:
|
// a reachable impl for protocol P. P is either:
|
||||||
|
|||||||
@@ -253,3 +253,37 @@ test "errorSetType: tags stored sorted by global id" {
|
|||||||
try std.testing.expectEqual(@as(usize, 3), stored.len);
|
try std.testing.expectEqual(@as(usize, 3), stored.len);
|
||||||
try std.testing.expect(stored[0] <= stored[1] and stored[1] <= stored[2]);
|
try std.testing.expect(stored[0] <= stored[1] and stored[1] <= stored[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "isUnsignedInt: builtin signedness classification" {
|
||||||
|
const alloc = std.testing.allocator;
|
||||||
|
var table = TypeTable.init(alloc);
|
||||||
|
defer table.deinit();
|
||||||
|
|
||||||
|
// Unsigned builtins (the formatter must route these to unsigned decimal).
|
||||||
|
inline for (.{ TypeId.u8, TypeId.u16, TypeId.u32, TypeId.u64, TypeId.usize }) |ty| {
|
||||||
|
try std.testing.expect(table.isUnsignedInt(ty));
|
||||||
|
}
|
||||||
|
// Signed / non-integer builtins are not unsigned.
|
||||||
|
inline for (.{
|
||||||
|
TypeId.s8, TypeId.s16, TypeId.s32, TypeId.s64, TypeId.isize,
|
||||||
|
TypeId.bool, TypeId.f32, TypeId.f64, TypeId.string,
|
||||||
|
TypeId.void, TypeId.any, TypeId.unresolved,
|
||||||
|
}) |ty| {
|
||||||
|
try std.testing.expect(!table.isUnsignedInt(ty));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test "isUnsignedInt: user-defined arbitrary-width ints" {
|
||||||
|
const alloc = std.testing.allocator;
|
||||||
|
var table = TypeTable.init(alloc);
|
||||||
|
defer table.deinit();
|
||||||
|
|
||||||
|
const u24_ty = table.intern(.{ .unsigned = 24 });
|
||||||
|
const s24_ty = table.intern(.{ .signed = 24 });
|
||||||
|
try std.testing.expect(table.isUnsignedInt(u24_ty));
|
||||||
|
try std.testing.expect(!table.isUnsignedInt(s24_ty));
|
||||||
|
|
||||||
|
// A non-integer user type is never unsigned.
|
||||||
|
const ptr_ty = table.ptrTo(.u32);
|
||||||
|
try std.testing.expect(!table.isUnsignedInt(ptr_ty));
|
||||||
|
}
|
||||||
|
|||||||
@@ -580,6 +580,20 @@ pub const TypeTable = struct {
|
|||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// True iff `ty` is an unsigned integer — a builtin (u8/u16/u32/u64/usize)
|
||||||
|
/// or a user-defined arbitrary-width unsigned int. Canonical signedness
|
||||||
|
/// query for reflection (`type_is_unsigned`) and the `{}` formatter so a
|
||||||
|
/// u64 value renders as unsigned decimal rather than the s64 reinterpretation.
|
||||||
|
pub fn isUnsignedInt(self: *const TypeTable, ty: TypeId) bool {
|
||||||
|
switch (ty) {
|
||||||
|
.u8, .u16, .u32, .u64, .usize => return true,
|
||||||
|
.bool, .s8, .s16, .s32, .s64, .isize => return false,
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
if (ty.isBuiltin()) return false;
|
||||||
|
return self.get(ty) == .unsigned;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn typeSizeBytes(self: *const TypeTable, ty: TypeId) usize {
|
pub fn typeSizeBytes(self: *const TypeTable, ty: TypeId) usize {
|
||||||
const ptr_size: usize = self.pointer_size;
|
const ptr_size: usize = self.pointer_size;
|
||||||
if (ty == .void) return 0;
|
if (ty == .void) return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user