1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefix=LA32 4; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefix=LA64 6 7declare void @foo(ptr %p); 8declare void @bar(ptr %p); 9declare dso_local i32 @__gxx_personality_v0(...) 10 11;; Before getExceptionPointerRegister() and getExceptionSelectorRegister() 12;; lowering hooks were defined this would trigger an assertion during live 13;; variable analysis. 14 15define void @caller(ptr %p) personality ptr @__gxx_personality_v0 { 16; LA32-LABEL: caller: 17; LA32: # %bb.0: # %entry 18; LA32-NEXT: addi.w $sp, $sp, -16 19; LA32-NEXT: .cfi_def_cfa_offset 16 20; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 21; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill 22; LA32-NEXT: st.w $s0, $sp, 4 # 4-byte Folded Spill 23; LA32-NEXT: .cfi_offset 1, -4 24; LA32-NEXT: .cfi_offset 22, -8 25; LA32-NEXT: .cfi_offset 23, -12 26; LA32-NEXT: move $fp, $a0 27; LA32-NEXT: beqz $a0, .LBB0_2 28; LA32-NEXT: # %bb.1: # %bb2 29; LA32-NEXT: .Ltmp0: 30; LA32-NEXT: move $a0, $fp 31; LA32-NEXT: bl %plt(bar) 32; LA32-NEXT: .Ltmp1: 33; LA32-NEXT: b .LBB0_3 34; LA32-NEXT: .LBB0_2: # %bb1 35; LA32-NEXT: .Ltmp2: 36; LA32-NEXT: move $a0, $fp 37; LA32-NEXT: bl %plt(foo) 38; LA32-NEXT: .Ltmp3: 39; LA32-NEXT: .LBB0_3: # %end2 40; LA32-NEXT: ld.w $s0, $sp, 4 # 4-byte Folded Reload 41; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload 42; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 43; LA32-NEXT: addi.w $sp, $sp, 16 44; LA32-NEXT: ret 45; LA32-NEXT: .LBB0_4: # %lpad 46; LA32-NEXT: .Ltmp4: 47; LA32-NEXT: move $s0, $a0 48; LA32-NEXT: move $a0, $fp 49; LA32-NEXT: bl callee 50; LA32-NEXT: move $a0, $s0 51; LA32-NEXT: bl %plt(_Unwind_Resume) 52; 53; LA64-LABEL: caller: 54; LA64: # %bb.0: # %entry 55; LA64-NEXT: addi.d $sp, $sp, -32 56; LA64-NEXT: .cfi_def_cfa_offset 32 57; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill 58; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill 59; LA64-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill 60; LA64-NEXT: .cfi_offset 1, -8 61; LA64-NEXT: .cfi_offset 22, -16 62; LA64-NEXT: .cfi_offset 23, -24 63; LA64-NEXT: move $fp, $a0 64; LA64-NEXT: beqz $a0, .LBB0_2 65; LA64-NEXT: # %bb.1: # %bb2 66; LA64-NEXT: .Ltmp0: 67; LA64-NEXT: move $a0, $fp 68; LA64-NEXT: bl %plt(bar) 69; LA64-NEXT: .Ltmp1: 70; LA64-NEXT: b .LBB0_3 71; LA64-NEXT: .LBB0_2: # %bb1 72; LA64-NEXT: .Ltmp2: 73; LA64-NEXT: move $a0, $fp 74; LA64-NEXT: bl %plt(foo) 75; LA64-NEXT: .Ltmp3: 76; LA64-NEXT: .LBB0_3: # %end2 77; LA64-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload 78; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload 79; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload 80; LA64-NEXT: addi.d $sp, $sp, 32 81; LA64-NEXT: ret 82; LA64-NEXT: .LBB0_4: # %lpad 83; LA64-NEXT: .Ltmp4: 84; LA64-NEXT: move $s0, $a0 85; LA64-NEXT: move $a0, $fp 86; LA64-NEXT: bl callee 87; LA64-NEXT: move $a0, $s0 88; LA64-NEXT: bl %plt(_Unwind_Resume) 89entry: 90 %0 = icmp eq ptr %p, null 91 br i1 %0, label %bb1, label %bb2 92 93bb1: 94 invoke void @foo(ptr %p) to label %end1 unwind label %lpad 95 96bb2: 97 invoke void @bar(ptr %p) to label %end2 unwind label %lpad 98 99lpad: 100 %1 = landingpad { ptr, i32 } cleanup 101 call void @callee(ptr %p) 102 resume { ptr, i32 } %1 103 104end1: 105 ret void 106 107end2: 108 ret void 109} 110 111define internal void @callee(ptr %p) { 112; LA32-LABEL: callee: 113; LA32: # %bb.0: 114; LA32-NEXT: ret 115; 116; LA64-LABEL: callee: 117; LA64: # %bb.0: 118; LA64-NEXT: ret 119 ret void 120} 121