This allows GVN to avoid hoisting them. These will be to coarse for things that want more precise dependence information, however we can work that out when we build such things.
57 lines
1.0 KiB
Plaintext
57 lines
1.0 KiB
Plaintext
test simple-gvn
|
|
|
|
function %other_side_effects(i32) -> i32 {
|
|
ebb0(v0: i32):
|
|
regmove v0, %10 -> %20
|
|
regmove v0, %10 -> %20
|
|
regmove v0, %20 -> %10
|
|
; check: regmove v0, %10 -> %20
|
|
; check: regmove v0, %10 -> %20
|
|
return v0
|
|
}
|
|
|
|
function %differing_typevars() -> i64 {
|
|
ebb0:
|
|
v0 = iconst.i32 7
|
|
v1 = iconst.i64 7
|
|
v2 = iconst.i64 8
|
|
; check: v0 = iconst.i32 7
|
|
; check: v1 = iconst.i64 7
|
|
; check: v2 = iconst.i64 8
|
|
v3 = uextend.i64 v0
|
|
v4 = iadd v2, v1
|
|
v5 = iadd v4, v3
|
|
return v5
|
|
}
|
|
|
|
function %cpu_flags() -> b1 {
|
|
ebb0:
|
|
v0 = iconst.i32 7
|
|
v1 = iconst.i32 8
|
|
v2 = ifcmp v0, v1
|
|
v3 = trueif eq v2
|
|
v4 = ifcmp v0, v1
|
|
v5 = trueif eq v4
|
|
v6 = bor v3, v5
|
|
; check: v2 = ifcmp v0, v1
|
|
; check: v3 = trueif eq v2
|
|
; check: v4 = ifcmp v0, v1
|
|
; check: v5 = trueif eq v4
|
|
return v6
|
|
}
|
|
|
|
function %spill() -> i32 {
|
|
ebb0:
|
|
v0 = iconst.i32 7
|
|
v1 = spill v0
|
|
v2 = fill v1
|
|
v3 = spill v0
|
|
v4 = fill v1
|
|
v5 = bor v2, v4
|
|
; check: v1 = spill v0
|
|
; check: v2 = fill v1
|
|
; check: v3 = spill v0
|
|
; check: v4 = fill v1
|
|
return v5
|
|
}
|