Skip to content

Commit 6c51848

Browse files
authored
Cranelift: resolve value aliases when printing CLIF functions (bytecodealliance#8214)
This makes the CLIF much easier to follow.
1 parent 4f1e6f3 commit 6c51848

File tree

8 files changed

+95
-90
lines changed

8 files changed

+95
-90
lines changed

cranelift/codegen/src/write.rs

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -352,13 +352,14 @@ fn write_instruction(
352352
// Write out the result values, if any.
353353
let mut has_results = false;
354354
for r in func.dfg.inst_results(inst) {
355+
let r = func.dfg.resolve_aliases(*r);
355356
if !has_results {
356357
has_results = true;
357358
write!(w, "{}", r)?;
358359
} else {
359360
write!(w, ", {}", r)?;
360361
}
361-
if let Some(f) = &func.dfg.facts[*r] {
362+
if let Some(f) = &func.dfg.facts[r] {
362363
write!(w, " ! {}", f)?;
363364
}
364365
}
@@ -388,43 +389,53 @@ fn write_instruction(
388389
pub fn write_operands(w: &mut dyn Write, dfg: &DataFlowGraph, inst: Inst) -> fmt::Result {
389390
let pool = &dfg.value_lists;
390391
let jump_tables = &dfg.jump_tables;
392+
393+
// Resolve a value to its alias, if any.
394+
let v = |v: Value| dfg.resolve_aliases(v);
395+
396+
// Resolve a list of values to their aliases and format them.
397+
let vs = |vs: &[_]| {
398+
let vs: Vec<_> = vs.iter().copied().map(v).collect();
399+
DisplayValues(&vs).to_string()
400+
};
401+
391402
use crate::ir::instructions::InstructionData::*;
392403
match dfg.insts[inst] {
393-
AtomicRmw { op, args, .. } => write!(w, " {} {}, {}", op, args[0], args[1]),
394-
AtomicCas { args, .. } => write!(w, " {}, {}, {}", args[0], args[1], args[2]),
395-
LoadNoOffset { flags, arg, .. } => write!(w, "{} {}", flags, arg),
396-
StoreNoOffset { flags, args, .. } => write!(w, "{} {}, {}", flags, args[0], args[1]),
397-
Unary { arg, .. } => write!(w, " {}", arg),
404+
AtomicRmw { op, args, .. } => write!(w, " {} {}, {}", op, v(args[0]), v(args[1])),
405+
AtomicCas { args, .. } => write!(w, " {}, {}, {}", v(args[0]), v(args[1]), v(args[2])),
406+
LoadNoOffset { flags, arg, .. } => write!(w, "{} {}", flags, v(arg)),
407+
StoreNoOffset { flags, args, .. } => write!(w, "{} {}, {}", flags, v(args[0]), v(args[1])),
408+
Unary { arg, .. } => write!(w, " {}", v(arg)),
398409
UnaryImm { imm, .. } => write!(w, " {}", imm),
399410
UnaryIeee32 { imm, .. } => write!(w, " {}", imm),
400411
UnaryIeee64 { imm, .. } => write!(w, " {}", imm),
401412
UnaryGlobalValue { global_value, .. } => write!(w, " {}", global_value),
402413
UnaryConst {
403414
constant_handle, ..
404415
} => write!(w, " {}", constant_handle),
405-
Binary { args, .. } => write!(w, " {}, {}", args[0], args[1]),
406-
BinaryImm8 { arg, imm, .. } => write!(w, " {}, {}", arg, imm),
407-
BinaryImm64 { arg, imm, .. } => write!(w, " {}, {}", arg, imm),
408-
Ternary { args, .. } => write!(w, " {}, {}, {}", args[0], args[1], args[2]),
416+
Binary { args, .. } => write!(w, " {}, {}", v(args[0]), v(args[1])),
417+
BinaryImm8 { arg, imm, .. } => write!(w, " {}, {}", v(arg), imm),
418+
BinaryImm64 { arg, imm, .. } => write!(w, " {}, {}", v(arg), imm),
419+
Ternary { args, .. } => write!(w, " {}, {}, {}", v(args[0]), v(args[1]), v(args[2])),
409420
MultiAry { ref args, .. } => {
410421
if args.is_empty() {
411422
write!(w, "")
412423
} else {
413-
write!(w, " {}", DisplayValues(args.as_slice(pool)))
424+
write!(w, " {}", vs(args.as_slice(pool)))
414425
}
415426
}
416427
NullAry { .. } => write!(w, " "),
417-
TernaryImm8 { imm, args, .. } => write!(w, " {}, {}, {}", args[0], args[1], imm),
428+
TernaryImm8 { imm, args, .. } => write!(w, " {}, {}, {}", v(args[0]), v(args[1]), imm),
418429
Shuffle { imm, args, .. } => {
419430
let data = dfg.immediates.get(imm).expect(
420431
"Expected the shuffle mask to already be inserted into the immediates table",
421432
);
422-
write!(w, " {}, {}, {}", args[0], args[1], data)
433+
write!(w, " {}, {}, {}", v(args[0]), v(args[1]), data)
423434
}
424-
IntCompare { cond, args, .. } => write!(w, " {} {}, {}", cond, args[0], args[1]),
435+
IntCompare { cond, args, .. } => write!(w, " {} {}, {}", cond, v(args[0]), v(args[1])),
425436
IntCompareImm { cond, arg, imm, .. } => write!(w, " {} {}, {}", cond, arg, imm),
426-
IntAddTrap { args, code, .. } => write!(w, " {}, {}, {}", args[0], args[1], code),
427-
FloatCompare { cond, args, .. } => write!(w, " {} {}, {}", cond, args[0], args[1]),
437+
IntAddTrap { args, code, .. } => write!(w, " {}, {}, {}", v(args[0]), v(args[1]), code),
438+
FloatCompare { cond, args, .. } => write!(w, " {} {}, {}", cond, v(args[0]), v(args[1])),
428439
Jump { destination, .. } => {
429440
write!(w, " {}", destination.display(pool))
430441
}
@@ -433,26 +444,20 @@ pub fn write_operands(w: &mut dyn Write, dfg: &DataFlowGraph, inst: Inst) -> fmt
433444
blocks: [block_then, block_else],
434445
..
435446
} => {
436-
write!(w, " {}, {}", arg, block_then.display(pool))?;
447+
write!(w, " {}, {}", v(arg), block_then.display(pool))?;
437448
write!(w, ", {}", block_else.display(pool))
438449
}
439450
BranchTable { arg, table, .. } => {
440-
write!(w, " {}, {}", arg, jump_tables[table].display(pool))
451+
write!(w, " {}, {}", v(arg), jump_tables[table].display(pool))
441452
}
442453
Call {
443454
func_ref, ref args, ..
444-
} => write!(w, " {}({})", func_ref, DisplayValues(args.as_slice(pool))),
455+
} => write!(w, " {}({})", func_ref, vs(args.as_slice(pool))),
445456
CallIndirect {
446457
sig_ref, ref args, ..
447458
} => {
448459
let args = args.as_slice(pool);
449-
write!(
450-
w,
451-
" {}, {}({})",
452-
sig_ref,
453-
args[0],
454-
DisplayValues(&args[1..])
455-
)
460+
write!(w, " {}, {}({})", sig_ref, args[0], vs(&args[1..]))
456461
}
457462
FuncAddr { func_ref, .. } => write!(w, " {}", func_ref),
458463
StackLoad {
@@ -463,7 +468,7 @@ pub fn write_operands(w: &mut dyn Write, dfg: &DataFlowGraph, inst: Inst) -> fmt
463468
stack_slot,
464469
offset,
465470
..
466-
} => write!(w, " {}, {}{}", arg, stack_slot, offset),
471+
} => write!(w, " {}, {}{}", v(arg), stack_slot, offset),
467472
DynamicStackLoad {
468473
dynamic_stack_slot, ..
469474
} => write!(w, " {}", dynamic_stack_slot),
@@ -474,15 +479,15 @@ pub fn write_operands(w: &mut dyn Write, dfg: &DataFlowGraph, inst: Inst) -> fmt
474479
} => write!(w, " {}, {}", arg, dynamic_stack_slot),
475480
Load {
476481
flags, arg, offset, ..
477-
} => write!(w, "{} {}{}", flags, arg, offset),
482+
} => write!(w, "{} {}{}", flags, v(arg), offset),
478483
Store {
479484
flags,
480485
args,
481486
offset,
482487
..
483-
} => write!(w, "{} {}, {}{}", flags, args[0], args[1], offset),
488+
} => write!(w, "{} {}, {}{}", flags, v(args[0]), v(args[1]), offset),
484489
Trap { code, .. } => write!(w, " {}", code),
485-
CondTrap { arg, code, .. } => write!(w, " {}, {}", arg, code),
490+
CondTrap { arg, code, .. } => write!(w, " {}, {}", v(arg), code),
486491
}?;
487492

