292 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple riscv32 -mattr=+experimental-zicfilp < %s | FileCheck %s --check-prefixes=CHECK,RV323; RUN: llc -mtriple riscv64 -mattr=+experimental-zicfilp < %s | FileCheck %s --check-prefixes=CHECK,RV644; RUN: llc -mtriple riscv32 -mattr=+experimental-zicfilp \5; RUN: -riscv-landing-pad-label=1 < %s | FileCheck %s --check-prefixes=FIXED-ONE,FIXED-ONE-RV326; RUN: llc -mtriple riscv64 -mattr=+experimental-zicfilp \7; RUN: -riscv-landing-pad-label=1 < %s | FileCheck %s --check-prefixes=FIXED-ONE,FIXED-ONE-RV648 9; Check indirectbr.10@__const.indirctbr.addr = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@indirctbr, %labelA), ptr blockaddress(@indirctbr, %labelB)], align 811define void @indirctbr(i32 %i, ptr %p) {12; RV32-LABEL: indirctbr:13; RV32: # %bb.0: # %entry14; RV32-NEXT: lpad 015; RV32-NEXT: slli a0, a0, 216; RV32-NEXT: lui a2, %hi(.L__const.indirctbr.addr)17; RV32-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)18; RV32-NEXT: add a0, a2, a019; RV32-NEXT: lw a0, 0(a0)20; RV32-NEXT: jr a021; RV32-NEXT: .p2align 222; RV32-NEXT: .Ltmp3: # Block address taken23; RV32-NEXT: .LBB0_1: # %labelA24; RV32-NEXT: lpad 025; RV32-NEXT: li a0, 126; RV32-NEXT: sw a0, 0(a1)27; RV32-NEXT: .p2align 228; RV32-NEXT: .Ltmp4: # Block address taken29; RV32-NEXT: .LBB0_2: # %labelB30; RV32-NEXT: lpad 031; RV32-NEXT: li a0, 232; RV32-NEXT: sw a0, 0(a1)33; RV32-NEXT: ret34;35; RV64-LABEL: indirctbr:36; RV64: # %bb.0: # %entry37; RV64-NEXT: lpad 038; RV64-NEXT: sext.w a0, a039; RV64-NEXT: slli a0, a0, 340; RV64-NEXT: lui a2, %hi(.L__const.indirctbr.addr)41; RV64-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)42; RV64-NEXT: add a0, a2, a043; RV64-NEXT: ld a0, 0(a0)44; RV64-NEXT: jr a045; RV64-NEXT: .p2align 246; RV64-NEXT: .Ltmp3: # Block address taken47; RV64-NEXT: .LBB0_1: # %labelA48; RV64-NEXT: lpad 049; RV64-NEXT: li a0, 150; RV64-NEXT: sw a0, 0(a1)51; RV64-NEXT: .p2align 252; RV64-NEXT: .Ltmp4: # Block address taken53; RV64-NEXT: .LBB0_2: # %labelB54; RV64-NEXT: lpad 055; RV64-NEXT: li a0, 256; RV64-NEXT: sw a0, 0(a1)57; RV64-NEXT: ret58;59; FIXED-ONE-RV32-LABEL: indirctbr:60; FIXED-ONE-RV32: # %bb.0: # %entry61; FIXED-ONE-RV32-NEXT: lpad 162; FIXED-ONE-RV32-NEXT: slli a0, a0, 263; FIXED-ONE-RV32-NEXT: lui a2, %hi(.L__const.indirctbr.addr)64; FIXED-ONE-RV32-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)65; FIXED-ONE-RV32-NEXT: add a0, a2, a066; FIXED-ONE-RV32-NEXT: lw a0, 0(a0)67; FIXED-ONE-RV32-NEXT: lui t2, 168; FIXED-ONE-RV32-NEXT: jr a069; FIXED-ONE-RV32-NEXT: .p2align 270; FIXED-ONE-RV32-NEXT: .Ltmp3: # Block address taken71; FIXED-ONE-RV32-NEXT: .LBB0_1: # %labelA72; FIXED-ONE-RV32-NEXT: lpad 173; FIXED-ONE-RV32-NEXT: li a0, 174; FIXED-ONE-RV32-NEXT: sw a0, 0(a1)75; FIXED-ONE-RV32-NEXT: .p2align 276; FIXED-ONE-RV32-NEXT: .Ltmp4: # Block address taken77; FIXED-ONE-RV32-NEXT: .LBB0_2: # %labelB78; FIXED-ONE-RV32-NEXT: lpad 179; FIXED-ONE-RV32-NEXT: li a0, 280; FIXED-ONE-RV32-NEXT: sw a0, 0(a1)81; FIXED-ONE-RV32-NEXT: ret82;83; FIXED-ONE-RV64-LABEL: indirctbr:84; FIXED-ONE-RV64: # %bb.0: # %entry85; FIXED-ONE-RV64-NEXT: lpad 186; FIXED-ONE-RV64-NEXT: sext.w a0, a087; FIXED-ONE-RV64-NEXT: slli a0, a0, 388; FIXED-ONE-RV64-NEXT: lui a2, %hi(.L__const.indirctbr.addr)89; FIXED-ONE-RV64-NEXT: addi a2, a2, %lo(.L__const.indirctbr.addr)90; FIXED-ONE-RV64-NEXT: add a0, a2, a091; FIXED-ONE-RV64-NEXT: ld a0, 0(a0)92; FIXED-ONE-RV64-NEXT: lui t2, 193; FIXED-ONE-RV64-NEXT: jr a094; FIXED-ONE-RV64-NEXT: .p2align 295; FIXED-ONE-RV64-NEXT: .Ltmp3: # Block address taken96; FIXED-ONE-RV64-NEXT: .LBB0_1: # %labelA97; FIXED-ONE-RV64-NEXT: lpad 198; FIXED-ONE-RV64-NEXT: li a0, 199; FIXED-ONE-RV64-NEXT: sw a0, 0(a1)100; FIXED-ONE-RV64-NEXT: .p2align 2101; FIXED-ONE-RV64-NEXT: .Ltmp4: # Block address taken102; FIXED-ONE-RV64-NEXT: .LBB0_2: # %labelB103; FIXED-ONE-RV64-NEXT: lpad 1104; FIXED-ONE-RV64-NEXT: li a0, 2105; FIXED-ONE-RV64-NEXT: sw a0, 0(a1)106; FIXED-ONE-RV64-NEXT: ret107entry:108 %arrayidx = getelementptr inbounds [2 x ptr], ptr @__const.indirctbr.addr, i64 0, i32 %i109 %0 = load ptr, ptr %arrayidx110 indirectbr ptr %0, [label %labelA, label %labelB]111 112labelA: ; preds = %entry113 store volatile i32 1, ptr %p114 br label %labelB115 116labelB: ; preds = %labelA, %entry117 store volatile i32 2, ptr %p118 ret void119}120 121; Check indirect call.122define void @call(ptr %0) {123; CHECK-LABEL: call:124; CHECK: # %bb.0:125; CHECK-NEXT: lpad 0126; CHECK-NEXT: jr a0127;128; FIXED-ONE-LABEL: call:129; FIXED-ONE: # %bb.0:130; FIXED-ONE-NEXT: lpad 1131; FIXED-ONE-NEXT: lui t2, 1132; FIXED-ONE-NEXT: jr a0133 tail call void %0()134 ret void135}136 137; Check invoke.138declare dso_local i32 @__gxx_personality_v0(...)139define void @invoke(ptr %f) personality ptr @__gxx_personality_v0 {140; RV32-LABEL: invoke:141; RV32: # %bb.0: # %entry142; RV32-NEXT: lpad 0143; RV32-NEXT: addi sp, sp, -16144; RV32-NEXT: .cfi_def_cfa_offset 16145; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill146; RV32-NEXT: .cfi_offset ra, -4147; RV32-NEXT: .cfi_remember_state148; RV32-NEXT: .Ltmp0:149; RV32-NEXT: jalr a0150; RV32-NEXT: .Ltmp1:151; RV32-NEXT: .LBB2_1: # %try.cont152; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload153; RV32-NEXT: .cfi_restore ra154; RV32-NEXT: addi sp, sp, 16155; RV32-NEXT: .cfi_def_cfa_offset 0156; RV32-NEXT: ret157; RV32-NEXT: .LBB2_2: # %lpad158; RV32-NEXT: .cfi_restore_state159; RV32-NEXT: .Ltmp2:160; RV32-NEXT: j .LBB2_1161;162; RV64-LABEL: invoke:163; RV64: # %bb.0: # %entry164; RV64-NEXT: lpad 0165; RV64-NEXT: addi sp, sp, -16166; RV64-NEXT: .cfi_def_cfa_offset 16167; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill168; RV64-NEXT: .cfi_offset ra, -8169; RV64-NEXT: .cfi_remember_state170; RV64-NEXT: .Ltmp0:171; RV64-NEXT: jalr a0172; RV64-NEXT: .Ltmp1:173; RV64-NEXT: .LBB2_1: # %try.cont174; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload175; RV64-NEXT: .cfi_restore ra176; RV64-NEXT: addi sp, sp, 16177; RV64-NEXT: .cfi_def_cfa_offset 0178; RV64-NEXT: ret179; RV64-NEXT: .LBB2_2: # %lpad180; RV64-NEXT: .cfi_restore_state181; RV64-NEXT: .Ltmp2:182; RV64-NEXT: j .LBB2_1183;184; FIXED-ONE-RV32-LABEL: invoke:185; FIXED-ONE-RV32: # %bb.0: # %entry186; FIXED-ONE-RV32-NEXT: lpad 1187; FIXED-ONE-RV32-NEXT: addi sp, sp, -16188; FIXED-ONE-RV32-NEXT: .cfi_def_cfa_offset 16189; FIXED-ONE-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill190; FIXED-ONE-RV32-NEXT: .cfi_offset ra, -4191; FIXED-ONE-RV32-NEXT: .cfi_remember_state192; FIXED-ONE-RV32-NEXT: .Ltmp0:193; FIXED-ONE-RV32-NEXT: lui t2, 1194; FIXED-ONE-RV32-NEXT: jalr a0195; FIXED-ONE-RV32-NEXT: .Ltmp1:196; FIXED-ONE-RV32-NEXT: .LBB2_1: # %try.cont197; FIXED-ONE-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload198; FIXED-ONE-RV32-NEXT: .cfi_restore ra199; FIXED-ONE-RV32-NEXT: addi sp, sp, 16200; FIXED-ONE-RV32-NEXT: .cfi_def_cfa_offset 0201; FIXED-ONE-RV32-NEXT: ret202; FIXED-ONE-RV32-NEXT: .LBB2_2: # %lpad203; FIXED-ONE-RV32-NEXT: .cfi_restore_state204; FIXED-ONE-RV32-NEXT: .Ltmp2:205; FIXED-ONE-RV32-NEXT: j .LBB2_1206;207; FIXED-ONE-RV64-LABEL: invoke:208; FIXED-ONE-RV64: # %bb.0: # %entry209; FIXED-ONE-RV64-NEXT: lpad 1210; FIXED-ONE-RV64-NEXT: addi sp, sp, -16211; FIXED-ONE-RV64-NEXT: .cfi_def_cfa_offset 16212; FIXED-ONE-RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill213; FIXED-ONE-RV64-NEXT: .cfi_offset ra, -8214; FIXED-ONE-RV64-NEXT: .cfi_remember_state215; FIXED-ONE-RV64-NEXT: .Ltmp0:216; FIXED-ONE-RV64-NEXT: lui t2, 1217; FIXED-ONE-RV64-NEXT: jalr a0218; FIXED-ONE-RV64-NEXT: .Ltmp1:219; FIXED-ONE-RV64-NEXT: .LBB2_1: # %try.cont220; FIXED-ONE-RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload221; FIXED-ONE-RV64-NEXT: .cfi_restore ra222; FIXED-ONE-RV64-NEXT: addi sp, sp, 16223; FIXED-ONE-RV64-NEXT: .cfi_def_cfa_offset 0224; FIXED-ONE-RV64-NEXT: ret225; FIXED-ONE-RV64-NEXT: .LBB2_2: # %lpad226; FIXED-ONE-RV64-NEXT: .cfi_restore_state227; FIXED-ONE-RV64-NEXT: .Ltmp2:228; FIXED-ONE-RV64-NEXT: j .LBB2_1229entry:230 invoke void %f() to label %try.cont unwind label %lpad231 232lpad:233 %0 = landingpad { ptr, i32 } cleanup234 br label %try.cont235 236try.cont:237 ret void238}239 240; Check external linkage function.241define void @external() {242; CHECK-LABEL: external:243; CHECK: # %bb.0:244; CHECK-NEXT: lpad 0245; CHECK-NEXT: ret246;247; FIXED-ONE-LABEL: external:248; FIXED-ONE: # %bb.0:249; FIXED-ONE-NEXT: lpad 1250; FIXED-ONE-NEXT: ret251 ret void252}253 254; Check internal linkage function.255define internal void @internal() {256; CHECK-LABEL: internal:257; CHECK: # %bb.0:258; CHECK-NEXT: ret259;260; FIXED-ONE-LABEL: internal:261; FIXED-ONE: # %bb.0:262; FIXED-ONE-NEXT: ret263 ret void264}265 266; Check internal linkage function with taken address.267@foo = constant ptr @internal2268define internal void @internal2() {269; CHECK-LABEL: internal2:270; CHECK: # %bb.0:271; CHECK-NEXT: lpad 0272; CHECK-NEXT: ret273;274; FIXED-ONE-LABEL: internal2:275; FIXED-ONE: # %bb.0:276; FIXED-ONE-NEXT: lpad 1277; FIXED-ONE-NEXT: ret278 ret void279}280 281; Check interrupt function does not need landing pad.282define void @interrupt() "interrupt"="machine" {283; CHECK-LABEL: interrupt:284; CHECK: # %bb.0:285; CHECK-NEXT: mret286;287; FIXED-ONE-LABEL: interrupt:288; FIXED-ONE: # %bb.0:289; FIXED-ONE-NEXT: mret290 ret void291}292