| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=x86_64-- < %s | FileCheck %s |
| |
| define void @sjlj_do_not_merge_stack_slots() nounwind { |
| ; CHECK-LABEL: sjlj_do_not_merge_stack_slots: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: subq $40, %rsp |
| ; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rdi |
| ; CHECK-NEXT: callq setjmp@PLT |
| ; CHECK-NEXT: testl %eax, %eax |
| ; CHECK-NEXT: je .LBB0_1 |
| ; CHECK-NEXT: # %bb.2: # %else |
| ; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rdi |
| ; CHECK-NEXT: callq opaque@PLT |
| ; CHECK-NEXT: addq $40, %rsp |
| ; CHECK-NEXT: retq |
| ; CHECK-NEXT: .LBB0_1: # %then |
| ; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rdi |
| ; CHECK-NEXT: callq escape@PLT |
| ; CHECK-NEXT: addq $40, %rsp |
| ; CHECK-NEXT: retq |
| entry: |
| %obj = alloca [8 x i8], align 4 |
| %buf = alloca [12 x i8], align 4 |
| %obj.1 = alloca [8 x i8], align 4 |
| call void @llvm.lifetime.start.p0(ptr %obj) |
| call void @llvm.lifetime.start.p0(ptr %buf) |
| %rv = call i32 @setjmp(ptr %buf) |
| %c = icmp eq i32 %rv, 0 |
| br i1 %c, label %then, label %else |
| |
| then: |
| call void @escape(ptr %obj) |
| br label %exit |
| |
| else: |
| call void @llvm.lifetime.start.p0(ptr %obj.1) |
| call void @opaque(ptr %obj.1) |
| call void @llvm.lifetime.end.p0(ptr %obj.1) |
| br label %exit |
| |
| exit: |
| call void @llvm.lifetime.end.p0(ptr %buf) |
| call void @llvm.lifetime.end.p0(ptr %obj) |
| ret void |
| } |
| |
| declare i32 @setjmp(ptr) returns_twice |
| declare void @escape(ptr) |
| declare void @opaque(ptr) |