488493
let mut sep = " ; ";
@@ -497,7 +502,7 @@ pub fn write_operands(w: &mut dyn Write, dfg: &DataFlowGraph, inst: Inst) -> fmt
497502
} => constant_handle.to_string(),
498503
_ => continue,
499504
};
500-
write!(w, "{}{} = {}", sep, arg, imm)?;
505+
write!(w, "{}{} = {}", sep, v(arg), imm)?;
501506
sep = ", ";
502507
}
503508
}
@@ -603,7 +608,7 @@ mod tests {
603608
}
604609
assert_eq!(
605610
func.to_string(),
606-
"function u0:0() fast {\nblock0(v3: i32):\n v0 -> v3\n v2 -> v0\n v4 = iconst.i32 42\n v5 = iadd v0, v0\n v1 -> v5\n v6 = iconst.i32 23\n v7 = iadd v1, v1\n}\n"
611+
"function u0:0() fast {\nblock0(v3: i32):\n v0 -> v3\n v2 -> v0\n v4 = iconst.i32 42\n v5 = iadd v3, v3\n v1 -> v5\n v6 = iconst.i32 23\n v7 = iadd v5, v5\n}\n"
607612
);
608613
}
609614

cranelift/frontend/src/frontend.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,8 +1294,8 @@ block0:
12941294
v1 -> v4
12951295
v3 = iconst.i64 0
12961296
v0 -> v3
1297-
v2 = call fn0(v1, v0, v1) ; v1 = 0, v0 = 0, v1 = 0
1298-
return v1 ; v1 = 0
1297+
v2 = call fn0(v4, v3, v4) ; v4 = 0, v3 = 0, v4 = 0
1298+
return v4 ; v4 = 0
12991299
}
13001300
",
13011301
);
@@ -1347,9 +1347,9 @@ block0:
13471347
v1 -> v4
13481348
v3 = iconst.i64 0
13491349
v0 -> v3
1350-
v2 = load.i64 aligned v0 ; v0 = 0
1351-
store aligned v2, v1 ; v1 = 0
1352-
return v1 ; v1 = 0
1350+
v2 = load.i64 aligned v3 ; v3 = 0
1351+
store aligned v2, v4 ; v4 = 0
1352+
return v4 ; v4 = 0
13531353
}
13541354
",
13551355
);
@@ -1405,8 +1405,8 @@ block0:
14051405
v4 = iconst.i64 0
14061406
v0 -> v4
14071407
v2 = iconst.i64 8192
1408-
v3 = call fn0(v1, v0, v2) ; v1 = 0, v0 = 0, v2 = 8192
1409-
return v1 ; v1 = 0
1408+
v3 = call fn0(v5, v4, v2) ; v5 = 0, v4 = 0, v2 = 8192
1409+
return v5 ; v5 = 0
14101410
}
14111411
",
14121412
);
@@ -1445,8 +1445,8 @@ block0:
14451445
v2 = iconst.i64 0
14461446
v0 -> v2
14471447
v1 = iconst.i64 0x0101_0101_0101_0101
1448-
store aligned v1, v0 ; v1 = 0x0101_0101_0101_0101, v0 = 0
1449-
return v0 ; v0 = 0
1448+
store aligned v1, v2 ; v1 = 0x0101_0101_0101_0101, v2 = 0
1449+
return v2 ; v2 = 0
14501450
}
14511451
",
14521452
);
@@ -1490,8 +1490,8 @@ block0:
14901490
v1 = iconst.i8 1
14911491
v2 = iconst.i64 8192
14921492
v3 = uextend.i32 v1 ; v1 = 1
1493-
v4 = call fn0(v0, v3, v2) ; v0 = 0, v2 = 8192
1494-
return v0 ; v0 = 0
1493+
v4 = call fn0(v5, v3, v2) ; v5 = 0, v2 = 8192
1494+
return v5 ; v5 = 0
14951495
}
14961496
",
14971497
);
@@ -1555,7 +1555,7 @@ block0:
15551555
v1 -> v5
15561556
v4 = iconst.i64 0
15571557
v0 -> v4
1558-
v3 = call fn0(v0, v1, v2) ; v0 = 0, v1 = 0, v2 = 0
1558+
v3 = call fn0(v4, v5, v6) ; v4 = 0, v5 = 0, v6 = 0
15591559
return v3
15601560
}
15611561
",
@@ -1599,8 +1599,8 @@ block0:
15991599
v1 -> v6
16001600
v5 = iconst.i64 0
16011601
v0 -> v5
1602-
v2 = load.i8 aligned v0 ; v0 = 0
1603-
v3 = load.i8 aligned v1 ; v1 = 0
1602+
v2 = load.i8 aligned v5 ; v5 = 0
1603+
v3 = load.i8 aligned v6 ; v6 = 0
16041604
v4 = icmp ugt v2, v3
16051605
return v4",
16061606
|builder, target, x, y| {
@@ -1628,8 +1628,8 @@ block0:
16281628
v1 -> v6
16291629
v5 = iconst.i64 0
16301630
v0 -> v5
1631-
v2 = load.i32 aligned v0 ; v0 = 0
1632-
v3 = load.i32 aligned v1 ; v1 = 0
1631+
v2 = load.i32 aligned v5 ; v5 = 0
1632+
v3 = load.i32 aligned v6 ; v6 = 0
16331633
v4 = icmp eq v2, v3
16341634
return v4",
16351635
|builder, target, x, y| {
@@ -1657,8 +1657,8 @@ block0:
16571657
v1 -> v6
16581658
v5 = iconst.i64 0
16591659
v0 -> v5
1660-
v2 = load.i128 v0 ; v0 = 0
1661-
v3 = load.i128 v1 ; v1 = 0
1660+
v2 = load.i128 v5 ; v5 = 0
1661+
v3 = load.i128 v6 ; v6 = 0
16621662
v4 = icmp ne v2, v3
16631663
return v4",
16641664
|builder, target, x, y| {
@@ -1690,7 +1690,7 @@ block0:
16901690
v5 = iconst.i64 0
16911691
v0 -> v5
16921692
v2 = iconst.i64 3
1693-
v3 = call fn0(v0, v1, v2) ; v0 = 0, v1 = 0, v2 = 3
1693+
v3 = call fn0(v5, v6, v2) ; v5 = 0, v6 = 0, v2 = 3
16941694
v4 = icmp_imm sge v3, 0
16951695
return v4",
16961696
|builder, target, x, y| {
@@ -1801,7 +1801,7 @@ block0:
18011801
v1 -> v4
18021802
v3 = vconst.i8x16 const0
18031803
v0 -> v3
1804-
return v0, v1, v2 ; v0 = const0, v1 = const0
1804+
return v3, v4, v6 ; v3 = const0, v4 = const0
18051805
}
18061806
",
18071807
);

tests/disas/dead-code.wat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
;; @0023 jump block2
3333
;;
3434
;; block2:
35-
;; @0029 brif.i32 v3, block4, block5
35+
;; @0029 brif.i32 v2, block4, block5
3636
;;
3737
;; block5:
3838
;; @002b jump block2

tests/disas/if-unreachable-else-params.wat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
;; @0045 jump block2(v3) ; v3 = 35
5757
;;
5858
;; block2(v4: i32):
59-
;; @0049 brif.i32 v5, block4, block6(v4)
59+
;; @0049 brif.i32 v2, block4, block6(v4)
6060
;;
6161
;; block4:
6262
;; @004b v7 = uextend.i64 v4

tests/disas/table-get-fixed-size.wat

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
;; @0054 v4 = iconst.i32 7
3333
;; @0054 v5 = icmp uge v3, v4 ; v3 = 0, v4 = 7
3434
;; @0054 v6 = uextend.i64 v3 ; v3 = 0
35-
;; @0054 v7 = load.i64 notrap aligned v25+72
35+
;; @0054 v7 = load.i64 notrap aligned v0+72
3636
;; v26 = iconst.i64 3
3737
;; @0054 v8 = ishl v6, v26 ; v26 = 3
3838
;; @0054 v9 = iadd v7, v8
@@ -44,7 +44,7 @@
4444
;; @0054 brif v13, block2, block3
4545
;;
4646
;; block3:
47-
;; @0054 v15 = load.i64 notrap aligned v14+32
47+
;; @0054 v15 = load.i64 notrap aligned v0+32
4848
;; @0054 v16 = load.i64 notrap aligned v15
4949
;; @0054 v17 = load.i64 notrap aligned v15+8
5050
;; @0054 v18 = icmp eq v16, v17
@@ -62,16 +62,16 @@
6262
;; @0054 jump block2
6363
;;
6464
;; block4:
65-
;; @0054 v20 = load.i64 notrap aligned readonly v19+56
65+
;; @0054 v20 = load.i64 notrap aligned readonly v0+56
6666
;; @0054 v21 = load.i64 notrap aligned readonly v20+208
67-
;; @0054 call_indirect sig0, v21(v19, v12)
67+
;; @0054 call_indirect sig0, v21(v0, v12)
6868
;; @0054 jump block2
6969
;;
7070
;; block2:
7171
;; @0056 jump block1
7272
;;
7373
;; block1:
74-
;; @0056 return v2
74+
;; @0056 return v12
7575
;; }
7676
;;
7777
;; function u0:1(i64 vmctx, i64, i32) -> r64 fast {
@@ -90,7 +90,7 @@
9090
;; @005b v4 = iconst.i32 7
9191
;; @005b v5 = icmp uge v2, v4 ; v4 = 7
9292
;; @005b v6 = uextend.i64 v2
93-
;; @005b v7 = load.i64 notrap aligned v25+72
93+
;; @005b v7 = load.i64 notrap aligned v0+72
9494
;; v26 = iconst.i64 3
9595
;; @005b v8 = ishl v6, v26 ; v26 = 3
9696
;; @005b v9 = iadd v7, v8
@@ -102,7 +102,7 @@
102102
;; @005b brif v13, block2, block3
103103
;;
104104
;; block3:
105-
;; @005b v15 = load.i64 notrap aligned v14+32
105+
;; @005b v15 = load.i64 notrap aligned v0+32
106106
;; @005b v16 = load.i64 notrap aligned v15
107107
;; @005b v17 = load.i64 notrap aligned v15+8
108108
;; @005b v18 = icmp eq v16, v17
@@ -120,14 +120,14 @@
120120
;; @005b jump block2
121121
;;
122122
;; block4:
123-
;; @005b v20 = load.i64 notrap aligned readonly v19+56
123+
;; @005b v20 = load.i64 notrap aligned readonly v0+56
124124
;; @005b v21 = load.i64 notrap aligned readonly v20+208
125-
;; @005b call_indirect sig0, v21(v19, v12)
125+
;; @005b call_indirect sig0, v21(v0, v12)
126126
;; @005b jump block2
127127
;;
128128
;; block2:
129129
;; @005d jump block1
130130
;;
131131
;; block1:
132-
;; @005d return v3
132+
;; @005d return v12
133133
;; }

0 commit comments

Comments
 (0)