brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.5 KiB · e509d7b Raw
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