blob: 89781816de82de26b1e8443c5a00ce46cb6ed260 [file] [log] [blame]
; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s
define void @test1(i32 %c) {
; CHECK-LABEL: test1:
entry:
%0 = alloca i8, i32 %c
%tobool = icmp eq i32 %c, 0
br i1 %tobool, label %if.end, label %if.then
if.end:
call void @g(i8* %0)
ret void
if.then:
call void @crash(i8* %0)
unreachable
; CHECK: calll _crash
; There is no need to adjust the stack after the call, since
; the function is noreturn and that code will therefore never run.
; CHECK-NOT: add
; CHECK-NOT: pop
}
define void @test2(i32 %c) {
; CHECK-LABEL: test2:
entry:
%0 = alloca i8, i32 %c
%tobool = icmp eq i32 %c, 0
br i1 %tobool, label %if.end, label %if.then
if.end:
call void @g(i8* %0)
ret void
if.then:
call void @crash2(i8* %0)
unreachable
; CHECK: calll _crash2
; Even though _crash2 is not marked noreturn, it is in practice because
; of the "unreachable" right after it. This happens e.g. when falling off
; a non-void function after a call.
; CHECK-NOT: add
; CHECK-NOT: pop
}
declare void @crash(i8*) noreturn
declare void @crash2(i8*)
declare void @g(i8*)