862 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn-unknown-unknown -mcpu=bonaire < %s | FileCheck --check-prefixes=OPT,OPT-GFX7 %s3; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn-unknown-unknown -mcpu=tonga < %s | FileCheck --check-prefixes=OPT,OPT-GFX8 %s4; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn-unknown-unknown -mcpu=gfx900 < %s | FileCheck --check-prefixes=OPT,OPT-GFX9 %s5; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn-unknown-unknown -mcpu=gfx1030 < %s | FileCheck --check-prefixes=OPT,OPT-GFX10 %s6 7; RUN: llc -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck --check-prefix=GFX7 %s8; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck --check-prefix=GFX8 %s9; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck --check-prefix=GFX9 %s10; RUN: llc -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck --check-prefix=GFX10 %s11 12define void @test_sinkable_flat_small_offset_i32(ptr %out, ptr %in, i32 %cond) {13; OPT-GFX7-LABEL: @test_sinkable_flat_small_offset_i32(14; OPT-GFX7-NEXT: entry:15; OPT-GFX7-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 99999916; OPT-GFX7-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i32, ptr [[IN:%.*]], i64 717; OPT-GFX7-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 018; OPT-GFX7-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]19; OPT-GFX7: if:20; OPT-GFX7-NEXT: [[LOAD:%.*]] = load i32, ptr [[IN_GEP]], align 421; OPT-GFX7-NEXT: br label [[ENDIF]]22; OPT-GFX7: endif:23; OPT-GFX7-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]24; OPT-GFX7-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 425; OPT-GFX7-NEXT: br label [[DONE:%.*]]26; OPT-GFX7: done:27; OPT-GFX7-NEXT: ret void28;29; OPT-GFX8-LABEL: @test_sinkable_flat_small_offset_i32(30; OPT-GFX8-NEXT: entry:31; OPT-GFX8-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 99999932; OPT-GFX8-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i32, ptr [[IN:%.*]], i64 733; OPT-GFX8-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 034; OPT-GFX8-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]35; OPT-GFX8: if:36; OPT-GFX8-NEXT: [[LOAD:%.*]] = load i32, ptr [[IN_GEP]], align 437; OPT-GFX8-NEXT: br label [[ENDIF]]38; OPT-GFX8: endif:39; OPT-GFX8-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]40; OPT-GFX8-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 441; OPT-GFX8-NEXT: br label [[DONE:%.*]]42; OPT-GFX8: done:43; OPT-GFX8-NEXT: ret void44;45; OPT-GFX9-LABEL: @test_sinkable_flat_small_offset_i32(46; OPT-GFX9-NEXT: entry:47; OPT-GFX9-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 99999948; OPT-GFX9-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 049; OPT-GFX9-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]50; OPT-GFX9: if:51; OPT-GFX9-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 2852; OPT-GFX9-NEXT: [[LOAD:%.*]] = load i32, ptr [[SUNKADDR]], align 453; OPT-GFX9-NEXT: br label [[ENDIF]]54; OPT-GFX9: endif:55; OPT-GFX9-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]56; OPT-GFX9-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 457; OPT-GFX9-NEXT: ret void58;59; OPT-GFX10-LABEL: @test_sinkable_flat_small_offset_i32(60; OPT-GFX10-NEXT: entry:61; OPT-GFX10-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 99999962; OPT-GFX10-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 063; OPT-GFX10-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]64; OPT-GFX10: if:65; OPT-GFX10-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 2866; OPT-GFX10-NEXT: [[LOAD:%.*]] = load i32, ptr [[SUNKADDR]], align 467; OPT-GFX10-NEXT: br label [[ENDIF]]68; OPT-GFX10: endif:69; OPT-GFX10-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]70; OPT-GFX10-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 471; OPT-GFX10-NEXT: ret void72;73; GFX7-LABEL: test_sinkable_flat_small_offset_i32:74; GFX7: ; %bb.0: ; %entry75; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)76; GFX7-NEXT: v_mov_b32_e32 v5, 077; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v478; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc79; GFX7-NEXT: s_cbranch_execz .LBB0_280; GFX7-NEXT: ; %bb.1: ; %if81; GFX7-NEXT: v_add_i32_e32 v2, vcc, 28, v282; GFX7-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc83; GFX7-NEXT: flat_load_dword v5, v[2:3]84; GFX7-NEXT: .LBB0_2: ; %endif85; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]86; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x3d08fc, v087; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc88; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)89; GFX7-NEXT: flat_store_dword v[0:1], v590; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)91; GFX7-NEXT: s_setpc_b64 s[30:31]92;93; GFX8-LABEL: test_sinkable_flat_small_offset_i32:94; GFX8: ; %bb.0: ; %entry95; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)96; GFX8-NEXT: v_mov_b32_e32 v5, 097; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v498; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc99; GFX8-NEXT: s_cbranch_execz .LBB0_2100; GFX8-NEXT: ; %bb.1: ; %if101; GFX8-NEXT: v_add_u32_e32 v2, vcc, 28, v2102; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc103; GFX8-NEXT: flat_load_dword v5, v[2:3]104; GFX8-NEXT: .LBB0_2: ; %endif105; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]106; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x3d08fc, v0107; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc108; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)109; GFX8-NEXT: flat_store_dword v[0:1], v5110; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)111; GFX8-NEXT: s_setpc_b64 s[30:31]112;113; GFX9-LABEL: test_sinkable_flat_small_offset_i32:114; GFX9: ; %bb.0: ; %entry115; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GFX9-NEXT: v_mov_b32_e32 v5, 0117; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4118; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc119; GFX9-NEXT: s_cbranch_execz .LBB0_2120; GFX9-NEXT: ; %bb.1: ; %if121; GFX9-NEXT: flat_load_dword v5, v[2:3] offset:28122; GFX9-NEXT: .LBB0_2: ; %endif123; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]124; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x3d0000, v0125; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc126; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)127; GFX9-NEXT: flat_store_dword v[0:1], v5 offset:2300128; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)129; GFX9-NEXT: s_setpc_b64 s[30:31]130;131; GFX10-LABEL: test_sinkable_flat_small_offset_i32:132; GFX10: ; %bb.0: ; %entry133; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)134; GFX10-NEXT: v_mov_b32_e32 v5, 0135; GFX10-NEXT: s_mov_b32 s4, exec_lo136; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v4137; GFX10-NEXT: s_cbranch_execz .LBB0_2138; GFX10-NEXT: ; %bb.1: ; %if139; GFX10-NEXT: flat_load_dword v5, v[2:3] offset:28140; GFX10-NEXT: .LBB0_2: ; %endif141; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4142; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x3d0800, v0143; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo144; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)145; GFX10-NEXT: flat_store_dword v[0:1], v5 offset:252146; GFX10-NEXT: s_waitcnt lgkmcnt(0)147; GFX10-NEXT: s_setpc_b64 s[30:31]148entry:149 %out.gep = getelementptr inbounds i32, ptr %out, i64 999999150 %in.gep = getelementptr inbounds i32, ptr %in, i64 7151 %cmp0 = icmp eq i32 %cond, 0152 br i1 %cmp0, label %endif, label %if153 154if:155 %load = load i32, ptr %in.gep156 br label %endif157 158endif:159 %x = phi i32 [ %load, %if ], [ 0, %entry ]160 store i32 %x, ptr %out.gep161 br label %done162 163done:164 ret void165}166 167define void @test_sink_noop_addrspacecast_flat_to_global_i32(ptr %out, ptr %in, i32 %cond) {168; OPT-GFX7-LABEL: @test_sink_noop_addrspacecast_flat_to_global_i32(169; OPT-GFX7-NEXT: entry:170; OPT-GFX7-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 999999171; OPT-GFX7-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 0172; OPT-GFX7-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]173; OPT-GFX7: if:174; OPT-GFX7-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[IN:%.*]] to ptr addrspace(1)175; OPT-GFX7-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP0]], i64 28176; OPT-GFX7-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(1) [[SUNKADDR]], align 4177; OPT-GFX7-NEXT: br label [[ENDIF]]178; OPT-GFX7: endif:179; OPT-GFX7-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]180; OPT-GFX7-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4181; OPT-GFX7-NEXT: ret void182;183; OPT-GFX8-LABEL: @test_sink_noop_addrspacecast_flat_to_global_i32(184; OPT-GFX8-NEXT: entry:185; OPT-GFX8-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 999999186; OPT-GFX8-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i32, ptr [[IN:%.*]], i64 7187; OPT-GFX8-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 0188; OPT-GFX8-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]189; OPT-GFX8: if:190; OPT-GFX8-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[IN_GEP]] to ptr addrspace(1)191; OPT-GFX8-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(1) [[TMP0]], align 4192; OPT-GFX8-NEXT: br label [[ENDIF]]193; OPT-GFX8: endif:194; OPT-GFX8-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]195; OPT-GFX8-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4196; OPT-GFX8-NEXT: ret void197;198; OPT-GFX9-LABEL: @test_sink_noop_addrspacecast_flat_to_global_i32(199; OPT-GFX9-NEXT: entry:200; OPT-GFX9-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 999999201; OPT-GFX9-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 0202; OPT-GFX9-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]203; OPT-GFX9: if:204; OPT-GFX9-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[IN:%.*]] to ptr addrspace(1)205; OPT-GFX9-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP0]], i64 28206; OPT-GFX9-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(1) [[SUNKADDR]], align 4207; OPT-GFX9-NEXT: br label [[ENDIF]]208; OPT-GFX9: endif:209; OPT-GFX9-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]210; OPT-GFX9-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4211; OPT-GFX9-NEXT: ret void212;213; OPT-GFX10-LABEL: @test_sink_noop_addrspacecast_flat_to_global_i32(214; OPT-GFX10-NEXT: entry:215; OPT-GFX10-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 999999216; OPT-GFX10-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 0217; OPT-GFX10-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]218; OPT-GFX10: if:219; OPT-GFX10-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[IN:%.*]] to ptr addrspace(1)220; OPT-GFX10-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP0]], i64 28221; OPT-GFX10-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(1) [[SUNKADDR]], align 4222; OPT-GFX10-NEXT: br label [[ENDIF]]223; OPT-GFX10: endif:224; OPT-GFX10-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]225; OPT-GFX10-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4226; OPT-GFX10-NEXT: ret void227;228; GFX7-LABEL: test_sink_noop_addrspacecast_flat_to_global_i32:229; GFX7: ; %bb.0: ; %entry230; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)231; GFX7-NEXT: v_mov_b32_e32 v5, 0232; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4233; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc234; GFX7-NEXT: s_cbranch_execz .LBB1_2235; GFX7-NEXT: ; %bb.1: ; %if236; GFX7-NEXT: s_mov_b32 s10, 0237; GFX7-NEXT: s_mov_b32 s11, 0xf000238; GFX7-NEXT: s_mov_b32 s8, s10239; GFX7-NEXT: s_mov_b32 s9, s10240; GFX7-NEXT: buffer_load_dword v5, v[2:3], s[8:11], 0 addr64 offset:28241; GFX7-NEXT: .LBB1_2: ; %endif242; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]243; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x3d08fc, v0244; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc245; GFX7-NEXT: s_waitcnt vmcnt(0)246; GFX7-NEXT: flat_store_dword v[0:1], v5247; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)248; GFX7-NEXT: s_setpc_b64 s[30:31]249;250; GFX8-LABEL: test_sink_noop_addrspacecast_flat_to_global_i32:251; GFX8: ; %bb.0: ; %entry252; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)253; GFX8-NEXT: v_mov_b32_e32 v5, 0254; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4255; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc256; GFX8-NEXT: s_cbranch_execz .LBB1_2257; GFX8-NEXT: ; %bb.1: ; %if258; GFX8-NEXT: v_add_u32_e32 v2, vcc, 28, v2259; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc260; GFX8-NEXT: flat_load_dword v5, v[2:3]261; GFX8-NEXT: .LBB1_2: ; %endif262; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]263; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x3d08fc, v0264; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc265; GFX8-NEXT: s_waitcnt vmcnt(0)266; GFX8-NEXT: flat_store_dword v[0:1], v5267; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)268; GFX8-NEXT: s_setpc_b64 s[30:31]269;270; GFX9-LABEL: test_sink_noop_addrspacecast_flat_to_global_i32:271; GFX9: ; %bb.0: ; %entry272; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)273; GFX9-NEXT: v_mov_b32_e32 v5, 0274; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4275; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc276; GFX9-NEXT: s_cbranch_execz .LBB1_2277; GFX9-NEXT: ; %bb.1: ; %if278; GFX9-NEXT: global_load_dword v5, v[2:3], off offset:28279; GFX9-NEXT: .LBB1_2: ; %endif280; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]281; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x3d0000, v0282; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc283; GFX9-NEXT: s_waitcnt vmcnt(0)284; GFX9-NEXT: flat_store_dword v[0:1], v5 offset:2300285; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)286; GFX9-NEXT: s_setpc_b64 s[30:31]287;288; GFX10-LABEL: test_sink_noop_addrspacecast_flat_to_global_i32:289; GFX10: ; %bb.0: ; %entry290; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)291; GFX10-NEXT: v_mov_b32_e32 v5, 0292; GFX10-NEXT: s_mov_b32 s4, exec_lo293; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v4294; GFX10-NEXT: s_cbranch_execz .LBB1_2295; GFX10-NEXT: ; %bb.1: ; %if296; GFX10-NEXT: global_load_dword v5, v[2:3], off offset:28297; GFX10-NEXT: .LBB1_2: ; %endif298; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4299; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x3d0800, v0300; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo301; GFX10-NEXT: s_waitcnt vmcnt(0)302; GFX10-NEXT: flat_store_dword v[0:1], v5 offset:252303; GFX10-NEXT: s_waitcnt lgkmcnt(0)304; GFX10-NEXT: s_setpc_b64 s[30:31]305entry:306 %out.gep = getelementptr inbounds i32, ptr %out, i64 999999307 %in.gep = getelementptr inbounds i32, ptr %in, i64 7308 %cast = addrspacecast ptr %in.gep to ptr addrspace(1)309 %cmp0 = icmp eq i32 %cond, 0310 br i1 %cmp0, label %endif, label %if311 312if:313 %load = load i32, ptr addrspace(1) %cast314 br label %endif315 316endif:317 %x = phi i32 [ %load, %if ], [ 0, %entry ]318 store i32 %x, ptr %out.gep319 br label %done320 321done:322 ret void323}324 325define void @test_sink_noop_addrspacecast_flat_to_constant_i32(ptr %out, ptr %in, i32 %cond) {326; OPT-LABEL: @test_sink_noop_addrspacecast_flat_to_constant_i32(327; OPT-NEXT: entry:328; OPT-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 999999329; OPT-NEXT: [[CMP0:%.*]] = icmp eq i32 [[COND:%.*]], 0330; OPT-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]331; OPT: if:332; OPT-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[IN:%.*]] to ptr addrspace(4)333; OPT-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr addrspace(4) [[TMP0]], i64 28334; OPT-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(4) [[SUNKADDR]], align 4335; OPT-NEXT: br label [[ENDIF]]336; OPT: endif:337; OPT-NEXT: [[X:%.*]] = phi i32 [ [[LOAD]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]338; OPT-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4339; OPT-NEXT: ret void340;341; GFX7-LABEL: test_sink_noop_addrspacecast_flat_to_constant_i32:342; GFX7: ; %bb.0: ; %entry343; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)344; GFX7-NEXT: v_mov_b32_e32 v5, 0345; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4346; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc347; GFX7-NEXT: s_cbranch_execz .LBB2_2348; GFX7-NEXT: ; %bb.1: ; %if349; GFX7-NEXT: s_mov_b32 s10, 0350; GFX7-NEXT: s_mov_b32 s11, 0xf000351; GFX7-NEXT: s_mov_b32 s8, s10352; GFX7-NEXT: s_mov_b32 s9, s10353; GFX7-NEXT: buffer_load_dword v5, v[2:3], s[8:11], 0 addr64 offset:28354; GFX7-NEXT: .LBB2_2: ; %endif355; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]356; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x3d08fc, v0357; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc358; GFX7-NEXT: s_waitcnt vmcnt(0)359; GFX7-NEXT: flat_store_dword v[0:1], v5360; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)361; GFX7-NEXT: s_setpc_b64 s[30:31]362;363; GFX8-LABEL: test_sink_noop_addrspacecast_flat_to_constant_i32:364; GFX8: ; %bb.0: ; %entry365; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)366; GFX8-NEXT: v_mov_b32_e32 v5, 0367; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4368; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc369; GFX8-NEXT: s_cbranch_execz .LBB2_2370; GFX8-NEXT: ; %bb.1: ; %if371; GFX8-NEXT: v_add_u32_e32 v2, vcc, 28, v2372; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc373; GFX8-NEXT: flat_load_dword v5, v[2:3]374; GFX8-NEXT: .LBB2_2: ; %endif375; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]376; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x3d08fc, v0377; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc378; GFX8-NEXT: s_waitcnt vmcnt(0)379; GFX8-NEXT: flat_store_dword v[0:1], v5380; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)381; GFX8-NEXT: s_setpc_b64 s[30:31]382;383; GFX9-LABEL: test_sink_noop_addrspacecast_flat_to_constant_i32:384; GFX9: ; %bb.0: ; %entry385; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)386; GFX9-NEXT: v_mov_b32_e32 v5, 0387; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4388; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc389; GFX9-NEXT: s_cbranch_execz .LBB2_2390; GFX9-NEXT: ; %bb.1: ; %if391; GFX9-NEXT: global_load_dword v5, v[2:3], off offset:28392; GFX9-NEXT: .LBB2_2: ; %endif393; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]394; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x3d0000, v0395; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc396; GFX9-NEXT: s_waitcnt vmcnt(0)397; GFX9-NEXT: flat_store_dword v[0:1], v5 offset:2300398; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)399; GFX9-NEXT: s_setpc_b64 s[30:31]400;401; GFX10-LABEL: test_sink_noop_addrspacecast_flat_to_constant_i32:402; GFX10: ; %bb.0: ; %entry403; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)404; GFX10-NEXT: v_mov_b32_e32 v5, 0405; GFX10-NEXT: s_mov_b32 s4, exec_lo406; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v4407; GFX10-NEXT: s_cbranch_execz .LBB2_2408; GFX10-NEXT: ; %bb.1: ; %if409; GFX10-NEXT: global_load_dword v5, v[2:3], off offset:28410; GFX10-NEXT: .LBB2_2: ; %endif411; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4412; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x3d0800, v0413; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo414; GFX10-NEXT: s_waitcnt vmcnt(0)415; GFX10-NEXT: flat_store_dword v[0:1], v5 offset:252416; GFX10-NEXT: s_waitcnt lgkmcnt(0)417; GFX10-NEXT: s_setpc_b64 s[30:31]418entry:419 %out.gep = getelementptr inbounds i32, ptr %out, i64 999999420 %in.gep = getelementptr inbounds i32, ptr %in, i64 7421 %cast = addrspacecast ptr %in.gep to ptr addrspace(4)422 %cmp0 = icmp eq i32 %cond, 0423 br i1 %cmp0, label %endif, label %if424 425if:426 %load = load i32, ptr addrspace(4) %cast427 br label %endif428 429endif:430 %x = phi i32 [ %load, %if ], [ 0, %entry ]431 store i32 %x, ptr %out.gep432 br label %done433 434done:435 ret void436}437 438define void @test_sink_flat_small_max_flat_offset(ptr %out, ptr %in) #1 {439; OPT-GFX7-LABEL: @test_sink_flat_small_max_flat_offset(440; OPT-GFX7-NEXT: entry:441; OPT-GFX7-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i32 1024442; OPT-GFX7-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 4095443; OPT-GFX7-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3:[0-9]+]]444; OPT-GFX7-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0445; OPT-GFX7-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]446; OPT-GFX7: if:447; OPT-GFX7-NEXT: [[LOAD:%.*]] = load i8, ptr [[IN_GEP]], align 1448; OPT-GFX7-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32449; OPT-GFX7-NEXT: br label [[ENDIF]]450; OPT-GFX7: endif:451; OPT-GFX7-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]452; OPT-GFX7-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4453; OPT-GFX7-NEXT: br label [[DONE:%.*]]454; OPT-GFX7: done:455; OPT-GFX7-NEXT: ret void456;457; OPT-GFX8-LABEL: @test_sink_flat_small_max_flat_offset(458; OPT-GFX8-NEXT: entry:459; OPT-GFX8-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i32 1024460; OPT-GFX8-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 4095461; OPT-GFX8-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3:[0-9]+]]462; OPT-GFX8-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0463; OPT-GFX8-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]464; OPT-GFX8: if:465; OPT-GFX8-NEXT: [[LOAD:%.*]] = load i8, ptr [[IN_GEP]], align 1466; OPT-GFX8-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32467; OPT-GFX8-NEXT: br label [[ENDIF]]468; OPT-GFX8: endif:469; OPT-GFX8-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]470; OPT-GFX8-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4471; OPT-GFX8-NEXT: br label [[DONE:%.*]]472; OPT-GFX8: done:473; OPT-GFX8-NEXT: ret void474;475; OPT-GFX9-LABEL: @test_sink_flat_small_max_flat_offset(476; OPT-GFX9-NEXT: entry:477; OPT-GFX9-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i32 1024478; OPT-GFX9-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3:[0-9]+]]479; OPT-GFX9-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0480; OPT-GFX9-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]481; OPT-GFX9: if:482; OPT-GFX9-NEXT: [[SUNKADDR:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 4095483; OPT-GFX9-NEXT: [[LOAD:%.*]] = load i8, ptr [[SUNKADDR]], align 1484; OPT-GFX9-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32485; OPT-GFX9-NEXT: br label [[ENDIF]]486; OPT-GFX9: endif:487; OPT-GFX9-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]488; OPT-GFX9-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4489; OPT-GFX9-NEXT: ret void490;491; OPT-GFX10-LABEL: @test_sink_flat_small_max_flat_offset(492; OPT-GFX10-NEXT: entry:493; OPT-GFX10-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i32 1024494; OPT-GFX10-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 4095495; OPT-GFX10-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3:[0-9]+]]496; OPT-GFX10-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0497; OPT-GFX10-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]498; OPT-GFX10: if:499; OPT-GFX10-NEXT: [[LOAD:%.*]] = load i8, ptr [[IN_GEP]], align 1500; OPT-GFX10-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32501; OPT-GFX10-NEXT: br label [[ENDIF]]502; OPT-GFX10: endif:503; OPT-GFX10-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]504; OPT-GFX10-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4505; OPT-GFX10-NEXT: br label [[DONE:%.*]]506; OPT-GFX10: done:507; OPT-GFX10-NEXT: ret void508;509; GFX7-LABEL: test_sink_flat_small_max_flat_offset:510; GFX7: ; %bb.0: ; %entry511; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)512; GFX7-NEXT: v_mbcnt_lo_u32_b32_e64 v5, -1, 0513; GFX7-NEXT: v_mov_b32_e32 v4, 0514; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5515; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc516; GFX7-NEXT: s_cbranch_execz .LBB3_2517; GFX7-NEXT: ; %bb.1: ; %if518; GFX7-NEXT: v_add_i32_e32 v2, vcc, 0xfff, v2519; GFX7-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc520; GFX7-NEXT: flat_load_sbyte v4, v[2:3]521; GFX7-NEXT: .LBB3_2: ; %endif522; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]523; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x1000, v0524; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc525; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)526; GFX7-NEXT: flat_store_dword v[0:1], v4527; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)528; GFX7-NEXT: s_setpc_b64 s[30:31]529;530; GFX8-LABEL: test_sink_flat_small_max_flat_offset:531; GFX8: ; %bb.0: ; %entry532; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)533; GFX8-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0534; GFX8-NEXT: v_mov_b32_e32 v4, 0535; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5536; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc537; GFX8-NEXT: s_cbranch_execz .LBB3_2538; GFX8-NEXT: ; %bb.1: ; %if539; GFX8-NEXT: v_add_u32_e32 v2, vcc, 0xfff, v2540; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc541; GFX8-NEXT: flat_load_sbyte v4, v[2:3]542; GFX8-NEXT: .LBB3_2: ; %endif543; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]544; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x1000, v0545; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc546; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)547; GFX8-NEXT: flat_store_dword v[0:1], v4548; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)549; GFX8-NEXT: s_setpc_b64 s[30:31]550;551; GFX9-LABEL: test_sink_flat_small_max_flat_offset:552; GFX9: ; %bb.0: ; %entry553; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)554; GFX9-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0555; GFX9-NEXT: v_mov_b32_e32 v4, 0556; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5557; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc558; GFX9-NEXT: s_cbranch_execz .LBB3_2559; GFX9-NEXT: ; %bb.1: ; %if560; GFX9-NEXT: flat_load_sbyte v4, v[2:3] offset:4095561; GFX9-NEXT: .LBB3_2: ; %endif562; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]563; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x1000, v0564; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc565; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)566; GFX9-NEXT: flat_store_dword v[0:1], v4567; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)568; GFX9-NEXT: s_setpc_b64 s[30:31]569;570; GFX10-LABEL: test_sink_flat_small_max_flat_offset:571; GFX10: ; %bb.0: ; %entry572; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)573; GFX10-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0574; GFX10-NEXT: v_mov_b32_e32 v4, 0575; GFX10-NEXT: s_mov_b32 s4, exec_lo576; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v5577; GFX10-NEXT: s_cbranch_execz .LBB3_2578; GFX10-NEXT: ; %bb.1: ; %if579; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, 0x800, v2580; GFX10-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc_lo581; GFX10-NEXT: flat_load_sbyte v4, v[2:3] offset:2047582; GFX10-NEXT: .LBB3_2: ; %endif583; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4584; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x1000, v0585; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo586; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)587; GFX10-NEXT: flat_store_dword v[0:1], v4588; GFX10-NEXT: s_waitcnt lgkmcnt(0)589; GFX10-NEXT: s_setpc_b64 s[30:31]590entry:591 %out.gep = getelementptr inbounds i32, ptr %out, i32 1024592 %in.gep = getelementptr inbounds i8, ptr %in, i64 4095593 %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0594 %cmp0 = icmp eq i32 %tid, 0595 br i1 %cmp0, label %endif, label %if596 597if:598 %load = load i8, ptr %in.gep599 %cast = sext i8 %load to i32600 br label %endif601 602endif:603 %x = phi i32 [ %cast, %if ], [ 0, %entry ]604 store i32 %x, ptr %out.gep605 br label %done606 607done:608 ret void609}610 611define void @test_sink_flat_small_max_plus_1_flat_offset(ptr %out, ptr %in) #1 {612; OPT-LABEL: @test_sink_flat_small_max_plus_1_flat_offset(613; OPT-NEXT: entry:614; OPT-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i64 99999615; OPT-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 4096616; OPT-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3:[0-9]+]]617; OPT-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0618; OPT-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]619; OPT: if:620; OPT-NEXT: [[LOAD:%.*]] = load i8, ptr [[IN_GEP]], align 1621; OPT-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32622; OPT-NEXT: br label [[ENDIF]]623; OPT: endif:624; OPT-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]625; OPT-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4626; OPT-NEXT: br label [[DONE:%.*]]627; OPT: done:628; OPT-NEXT: ret void629;630; GFX7-LABEL: test_sink_flat_small_max_plus_1_flat_offset:631; GFX7: ; %bb.0: ; %entry632; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)633; GFX7-NEXT: v_mbcnt_lo_u32_b32_e64 v5, -1, 0634; GFX7-NEXT: v_mov_b32_e32 v4, 0635; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5636; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc637; GFX7-NEXT: s_cbranch_execz .LBB4_2638; GFX7-NEXT: ; %bb.1: ; %if639; GFX7-NEXT: v_add_i32_e32 v2, vcc, 0x1000, v2640; GFX7-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc641; GFX7-NEXT: flat_load_sbyte v4, v[2:3]642; GFX7-NEXT: .LBB4_2: ; %endif643; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]644; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x61a7c, v0645; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc646; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)647; GFX7-NEXT: flat_store_dword v[0:1], v4648; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)649; GFX7-NEXT: s_setpc_b64 s[30:31]650;651; GFX8-LABEL: test_sink_flat_small_max_plus_1_flat_offset:652; GFX8: ; %bb.0: ; %entry653; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)654; GFX8-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0655; GFX8-NEXT: v_mov_b32_e32 v4, 0656; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5657; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc658; GFX8-NEXT: s_cbranch_execz .LBB4_2659; GFX8-NEXT: ; %bb.1: ; %if660; GFX8-NEXT: v_add_u32_e32 v2, vcc, 0x1000, v2661; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc662; GFX8-NEXT: flat_load_sbyte v4, v[2:3]663; GFX8-NEXT: .LBB4_2: ; %endif664; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]665; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x61a7c, v0666; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc667; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)668; GFX8-NEXT: flat_store_dword v[0:1], v4669; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)670; GFX8-NEXT: s_setpc_b64 s[30:31]671;672; GFX9-LABEL: test_sink_flat_small_max_plus_1_flat_offset:673; GFX9: ; %bb.0: ; %entry674; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)675; GFX9-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0676; GFX9-NEXT: v_mov_b32_e32 v4, 0677; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5678; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc679; GFX9-NEXT: s_cbranch_execz .LBB4_2680; GFX9-NEXT: ; %bb.1: ; %if681; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, 0x1000, v2682; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc683; GFX9-NEXT: flat_load_sbyte v4, v[2:3]684; GFX9-NEXT: .LBB4_2: ; %endif685; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]686; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x61000, v0687; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc688; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)689; GFX9-NEXT: flat_store_dword v[0:1], v4 offset:2684690; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)691; GFX9-NEXT: s_setpc_b64 s[30:31]692;693; GFX10-LABEL: test_sink_flat_small_max_plus_1_flat_offset:694; GFX10: ; %bb.0: ; %entry695; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)696; GFX10-NEXT: v_mbcnt_lo_u32_b32 v5, -1, 0697; GFX10-NEXT: v_mov_b32_e32 v4, 0698; GFX10-NEXT: s_mov_b32 s4, exec_lo699; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v5700; GFX10-NEXT: s_cbranch_execz .LBB4_2701; GFX10-NEXT: ; %bb.1: ; %if702; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, 0x1000, v2703; GFX10-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc_lo704; GFX10-NEXT: flat_load_sbyte v4, v[2:3]705; GFX10-NEXT: .LBB4_2: ; %endif706; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4707; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x61800, v0708; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo709; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)710; GFX10-NEXT: flat_store_dword v[0:1], v4 offset:636711; GFX10-NEXT: s_waitcnt lgkmcnt(0)712; GFX10-NEXT: s_setpc_b64 s[30:31]713entry:714 %out.gep = getelementptr inbounds i32, ptr %out, i64 99999715 %in.gep = getelementptr inbounds i8, ptr %in, i64 4096716 %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0717 %cmp0 = icmp eq i32 %tid, 0718 br i1 %cmp0, label %endif, label %if719 720if:721 %load = load i8, ptr %in.gep722 %cast = sext i8 %load to i32723 br label %endif724 725endif:726 %x = phi i32 [ %cast, %if ], [ 0, %entry ]727 store i32 %x, ptr %out.gep728 br label %done729 730done:731 ret void732}733 734define void @test_sinkable_flat_reg_offset(ptr %out, ptr %in, i64 %reg) #1 {735; OPT-LABEL: @test_sinkable_flat_reg_offset(736; OPT-NEXT: entry:737; OPT-NEXT: [[OUT_GEP:%.*]] = getelementptr inbounds i32, ptr [[OUT:%.*]], i32 1024738; OPT-NEXT: [[IN_GEP:%.*]] = getelementptr inbounds i8, ptr [[IN:%.*]], i64 [[REG:%.*]]739; OPT-NEXT: [[TID:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #[[ATTR3]]740; OPT-NEXT: [[CMP0:%.*]] = icmp eq i32 [[TID]], 0741; OPT-NEXT: br i1 [[CMP0]], label [[ENDIF:%.*]], label [[IF:%.*]]742; OPT: if:743; OPT-NEXT: [[LOAD:%.*]] = load i8, ptr [[IN_GEP]], align 1744; OPT-NEXT: [[CAST:%.*]] = sext i8 [[LOAD]] to i32745; OPT-NEXT: br label [[ENDIF]]746; OPT: endif:747; OPT-NEXT: [[X:%.*]] = phi i32 [ [[CAST]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]748; OPT-NEXT: store i32 [[X]], ptr [[OUT_GEP]], align 4749; OPT-NEXT: br label [[DONE:%.*]]750; OPT: done:751; OPT-NEXT: ret void752;753; GFX7-LABEL: test_sinkable_flat_reg_offset:754; GFX7: ; %bb.0: ; %entry755; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)756; GFX7-NEXT: v_mbcnt_lo_u32_b32_e64 v7, -1, 0757; GFX7-NEXT: v_mov_b32_e32 v6, 0758; GFX7-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7759; GFX7-NEXT: s_and_saveexec_b64 s[4:5], vcc760; GFX7-NEXT: s_cbranch_execz .LBB5_2761; GFX7-NEXT: ; %bb.1: ; %if762; GFX7-NEXT: v_add_i32_e32 v2, vcc, v2, v4763; GFX7-NEXT: v_addc_u32_e32 v3, vcc, v3, v5, vcc764; GFX7-NEXT: flat_load_sbyte v6, v[2:3]765; GFX7-NEXT: .LBB5_2: ; %endif766; GFX7-NEXT: s_or_b64 exec, exec, s[4:5]767; GFX7-NEXT: v_add_i32_e32 v0, vcc, 0x1000, v0768; GFX7-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc769; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)770; GFX7-NEXT: flat_store_dword v[0:1], v6771; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)772; GFX7-NEXT: s_setpc_b64 s[30:31]773;774; GFX8-LABEL: test_sinkable_flat_reg_offset:775; GFX8: ; %bb.0: ; %entry776; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)777; GFX8-NEXT: v_mbcnt_lo_u32_b32 v7, -1, 0778; GFX8-NEXT: v_mov_b32_e32 v6, 0779; GFX8-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7780; GFX8-NEXT: s_and_saveexec_b64 s[4:5], vcc781; GFX8-NEXT: s_cbranch_execz .LBB5_2782; GFX8-NEXT: ; %bb.1: ; %if783; GFX8-NEXT: v_add_u32_e32 v2, vcc, v2, v4784; GFX8-NEXT: v_addc_u32_e32 v3, vcc, v3, v5, vcc785; GFX8-NEXT: flat_load_sbyte v6, v[2:3]786; GFX8-NEXT: .LBB5_2: ; %endif787; GFX8-NEXT: s_or_b64 exec, exec, s[4:5]788; GFX8-NEXT: v_add_u32_e32 v0, vcc, 0x1000, v0789; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc790; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)791; GFX8-NEXT: flat_store_dword v[0:1], v6792; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)793; GFX8-NEXT: s_setpc_b64 s[30:31]794;795; GFX9-LABEL: test_sinkable_flat_reg_offset:796; GFX9: ; %bb.0: ; %entry797; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)798; GFX9-NEXT: v_mbcnt_lo_u32_b32 v7, -1, 0799; GFX9-NEXT: v_mov_b32_e32 v6, 0800; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7801; GFX9-NEXT: s_and_saveexec_b64 s[4:5], vcc802; GFX9-NEXT: s_cbranch_execz .LBB5_2803; GFX9-NEXT: ; %bb.1: ; %if804; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v4805; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v5, vcc806; GFX9-NEXT: flat_load_sbyte v6, v[2:3]807; GFX9-NEXT: .LBB5_2: ; %endif808; GFX9-NEXT: s_or_b64 exec, exec, s[4:5]809; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x1000, v0810; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc811; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)812; GFX9-NEXT: flat_store_dword v[0:1], v6813; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)814; GFX9-NEXT: s_setpc_b64 s[30:31]815;816; GFX10-LABEL: test_sinkable_flat_reg_offset:817; GFX10: ; %bb.0: ; %entry818; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)819; GFX10-NEXT: v_mbcnt_lo_u32_b32 v7, -1, 0820; GFX10-NEXT: v_mov_b32_e32 v6, 0821; GFX10-NEXT: s_mov_b32 s4, exec_lo822; GFX10-NEXT: v_cmpx_ne_u32_e32 0, v7823; GFX10-NEXT: s_cbranch_execz .LBB5_2824; GFX10-NEXT: ; %bb.1: ; %if825; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4826; GFX10-NEXT: v_add_co_ci_u32_e64 v3, null, v3, v5, vcc_lo827; GFX10-NEXT: flat_load_sbyte v6, v[2:3]828; GFX10-NEXT: .LBB5_2: ; %endif829; GFX10-NEXT: s_or_b32 exec_lo, exec_lo, s4830; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, 0x1000, v0831; GFX10-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo832; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)833; GFX10-NEXT: flat_store_dword v[0:1], v6834; GFX10-NEXT: s_waitcnt lgkmcnt(0)835; GFX10-NEXT: s_setpc_b64 s[30:31]836entry:837 %out.gep = getelementptr inbounds i32, ptr %out, i32 1024838 %in.gep = getelementptr inbounds i8, ptr %in, i64 %reg839 %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0840 %cmp0 = icmp eq i32 %tid, 0841 br i1 %cmp0, label %endif, label %if842 843if:844 %load = load i8, ptr %in.gep845 %cast = sext i8 %load to i32846 br label %endif847 848endif:849 %x = phi i32 [ %cast, %if ], [ 0, %entry ]850 store i32 %x, ptr %out.gep851 br label %done852 853done:854 ret void855}856 857declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #0858 859attributes #0 = { nounwind readnone }860attributes #1 = { nounwind }861attributes #2 = { nounwind argmemonly }862