449 lines
10 KiB
Factor
449 lines
10 KiB
Factor
USING: arrays compiler.cfg.alias-analysis compiler.cfg.instructions
|
|
compiler.cfg.registers compiler.cfg.debugger compiler.cfg.comparisons
|
|
cpu.architecture tools.test byte-arrays layouts literals alien
|
|
accessors sequences ;
|
|
IN: compiler.cfg.alias-analysis.tests
|
|
|
|
: test-alias-analysis ( insn -- insn )
|
|
init-alias-analysis
|
|
alias-analysis-step
|
|
[ f >>insn# ] map ;
|
|
|
|
! Redundant load elimination
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##copy f 2 1 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Store-load forwarding
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##copy f 2 1 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Dead store elimination
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##set-slot-imm f 3 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
T{ ##set-slot-imm f 3 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Redundant store elimination
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##copy f 2 1 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##copy f 2 1 any-rep }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Not a redundant load
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##set-slot-imm f 0 1 1 0 }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##set-slot-imm f 0 1 1 0 }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Not a redundant store
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##set-slot-imm f 2 1 1 0 }
|
|
T{ ##slot-imm f 4 0 1 0 }
|
|
T{ ##set-slot-imm f 3 1 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##set-slot-imm f 2 1 1 0 }
|
|
T{ ##slot-imm f 4 0 1 0 }
|
|
T{ ##set-slot-imm f 3 1 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! There's a redundant load, but not a redundant store
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##slot-imm f 4 0 1 0 }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
T{ ##slot f 5 0 3 0 0 }
|
|
T{ ##set-slot-imm f 3 0 1 0 }
|
|
T{ ##copy f 6 3 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##slot-imm f 4 0 1 0 }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
T{ ##slot f 5 0 3 0 0 }
|
|
T{ ##set-slot-imm f 3 0 1 0 }
|
|
T{ ##slot-imm f 6 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Fresh allocations don't alias existing values
|
|
|
|
! Redundant load elimination
|
|
[
|
|
V{
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##set-slot-imm f 3 4 1 0 }
|
|
T{ ##set-slot-imm f 2 1 1 0 }
|
|
T{ ##copy f 5 3 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##set-slot-imm f 3 4 1 0 }
|
|
T{ ##set-slot-imm f 2 1 1 0 }
|
|
T{ ##slot-imm f 5 4 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Redundant store elimination
|
|
[
|
|
V{
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##slot-imm f 5 1 1 0 }
|
|
T{ ##set-slot-imm f 3 4 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##set-slot-imm f 1 4 1 0 }
|
|
T{ ##slot-imm f 5 1 1 0 }
|
|
T{ ##set-slot-imm f 3 4 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Storing a new alias class into another object means that heap-ac
|
|
! can now alias the new ac
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##set-slot-imm f 0 4 1 0 }
|
|
T{ ##set-slot-imm f 4 2 1 0 }
|
|
T{ ##slot-imm f 5 3 1 0 }
|
|
T{ ##set-slot-imm f 1 5 1 0 }
|
|
T{ ##slot-imm f 6 4 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##peek f 3 D 3 }
|
|
T{ ##allot f 4 16 array }
|
|
T{ ##set-slot-imm f 0 4 1 0 }
|
|
T{ ##set-slot-imm f 4 2 1 0 }
|
|
T{ ##slot-imm f 5 3 1 0 }
|
|
T{ ##set-slot-imm f 1 5 1 0 }
|
|
T{ ##slot-imm f 6 4 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Compares between objects which cannot alias are eliminated
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##allot f 1 16 array }
|
|
T{ ##load-reference f 2 f }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##allot f 1 16 array }
|
|
T{ ##compare f 2 0 1 cc= }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Make sure that input to ##box-displaced-alien becomes heap-ac
|
|
[
|
|
V{
|
|
T{ ##allot f 1 16 byte-array }
|
|
T{ ##load-reference f 2 10 }
|
|
T{ ##box-displaced-alien f 3 2 1 4 byte-array }
|
|
T{ ##slot-imm f 5 3 1 $[ alien type-number ] }
|
|
T{ ##compare f 6 5 1 cc= }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 1 16 byte-array }
|
|
T{ ##load-reference f 2 10 }
|
|
T{ ##box-displaced-alien f 3 2 1 4 byte-array }
|
|
T{ ##slot-imm f 5 3 1 $[ alien type-number ] }
|
|
T{ ##compare f 6 5 1 cc= }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! We can't make any assumptions about heap-ac between
|
|
! instructions which can call back into Factor code
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##peek f 0 D 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! We can't eliminate stores on any alias class across a GC-ing
|
|
! instruction
|
|
[
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##copy f 2 1 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##copy f 2 1 any-rep }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##peek f 1 D 1 }
|
|
T{ ##peek f 2 D 2 }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
[
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##slot-imm f 1 0 1 0 }
|
|
T{ ##alien-invoke f { } { } { } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 1 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|
|
|
|
! Make sure that gc-map-insns which are also vreg-insns are
|
|
! handled properly
|
|
[
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##allot f 0 }
|
|
T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
|
|
T{ ##set-slot-imm f 2 0 1 0 }
|
|
} test-alias-analysis
|
|
] unit-test
|