Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LivePhysRegs] Fix handling of return instructions.
See D42509 for the original version of this. Basically, there are two significant changes to behavior here: - addLiveOuts always adds all pristine registers (even if a block has no successors). - addLiveOuts and addLiveOutsNoPristines always add all callee-saved registers for return blocks (including conditional return blocks). I cleaned up the functions a bit to make it clear these properties hold. Differential Revision: https://reviews.llvm.org/D42655 llvm-svn: 324422
- Loading branch information
Eli Friedman
committed
Feb 6, 2018
1 parent
339dbb8
commit 98f8bba
Showing
3 changed files
with
61 additions
and
18 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
; RUN: llc < %s | ||
; RUN: llc -verify-machineinstrs < %s | ||
; PR25838 | ||
|
||
target triple = "armv7--linux-android" | ||
|
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,46 @@ | ||
; RUN: llc < %s | FileCheck %s | ||
target triple = "thumbv6---gnueabi" | ||
|
||
; Use STM to save the three registers | ||
; CHECK-LABEL: use_stm: | ||
; CHECK: .save {r7, lr} | ||
; CHECK: .setfp r7, sp | ||
; CHECK: stm r3!, {r0, r1, r2} | ||
; CHECK: bl throws_1 | ||
define void @use_stm(i32 %a, i32 %b, i32 %c, i32* %d) local_unnamed_addr noreturn "no-frame-pointer-elim"="true" { | ||
entry: | ||
%arrayidx = getelementptr inbounds i32, i32* %d, i32 2 | ||
store i32 %a, i32* %arrayidx, align 4 | ||
%arrayidx1 = getelementptr inbounds i32, i32* %d, i32 3 | ||
store i32 %b, i32* %arrayidx1, align 4 | ||
%arrayidx2 = getelementptr inbounds i32, i32* %d, i32 4 | ||
store i32 %c, i32* %arrayidx2, align 4 | ||
tail call void @throws_1(i32 %a, i32 %b, i32 %c) noreturn | ||
unreachable | ||
} | ||
|
||
; Don't use STM: there is no available register to store | ||
; the address. We could transform this with some extra math, but | ||
; that currently isn't implemented. | ||
; CHECK-LABEL: no_stm: | ||
; CHECK: .save {r7, lr} | ||
; CHECK: .setfp r7, sp | ||
; CHECK: str r0, | ||
; CHECK: str r1, | ||
; CHECK: str r2, | ||
; CHECK: bl throws_2 | ||
define void @no_stm(i32 %a, i32 %b, i32 %c, i32* %d) local_unnamed_addr noreturn "no-frame-pointer-elim"="true" { | ||
entry: | ||
%arrayidx = getelementptr inbounds i32, i32* %d, i32 2 | ||
store i32 %a, i32* %arrayidx, align 4 | ||
%arrayidx1 = getelementptr inbounds i32, i32* %d, i32 3 | ||
store i32 %b, i32* %arrayidx1, align 4 | ||
%arrayidx2 = getelementptr inbounds i32, i32* %d, i32 4 | ||
store i32 %c, i32* %arrayidx2, align 4 | ||
tail call void @throws_2(i32 %a, i32 %b, i32 %c, i32* %d) noreturn | ||
unreachable | ||
} | ||
|
||
|
||
declare void @throws_1(i32, i32, i32) noreturn | ||
declare void @throws_2(i32, i32, i32, i32*) noreturn |