387 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa < %s | FileCheck -check-prefixes=GCN,SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa < %s | FileCheck -check-prefixes=GCN,GISEL %s4 5define amdgpu_kernel void @test_bitcast_return_type_noinline() #0 {6; SDAG-LABEL: test_bitcast_return_type_noinline:7; SDAG: ; %bb.0:8; SDAG-NEXT: s_mov_b32 s32, 09; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s1310; SDAG-NEXT: s_add_i32 s12, s12, s1711; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 812; SDAG-NEXT: s_add_u32 s0, s0, s1713; SDAG-NEXT: s_addc_u32 s1, s1, 014; SDAG-NEXT: s_mov_b32 s13, s1515; SDAG-NEXT: s_mov_b32 s12, s1416; SDAG-NEXT: s_getpc_b64 s[18:19]17; SDAG-NEXT: s_add_u32 s18, s18, ret_i32_noinline@rel32@lo+418; SDAG-NEXT: s_addc_u32 s19, s19, ret_i32_noinline@rel32@hi+1219; SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v220; SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v121; SDAG-NEXT: v_or_b32_e32 v0, v0, v122; SDAG-NEXT: v_or_b32_e32 v31, v0, v223; SDAG-NEXT: s_mov_b32 s14, s1624; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]25; SDAG-NEXT: v_add_f32_e32 v0, 1.0, v026; SDAG-NEXT: flat_store_dword v[0:1], v027; SDAG-NEXT: s_waitcnt vmcnt(0)28; SDAG-NEXT: s_endpgm29;30; GISEL-LABEL: test_bitcast_return_type_noinline:31; GISEL: ; %bb.0:32; GISEL-NEXT: s_mov_b32 s32, 033; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s1334; GISEL-NEXT: s_add_i32 s12, s12, s1735; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 836; GISEL-NEXT: s_add_u32 s0, s0, s1737; GISEL-NEXT: s_addc_u32 s1, s1, 038; GISEL-NEXT: s_mov_b32 s13, s1539; GISEL-NEXT: s_mov_b32 s12, s1440; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v141; GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v242; GISEL-NEXT: v_or_b32_e32 v0, v0, v143; GISEL-NEXT: v_or_b32_e32 v31, v0, v244; GISEL-NEXT: s_getpc_b64 s[18:19]45; GISEL-NEXT: s_add_u32 s18, s18, ret_i32_noinline@rel32@lo+446; GISEL-NEXT: s_addc_u32 s19, s19, ret_i32_noinline@rel32@hi+1247; GISEL-NEXT: s_mov_b32 s14, s1648; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]49; GISEL-NEXT: v_add_f32_e32 v0, 1.0, v050; GISEL-NEXT: flat_store_dword v[0:1], v051; GISEL-NEXT: s_waitcnt vmcnt(0)52; GISEL-NEXT: s_endpgm53 %val = call float @ret_i32_noinline()54 %op = fadd float %val, 1.055 store volatile float %op, ptr addrspace(1) poison56 ret void57}58 59define amdgpu_kernel void @test_bitcast_return_type_alwaysinline() #0 {60; SDAG-LABEL: test_bitcast_return_type_alwaysinline:61; SDAG: ; %bb.0:62; SDAG-NEXT: s_mov_b32 s32, 063; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s1364; SDAG-NEXT: s_add_i32 s12, s12, s1765; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 866; SDAG-NEXT: s_add_u32 s0, s0, s1767; SDAG-NEXT: s_addc_u32 s1, s1, 068; SDAG-NEXT: s_mov_b32 s13, s1569; SDAG-NEXT: s_mov_b32 s12, s1470; SDAG-NEXT: s_getpc_b64 s[18:19]71; SDAG-NEXT: s_add_u32 s18, s18, ret_i32_alwaysinline@rel32@lo+472; SDAG-NEXT: s_addc_u32 s19, s19, ret_i32_alwaysinline@rel32@hi+1273; SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v274; SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v175; SDAG-NEXT: v_or_b32_e32 v0, v0, v176; SDAG-NEXT: v_or_b32_e32 v31, v0, v277; SDAG-NEXT: s_mov_b32 s14, s1678; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]79; SDAG-NEXT: v_add_f32_e32 v0, 1.0, v080; SDAG-NEXT: flat_store_dword v[0:1], v081; SDAG-NEXT: s_waitcnt vmcnt(0)82; SDAG-NEXT: s_endpgm83;84; GISEL-LABEL: test_bitcast_return_type_alwaysinline:85; GISEL: ; %bb.0:86; GISEL-NEXT: s_mov_b32 s32, 087; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s1388; GISEL-NEXT: s_add_i32 s12, s12, s1789; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 890; GISEL-NEXT: s_add_u32 s0, s0, s1791; GISEL-NEXT: s_addc_u32 s1, s1, 092; GISEL-NEXT: s_mov_b32 s13, s1593; GISEL-NEXT: s_mov_b32 s12, s1494; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v195; GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v296; GISEL-NEXT: v_or_b32_e32 v0, v0, v197; GISEL-NEXT: v_or_b32_e32 v31, v0, v298; GISEL-NEXT: s_getpc_b64 s[18:19]99; GISEL-NEXT: s_add_u32 s18, s18, ret_i32_alwaysinline@rel32@lo+4100; GISEL-NEXT: s_addc_u32 s19, s19, ret_i32_alwaysinline@rel32@hi+12101; GISEL-NEXT: s_mov_b32 s14, s16102; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]103; GISEL-NEXT: v_add_f32_e32 v0, 1.0, v0104; GISEL-NEXT: flat_store_dword v[0:1], v0105; GISEL-NEXT: s_waitcnt vmcnt(0)106; GISEL-NEXT: s_endpgm107 %val = call float @ret_i32_alwaysinline()108 %op = fadd float %val, 1.0109 store volatile float %op, ptr addrspace(1) poison110 ret void111}112 113define amdgpu_kernel void @test_bitcast_argument_type() #0 {114; SDAG-LABEL: test_bitcast_argument_type:115; SDAG: ; %bb.0:116; SDAG-NEXT: s_mov_b32 s32, 0117; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13118; SDAG-NEXT: s_add_i32 s12, s12, s17119; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8120; SDAG-NEXT: s_add_u32 s0, s0, s17121; SDAG-NEXT: s_addc_u32 s1, s1, 0122; SDAG-NEXT: s_mov_b32 s13, s15123; SDAG-NEXT: s_mov_b32 s12, s14124; SDAG-NEXT: s_getpc_b64 s[18:19]125; SDAG-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4126; SDAG-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12127; SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2128; SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1129; SDAG-NEXT: v_or_b32_e32 v0, v0, v1130; SDAG-NEXT: v_or_b32_e32 v31, v0, v2131; SDAG-NEXT: v_mov_b32_e32 v0, 2.0132; SDAG-NEXT: s_mov_b32 s14, s16133; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]134; SDAG-NEXT: v_add_i32_e32 v0, vcc, 1, v0135; SDAG-NEXT: flat_store_dword v[0:1], v0136; SDAG-NEXT: s_waitcnt vmcnt(0)137; SDAG-NEXT: s_endpgm138;139; GISEL-LABEL: test_bitcast_argument_type:140; GISEL: ; %bb.0:141; GISEL-NEXT: s_mov_b32 s32, 0142; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13143; GISEL-NEXT: s_add_i32 s12, s12, s17144; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8145; GISEL-NEXT: s_add_u32 s0, s0, s17146; GISEL-NEXT: s_addc_u32 s1, s1, 0147; GISEL-NEXT: s_mov_b32 s13, s15148; GISEL-NEXT: s_mov_b32 s12, s14149; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1150; GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2151; GISEL-NEXT: s_getpc_b64 s[18:19]152; GISEL-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4153; GISEL-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12154; GISEL-NEXT: v_or_b32_e32 v0, v0, v1155; GISEL-NEXT: v_or_b32_e32 v31, v0, v2156; GISEL-NEXT: v_mov_b32_e32 v0, 2.0157; GISEL-NEXT: s_mov_b32 s14, s16158; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]159; GISEL-NEXT: v_add_i32_e32 v0, vcc, 1, v0160; GISEL-NEXT: flat_store_dword v[0:1], v0161; GISEL-NEXT: s_waitcnt vmcnt(0)162; GISEL-NEXT: s_endpgm163 %val = call i32 @ident_i32(float 2.0)164 %op = add i32 %val, 1165 store volatile i32 %op, ptr addrspace(1) poison166 ret void167}168 169define amdgpu_kernel void @test_bitcast_argument_and_return_types() #0 {170; SDAG-LABEL: test_bitcast_argument_and_return_types:171; SDAG: ; %bb.0:172; SDAG-NEXT: s_mov_b32 s32, 0173; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13174; SDAG-NEXT: s_add_i32 s12, s12, s17175; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8176; SDAG-NEXT: s_add_u32 s0, s0, s17177; SDAG-NEXT: s_addc_u32 s1, s1, 0178; SDAG-NEXT: s_mov_b32 s13, s15179; SDAG-NEXT: s_mov_b32 s12, s14180; SDAG-NEXT: s_getpc_b64 s[18:19]181; SDAG-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4182; SDAG-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12183; SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2184; SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1185; SDAG-NEXT: v_or_b32_e32 v0, v0, v1186; SDAG-NEXT: v_or_b32_e32 v31, v0, v2187; SDAG-NEXT: v_mov_b32_e32 v0, 2.0188; SDAG-NEXT: s_mov_b32 s14, s16189; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]190; SDAG-NEXT: v_add_f32_e32 v0, 1.0, v0191; SDAG-NEXT: flat_store_dword v[0:1], v0192; SDAG-NEXT: s_waitcnt vmcnt(0)193; SDAG-NEXT: s_endpgm194;195; GISEL-LABEL: test_bitcast_argument_and_return_types:196; GISEL: ; %bb.0:197; GISEL-NEXT: s_mov_b32 s32, 0198; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13199; GISEL-NEXT: s_add_i32 s12, s12, s17200; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8201; GISEL-NEXT: s_add_u32 s0, s0, s17202; GISEL-NEXT: s_addc_u32 s1, s1, 0203; GISEL-NEXT: s_mov_b32 s13, s15204; GISEL-NEXT: s_mov_b32 s12, s14205; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1206; GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2207; GISEL-NEXT: s_getpc_b64 s[18:19]208; GISEL-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4209; GISEL-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12210; GISEL-NEXT: v_or_b32_e32 v0, v0, v1211; GISEL-NEXT: v_or_b32_e32 v31, v0, v2212; GISEL-NEXT: v_mov_b32_e32 v0, 2.0213; GISEL-NEXT: s_mov_b32 s14, s16214; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]215; GISEL-NEXT: v_add_f32_e32 v0, 1.0, v0216; GISEL-NEXT: flat_store_dword v[0:1], v0217; GISEL-NEXT: s_waitcnt vmcnt(0)218; GISEL-NEXT: s_endpgm219 %val = call float @ident_i32(float 2.0)220 %op = fadd float %val, 1.0221 store volatile float %op, ptr addrspace(1) poison222 ret void223}224 225define hidden i32 @use_workitem_id_x(i32 %arg0) #3 {226; GCN-LABEL: use_workitem_id_x:227; GCN: ; %bb.0:228; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)229; GCN-NEXT: v_and_b32_e32 v1, 0x3ff, v31230; GCN-NEXT: v_add_i32_e32 v0, vcc, v1, v0231; GCN-NEXT: s_setpc_b64 s[30:31]232 %id = call i32 @llvm.amdgcn.workitem.id.x()233 %op = add i32 %id, %arg0234 ret i32 %op235}236 237define amdgpu_kernel void @test_bitcast_use_workitem_id_x() #3 {238; SDAG-LABEL: test_bitcast_use_workitem_id_x:239; SDAG: ; %bb.0:240; SDAG-NEXT: s_mov_b32 s32, 0241; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13242; SDAG-NEXT: s_add_i32 s12, s12, s17243; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8244; SDAG-NEXT: s_add_u32 s0, s0, s17245; SDAG-NEXT: s_addc_u32 s1, s1, 0246; SDAG-NEXT: s_mov_b32 s13, s15247; SDAG-NEXT: s_mov_b32 s12, s14248; SDAG-NEXT: v_mov_b32_e32 v31, v0249; SDAG-NEXT: s_getpc_b64 s[18:19]250; SDAG-NEXT: s_add_u32 s18, s18, use_workitem_id_x@rel32@lo+4251; SDAG-NEXT: s_addc_u32 s19, s19, use_workitem_id_x@rel32@hi+12252; SDAG-NEXT: v_mov_b32_e32 v0, 9253; SDAG-NEXT: s_mov_b32 s14, s16254; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]255; SDAG-NEXT: v_add_f32_e32 v0, 1.0, v0256; SDAG-NEXT: flat_store_dword v[0:1], v0257; SDAG-NEXT: s_waitcnt vmcnt(0)258; SDAG-NEXT: s_endpgm259;260; GISEL-LABEL: test_bitcast_use_workitem_id_x:261; GISEL: ; %bb.0:262; GISEL-NEXT: s_mov_b32 s32, 0263; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13264; GISEL-NEXT: s_add_i32 s12, s12, s17265; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8266; GISEL-NEXT: s_add_u32 s0, s0, s17267; GISEL-NEXT: s_addc_u32 s1, s1, 0268; GISEL-NEXT: v_mov_b32_e32 v31, v0269; GISEL-NEXT: s_mov_b32 s13, s15270; GISEL-NEXT: s_mov_b32 s12, s14271; GISEL-NEXT: s_getpc_b64 s[18:19]272; GISEL-NEXT: s_add_u32 s18, s18, use_workitem_id_x@rel32@lo+4273; GISEL-NEXT: s_addc_u32 s19, s19, use_workitem_id_x@rel32@hi+12274; GISEL-NEXT: v_mov_b32_e32 v0, 9275; GISEL-NEXT: s_mov_b32 s14, s16276; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]277; GISEL-NEXT: v_add_f32_e32 v0, 1.0, v0278; GISEL-NEXT: flat_store_dword v[0:1], v0279; GISEL-NEXT: s_waitcnt vmcnt(0)280; GISEL-NEXT: s_endpgm281 %val = call float @use_workitem_id_x(i32 9)282 %op = fadd float %val, 1.0283 store volatile float %op, ptr addrspace(1) poison284 ret void285}286 287@_ZTIi = external global ptr288declare i32 @__gxx_personality_v0(...)289define amdgpu_kernel void @test_invoke() #0 personality ptr @__gxx_personality_v0 {290; SDAG-LABEL: test_invoke:291; SDAG: ; %bb.0:292; SDAG-NEXT: s_mov_b32 s32, 0293; SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13294; SDAG-NEXT: s_add_i32 s12, s12, s17295; SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8296; SDAG-NEXT: s_add_u32 s0, s0, s17297; SDAG-NEXT: s_addc_u32 s1, s1, 0298; SDAG-NEXT: s_mov_b32 s13, s15299; SDAG-NEXT: s_mov_b32 s12, s14300; SDAG-NEXT: s_getpc_b64 s[18:19]301; SDAG-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4302; SDAG-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12303; SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2304; SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1305; SDAG-NEXT: v_or_b32_e32 v0, v0, v1306; SDAG-NEXT: v_or_b32_e32 v31, v0, v2307; SDAG-NEXT: v_mov_b32_e32 v0, 2.0308; SDAG-NEXT: s_mov_b32 s14, s16309; SDAG-NEXT: s_swappc_b64 s[30:31], s[18:19]310; SDAG-NEXT: v_add_f32_e32 v0, 1.0, v0311; SDAG-NEXT: flat_store_dword v[0:1], v0312; SDAG-NEXT: s_waitcnt vmcnt(0)313; SDAG-NEXT: s_endpgm314;315; GISEL-LABEL: test_invoke:316; GISEL: ; %bb.0:317; GISEL-NEXT: s_mov_b32 s32, 0318; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13319; GISEL-NEXT: s_add_i32 s12, s12, s17320; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8321; GISEL-NEXT: s_add_u32 s0, s0, s17322; GISEL-NEXT: s_addc_u32 s1, s1, 0323; GISEL-NEXT: s_mov_b32 s13, s15324; GISEL-NEXT: s_mov_b32 s12, s14325; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1326; GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2327; GISEL-NEXT: s_getpc_b64 s[18:19]328; GISEL-NEXT: s_add_u32 s18, s18, ident_i32@rel32@lo+4329; GISEL-NEXT: s_addc_u32 s19, s19, ident_i32@rel32@hi+12330; GISEL-NEXT: v_or_b32_e32 v0, v0, v1331; GISEL-NEXT: v_or_b32_e32 v31, v0, v2332; GISEL-NEXT: v_mov_b32_e32 v0, 2.0333; GISEL-NEXT: s_mov_b32 s14, s16334; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19]335; GISEL-NEXT: v_add_f32_e32 v0, 1.0, v0336; GISEL-NEXT: flat_store_dword v[0:1], v0337; GISEL-NEXT: s_waitcnt vmcnt(0)338; GISEL-NEXT: s_endpgm339 %val = invoke float @ident_i32(float 2.0)340 to label %continue unwind label %broken341 342broken:343 landingpad { ptr, i32 } catch ptr @_ZTIi344 ret void345 346continue:347 %op = fadd float %val, 1.0348 store volatile float %op, ptr addrspace(1) poison349 ret void350}351 352; Callees appears last in source file to test that we still lower their353; arguments before we lower any calls to them.354 355define hidden i32 @ret_i32_noinline() #0 {356; GCN-LABEL: ret_i32_noinline:357; GCN: ; %bb.0:358; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)359; GCN-NEXT: v_mov_b32_e32 v0, 4360; GCN-NEXT: s_setpc_b64 s[30:31]361 ret i32 4362}363 364define hidden i32 @ret_i32_alwaysinline() #1 {365; GCN-LABEL: ret_i32_alwaysinline:366; GCN: ; %bb.0:367; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)368; GCN-NEXT: v_mov_b32_e32 v0, 4369; GCN-NEXT: s_setpc_b64 s[30:31]370 ret i32 4371}372 373define hidden i32 @ident_i32(i32 %i) #0 {374; GCN-LABEL: ident_i32:375; GCN: ; %bb.0:376; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)377; GCN-NEXT: s_setpc_b64 s[30:31]378 ret i32 %i379}380 381declare i32 @llvm.amdgcn.workitem.id.x() #2382 383attributes #0 = { nounwind noinline }384attributes #1 = { alwaysinline nounwind }385attributes #2 = { nounwind readnone speculatable }386attributes #3 = { nounwind noinline "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" }387