This repository has been archived by the owner on Feb 5, 2019. It is now read-only.
forked from luqmana/llvm
-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LivePhysRegs] Preserve pristine regs in blocks with no successors.
One common source of blocks with no successors is calls to noreturn functions; we want to preserve pristine registers in case they throw an exception. The whole pristine register thing is messy (we should really prefer to explicitly model registers), but this fills a hole in the model for now. Fixes https://bugs.llvm.org/show_bug.cgi?id=36073. Differential Revision: https://reviews.llvm.org/D42509 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323559 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
77ab1f0
commit 5c54c25
Showing
2 changed files
with
49 additions
and
2 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 |
---|---|---|
@@ -0,0 +1,47 @@ | ||
; 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 | ||
|