llvm-6502/test/CodeGen/ARM/noreturn.ll
Quentin Colombet ce734f1f43 [PR16882] Ignore noreturn definitions when setting isPhysRegUsed.
PEI inserts a save/restore sequence for the link register, according to the
information it gets from the MachineRegisterInfo.
MachineRegisterInfo is populated by the VirtRegMap pass.
This pass was not aware of noreturn calls and was registering the definitions of
these calls the same way as regular operations.

Modify VirtRegPass so that it does not set the isPhysRegUsed information for
registers only defined by noreturn calls.
The rational is that a noreturn call is the "last instruction" of the program
(if it returns the behavior is undefined), so everything that is defined by it
cannot be used and will not interfere with anything else. Therefore, it is
pointless to account for then.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191349 91177308-0d34-0410-b5e6-96231b3b80d8
2013-09-25 00:26:17 +00:00

39 lines
876 B
LLVM

; RUN: llc -O3 -o - %s | FileCheck %s
; Test case from PR16882.
target triple = "thumbv7s-apple-ios"
; Function Attrs: noreturn
define i32 @test1() #0 {
; CHECK-LABEL: @test1
; CHECK-NOT: push
entry:
tail call void @overflow() #0
unreachable
}
; Function Attrs: noreturn
declare void @overflow() #0
define i32 @test2(i32 %x, i32 %y) {
; CHECK-LABEL: @test2
; CHECK-NOT: push
; CHECK-NOT: pop
entry:
%conv = sext i32 %x to i64
%conv1 = sext i32 %y to i64
%mul = mul nsw i64 %conv1, %conv
%conv2 = trunc i64 %mul to i32
%conv3 = sext i32 %conv2 to i64
%cmp = icmp eq i64 %mul, %conv3
br i1 %cmp, label %if.end, label %if.then
if.then: ; preds = %entry
tail call void @overflow() #0
unreachable
if.end: ; preds = %entry
ret i32 %conv2
}
attributes #0 = { noreturn }