mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-24 09:29:42 +00:00
28713bdebc
The function with uwtable attribute might be visited by the stack unwinder, thus the link register should be considered as clobbered after the execution of the branch and link instruction (i.e. the definition of the machine instruction can't be ignored) even when the callee function are marked with noreturn. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202165 91177308-0d34-0410-b5e6-96231b3b80d8
68 lines
1.4 KiB
LLVM
68 lines
1.4 KiB
LLVM
; RUN: llc -O3 -o - %s | FileCheck %s
|
|
; Test case from PR16882.
|
|
target triple = "thumbv7s-apple-ios"
|
|
|
|
define i32 @test1() {
|
|
; CHECK-LABEL: @test1
|
|
; CHECK-NOT: push
|
|
entry:
|
|
tail call void @overflow() #0
|
|
unreachable
|
|
}
|
|
|
|
; Function Attrs: noreturn nounwind
|
|
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
|
|
}
|
|
|
|
; Test case for PR17825.
|
|
define i32 @test3() {
|
|
; CHECK-LABEL: @test3
|
|
; CHECK: push
|
|
entry:
|
|
tail call void @overflow_with_unwind() #1
|
|
unreachable
|
|
}
|
|
|
|
; Test case for uwtable
|
|
define i32 @test4() uwtable {
|
|
; CHECK-LABEL: @test4
|
|
; CHECK: push
|
|
entry:
|
|
tail call void @overflow() #0
|
|
unreachable
|
|
}
|
|
|
|
define i32 @test5() uwtable {
|
|
; CHECK-LABEL: @test5
|
|
; CHECK: push
|
|
entry:
|
|
tail call void @overflow_with_unwind() #1
|
|
unreachable
|
|
}
|
|
|
|
; Function Attrs: noreturn
|
|
declare void @overflow_with_unwind() #1
|
|
|
|
attributes #0 = { noreturn nounwind }
|
|
attributes #1 = { noreturn }
|