-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MachineBasicBlock: add liveout iterator aware of which liveins are de…
…fined by the runtime. Using this in RegAlloc fast reduces register pressure, and in some cases allows x86 code to compile that wouldn't before.
- Loading branch information
1 parent
4f86aa6
commit c1dc267
Showing
6 changed files
with
167 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - | FileCheck %s | ||
declare void @foo(i32, ...) | ||
|
||
declare i32 @__gxx_personality_v0(...) | ||
|
||
; We were running out of registers for this invoke, because: | ||
|
||
; 1. The lshr/and pattern gets matched to a no-REX MOV so that ah/bh/... can | ||
; be used instead, cutting available registers for %b.arg down to eax, ebx, | ||
; ecx, edx, esi, edi. | ||
; 2. We have a base pointer taking ebx out of contention. | ||
; 3. The landingpad block convinced us we should be defining rax here. | ||
; 3. The al fiddling for the varargs call only noted down that al was spillable, | ||
; not ah or hax. | ||
; | ||
; So by the time we need to allocate a register for the call all registers are | ||
; tied up and unspillable. | ||
|
||
; CHECK-LABEL: bar: | ||
; CHECK: xorl %edi, %edi | ||
; CHECK: movb %dil, {{[0-9]+}}(%rbx) | ||
; CHECK: movb {{[0-9]+}}(%rbx), %al | ||
|
||
define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d, ...) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { | ||
%mem = alloca i32, i32 %a, align 32 ; Force rbx to be used as a base pointer | ||
%b.tmp = lshr i32 %b, 8 | ||
%b.arg = and i32 %b.tmp, 255 | ||
invoke void(i32, ...) @foo(i32 42, i32* %mem, i32 %c, i32 %d, i32 %b.arg) to label %success unwind label %fail | ||
|
||
success: | ||
ret i32 0 | ||
fail: | ||
%exc = landingpad { i8*, i32 } cleanup | ||
%res = extractvalue { i8*, i32 } %exc, 1 | ||
ret i32 %res | ||
} | ||
|
||
; CHECK-LABEL: live: | ||
; CHECK: movl {{%.*}}, %eax | ||
|
||
define i32 @live(i32 %a, i32 %b, i32 %c, i32 %d, ...) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { | ||
%mem = alloca i32, i32 %a, align 32 ; Force rbx to be used as a base pointer | ||
%b.tmp = lshr i32 %b, 8 | ||
%b.arg = and i32 %b.tmp, 255 | ||
invoke void(i32, ...) @foo(i32 42) to label %success unwind label %fail | ||
|
||
success: | ||
ret i32 0 | ||
fail: | ||
%exc = landingpad { i8*, i32 } cleanup | ||
%res = extractvalue { i8*, i32 } %exc, 1 | ||
ret i32 %b.arg | ||
} |