* Manually rename BasicBlock to BlockPredecessor BasicBlock is a pair of (Ebb, Inst) that is used to represent the basic block subcomponent of an Ebb that is a predecessor to an Ebb. Eventually we will be able to remove this struct, but for now it makes sense to give it a non-conflicting name so that we can start to transition Ebb to represent a basic block. I have not updated any comments that refer to BasicBlock, as eventually we will remove BlockPredecessor and replace with Block, which is a basic block, so the comments will become correct. * Manually rename SSABuilder block types to avoid conflict SSABuilder has its own Block and BlockData types. These along with associated identifier will cause conflicts in a later commit, so they are renamed to be more verbose here. * Automatically rename 'Ebb' to 'Block' in *.rs * Automatically rename 'EBB' to 'block' in *.rs * Automatically rename 'ebb' to 'block' in *.rs * Automatically rename 'extended basic block' to 'basic block' in *.rs * Automatically rename 'an basic block' to 'a basic block' in *.rs * Manually update comment for `Block` `Block`'s wikipedia article required an update. * Automatically rename 'an `Block`' to 'a `Block`' in *.rs * Automatically rename 'extended_basic_block' to 'basic_block' in *.rs * Automatically rename 'ebb' to 'block' in *.clif * Manually rename clif constant that contains 'ebb' as substring to avoid conflict * Automatically rename filecheck uses of 'EBB' to 'BB' 'regex: EBB' -> 'regex: BB' '$EBB' -> '$BB' * Automatically rename 'EBB' 'Ebb' to 'block' in *.clif * Automatically rename 'an block' to 'a block' in *.clif * Fix broken testcase when function name length increases Test function names are limited to 16 characters. This causes the new longer name to be truncated and fail a filecheck test. An outdated comment was also fixed.
52 lines
1.6 KiB
Plaintext
52 lines
1.6 KiB
Plaintext
test regalloc
|
|
target x86_64 haswell
|
|
|
|
; Test combinations of constraints.
|
|
;
|
|
; The x86 ushr instruction requires its second operand to be passed in %rcx and its output is
|
|
; tied to the first input operand.
|
|
;
|
|
; If we pass the same value to both operands, both constraints must be satisfied.
|
|
|
|
; Found by the Binaryen fuzzer in PR221.
|
|
;
|
|
; Conditions triggering the problem:
|
|
;
|
|
; - The same value used for a tied operand and a fixed operand.
|
|
; - The common value is already in %rcx.
|
|
; - The tied output value is live outside the block.
|
|
;
|
|
; Under these conditions, Solver::add_tied_input() would create a variable for the tied input
|
|
; without considering the fixed constraint.
|
|
function %pr221(i64 [%rdi], i64 [%rsi], i64 [%rdx], i64 [%rcx]) -> i64 [%rax] {
|
|
block0(v0: i64, v1: i64, v2: i64, v3: i64):
|
|
v4 = ushr v3, v3
|
|
jump block1
|
|
|
|
block1:
|
|
return v4
|
|
}
|
|
|
|
; Found by the Binaryen fuzzer in PR218.
|
|
;
|
|
; This is a similar situation involving combined constraints on the ushr instruction:
|
|
;
|
|
; - The %rcx register is already in use by a globally live value.
|
|
; - The ushr x, x result is also a globally live value.
|
|
;
|
|
; Since the ushr x, x result is forced to be placed in %rcx, we must set the replace_global_defines
|
|
; flag so it can be reassigned to a different global register.
|
|
function %pr218(i64 [%rdi], i64 [%rsi], i64 [%rdx], i64 [%rcx]) -> i64 [%rax] {
|
|
block0(v0: i64, v1: i64, v2: i64, v3: i64):
|
|
; check: regmove v3, %rcx ->
|
|
v4 = ushr v0, v0
|
|
; check: v4 = copy
|
|
jump block1
|
|
|
|
block1:
|
|
; v3 is globally live in %rcx.
|
|
; v4 is also globally live. Needs to be assigned something else for the trip across the CFG edge.
|
|
v5 = iadd v3, v4
|
|
return v5
|
|
}
|