1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s 3 4; Test the localizer did something and we don't materialize all 5; constants in SGPRs in the entry block. 6 7define amdgpu_kernel void @localize_constants(i1 %cond) { 8; GFX9-LABEL: localize_constants: 9; GFX9: ; %bb.0: ; %entry 10; GFX9-NEXT: s_load_dword s1, s[4:5], 0x0 11; GFX9-NEXT: s_mov_b32 s0, 1 12; GFX9-NEXT: s_waitcnt lgkmcnt(0) 13; GFX9-NEXT: s_xor_b32 s1, s1, 1 14; GFX9-NEXT: s_and_b32 s1, s1, 1 15; GFX9-NEXT: s_cmp_lg_u32 s1, 0 16; GFX9-NEXT: s_cbranch_scc0 BB0_2 17; GFX9-NEXT: ; %bb.1: ; %bb1 18; GFX9-NEXT: v_mov_b32_e32 v0, 0x5be6 19; GFX9-NEXT: global_store_dword v[0:1], v0, off 20; GFX9-NEXT: v_mov_b32_e32 v0, 0x1c7 21; GFX9-NEXT: global_store_dword v[0:1], v0, off 22; GFX9-NEXT: v_mov_b32_e32 v0, 0x3e8 23; GFX9-NEXT: global_store_dword v[0:1], v0, off 24; GFX9-NEXT: v_mov_b32_e32 v0, 0x1c8 25; GFX9-NEXT: global_store_dword v[0:1], v0, off 26; GFX9-NEXT: v_mov_b32_e32 v0, 0x3e7 27; GFX9-NEXT: global_store_dword v[0:1], v0, off 28; GFX9-NEXT: v_mov_b32_e32 v0, 0x7b 29; GFX9-NEXT: s_mov_b32 s0, 0 30; GFX9-NEXT: global_store_dword v[0:1], v0, off 31; GFX9-NEXT: BB0_2: ; %Flow 32; GFX9-NEXT: s_and_b32 s0, s0, 1 33; GFX9-NEXT: s_cmp_lg_u32 s0, 0 34; GFX9-NEXT: s_cbranch_scc0 BB0_4 35; GFX9-NEXT: ; %bb.3: ; %bb0 36; GFX9-NEXT: v_mov_b32_e32 v0, 0x7b 37; GFX9-NEXT: global_store_dword v[0:1], v0, off 38; GFX9-NEXT: v_mov_b32_e32 v0, 0x1c8 39; GFX9-NEXT: global_store_dword v[0:1], v0, off 40; GFX9-NEXT: v_mov_b32_e32 v0, 0x3e7 41; GFX9-NEXT: global_store_dword v[0:1], v0, off 42; GFX9-NEXT: v_mov_b32_e32 v0, 0x3e8 43; GFX9-NEXT: global_store_dword v[0:1], v0, off 44; GFX9-NEXT: v_mov_b32_e32 v0, 0x1c7 45; GFX9-NEXT: global_store_dword v[0:1], v0, off 46; GFX9-NEXT: v_mov_b32_e32 v0, 0x5be6 47; GFX9-NEXT: global_store_dword v[0:1], v0, off 48; GFX9-NEXT: BB0_4: ; %bb2 49; GFX9-NEXT: s_endpgm 50entry: 51 br i1 %cond, label %bb0, label %bb1 52 53bb0: 54 store volatile i32 123, i32 addrspace(1)* undef 55 store volatile i32 456, i32 addrspace(1)* undef 56 store volatile i32 999, i32 addrspace(1)* undef 57 store volatile i32 1000, i32 addrspace(1)* undef 58 store volatile i32 455, i32 addrspace(1)* undef 59 store volatile i32 23526, i32 addrspace(1)* undef 60 br label %bb2 61 62bb1: 63 store volatile i32 23526, i32 addrspace(1)* undef 64 store volatile i32 455, i32 addrspace(1)* undef 65 store volatile i32 1000, i32 addrspace(1)* undef 66 store volatile i32 456, i32 addrspace(1)* undef 67 store volatile i32 999, i32 addrspace(1)* undef 68 store volatile i32 123, i32 addrspace(1)* undef 69 br label %bb2 70 71bb2: 72 ret void 73} 74 75; FIXME: These aren't localized because thesee were legalized before 76; the localizer, and are no longer G_GLOBAL_VALUE. 77@gv0 = addrspace(1) global i32 undef, align 4 78@gv1 = addrspace(1) global i32 undef, align 4 79@gv2 = addrspace(1) global i32 undef, align 4 80@gv3 = addrspace(1) global i32 undef, align 4 81 82define amdgpu_kernel void @localize_globals(i1 %cond) { 83; GFX9-LABEL: localize_globals: 84; GFX9: ; %bb.0: ; %entry 85; GFX9-NEXT: s_load_dword s1, s[4:5], 0x0 86; GFX9-NEXT: s_mov_b32 s0, 1 87; GFX9-NEXT: s_waitcnt lgkmcnt(0) 88; GFX9-NEXT: s_xor_b32 s1, s1, 1 89; GFX9-NEXT: s_and_b32 s1, s1, 1 90; GFX9-NEXT: s_cmp_lg_u32 s1, 0 91; GFX9-NEXT: s_cbranch_scc0 BB1_2 92; GFX9-NEXT: ; %bb.1: ; %bb1 93; GFX9-NEXT: s_getpc_b64 s[2:3] 94; GFX9-NEXT: s_add_u32 s2, s2, gv2@gotpcrel32@lo+4 95; GFX9-NEXT: s_addc_u32 s3, s3, gv2@gotpcrel32@hi+4 96; GFX9-NEXT: s_getpc_b64 s[4:5] 97; GFX9-NEXT: s_add_u32 s4, s4, gv3@gotpcrel32@lo+4 98; GFX9-NEXT: s_addc_u32 s5, s5, gv3@gotpcrel32@hi+4 99; GFX9-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0 100; GFX9-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x0 101; GFX9-NEXT: v_mov_b32_e32 v2, 0 102; GFX9-NEXT: s_mov_b32 s0, 0 103; GFX9-NEXT: s_waitcnt lgkmcnt(0) 104; GFX9-NEXT: v_mov_b32_e32 v0, s2 105; GFX9-NEXT: v_mov_b32_e32 v1, s3 106; GFX9-NEXT: global_store_dword v[0:1], v2, off 107; GFX9-NEXT: v_mov_b32_e32 v0, s4 108; GFX9-NEXT: v_mov_b32_e32 v2, 1 109; GFX9-NEXT: v_mov_b32_e32 v1, s5 110; GFX9-NEXT: global_store_dword v[0:1], v2, off 111; GFX9-NEXT: BB1_2: ; %Flow 112; GFX9-NEXT: s_and_b32 s0, s0, 1 113; GFX9-NEXT: s_cmp_lg_u32 s0, 0 114; GFX9-NEXT: s_cbranch_scc0 BB1_4 115; GFX9-NEXT: ; %bb.3: ; %bb0 116; GFX9-NEXT: s_getpc_b64 s[0:1] 117; GFX9-NEXT: s_add_u32 s0, s0, gv0@gotpcrel32@lo+4 118; GFX9-NEXT: s_addc_u32 s1, s1, gv0@gotpcrel32@hi+4 119; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 120; GFX9-NEXT: s_getpc_b64 s[2:3] 121; GFX9-NEXT: s_add_u32 s2, s2, gv1@gotpcrel32@lo+4 122; GFX9-NEXT: s_addc_u32 s3, s3, gv1@gotpcrel32@hi+4 123; GFX9-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x0 124; GFX9-NEXT: v_mov_b32_e32 v2, 0 125; GFX9-NEXT: v_mov_b32_e32 v3, 1 126; GFX9-NEXT: s_waitcnt lgkmcnt(0) 127; GFX9-NEXT: v_mov_b32_e32 v0, s0 128; GFX9-NEXT: v_mov_b32_e32 v1, s1 129; GFX9-NEXT: global_store_dword v[0:1], v2, off 130; GFX9-NEXT: v_mov_b32_e32 v0, s2 131; GFX9-NEXT: v_mov_b32_e32 v1, s3 132; GFX9-NEXT: global_store_dword v[0:1], v3, off 133; GFX9-NEXT: BB1_4: ; %bb2 134; GFX9-NEXT: s_endpgm 135entry: 136 br i1 %cond, label %bb0, label %bb1 137 138bb0: 139 store volatile i32 0, i32 addrspace(1)* @gv0 140 store volatile i32 1, i32 addrspace(1)* @gv1 141 br label %bb2 142 143bb1: 144 store volatile i32 0, i32 addrspace(1)* @gv2 145 store volatile i32 1, i32 addrspace(1)* @gv3 146 br label %bb2 147 148bb2: 149 ret void 150} 151 152@static.gv0 = internal addrspace(1) global i32 undef, align 4 153@static.gv1 = internal addrspace(1) global i32 undef, align 4 154@static.gv2 = internal addrspace(1) global i32 undef, align 4 155@static.gv3 = internal addrspace(1) global i32 undef, align 4 156 157define void @localize_internal_globals(i1 %cond) { 158; GFX9-LABEL: localize_internal_globals: 159; GFX9: ; %bb.0: ; %entry 160; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 161; GFX9-NEXT: v_and_b32_e32 v0, 1, v0 162; GFX9-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0 163; GFX9-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, 1 164; GFX9-NEXT: s_xor_b64 s[4:5], vcc, s[4:5] 165; GFX9-NEXT: s_and_saveexec_b64 s[6:7], s[4:5] 166; GFX9-NEXT: s_xor_b64 s[4:5], exec, s[6:7] 167; GFX9-NEXT: s_cbranch_execnz BB2_2 168; GFX9-NEXT: ; %bb.1: ; %bb1 169; GFX9-NEXT: s_getpc_b64 s[6:7] 170; GFX9-NEXT: s_add_u32 s6, s6, static.gv2@rel32@lo+4 171; GFX9-NEXT: s_addc_u32 s7, s7, static.gv2@rel32@hi+4 172; GFX9-NEXT: v_mov_b32_e32 v0, s6 173; GFX9-NEXT: v_mov_b32_e32 v1, s7 174; GFX9-NEXT: v_mov_b32_e32 v2, 0 175; GFX9-NEXT: s_getpc_b64 s[6:7] 176; GFX9-NEXT: s_add_u32 s6, s6, static.gv3@rel32@lo+4 177; GFX9-NEXT: s_addc_u32 s7, s7, static.gv3@rel32@hi+4 178; GFX9-NEXT: global_store_dword v[0:1], v2, off 179; GFX9-NEXT: v_mov_b32_e32 v0, s6 180; GFX9-NEXT: v_mov_b32_e32 v2, 1 181; GFX9-NEXT: v_mov_b32_e32 v1, s7 182; GFX9-NEXT: global_store_dword v[0:1], v2, off 183; GFX9-NEXT: BB2_2: ; %Flow 184; GFX9-NEXT: s_or_saveexec_b64 s[4:5], s[4:5] 185; GFX9-NEXT: s_xor_b64 exec, exec, s[4:5] 186; GFX9-NEXT: s_cbranch_execz BB2_4 187; GFX9-NEXT: ; %bb.3: ; %bb0 188; GFX9-NEXT: s_getpc_b64 s[6:7] 189; GFX9-NEXT: s_add_u32 s6, s6, static.gv0@rel32@lo+4 190; GFX9-NEXT: s_addc_u32 s7, s7, static.gv0@rel32@hi+4 191; GFX9-NEXT: v_mov_b32_e32 v0, s6 192; GFX9-NEXT: v_mov_b32_e32 v1, s7 193; GFX9-NEXT: v_mov_b32_e32 v2, 0 194; GFX9-NEXT: s_getpc_b64 s[6:7] 195; GFX9-NEXT: s_add_u32 s6, s6, static.gv1@rel32@lo+4 196; GFX9-NEXT: s_addc_u32 s7, s7, static.gv1@rel32@hi+4 197; GFX9-NEXT: global_store_dword v[0:1], v2, off 198; GFX9-NEXT: v_mov_b32_e32 v0, s6 199; GFX9-NEXT: v_mov_b32_e32 v2, 1 200; GFX9-NEXT: v_mov_b32_e32 v1, s7 201; GFX9-NEXT: global_store_dword v[0:1], v2, off 202; GFX9-NEXT: BB2_4: ; %bb2 203; GFX9-NEXT: s_or_b64 exec, exec, s[4:5] 204; GFX9-NEXT: s_waitcnt vmcnt(0) 205; GFX9-NEXT: s_setpc_b64 s[30:31] 206entry: 207 br i1 %cond, label %bb0, label %bb1 208 209bb0: 210 store volatile i32 0, i32 addrspace(1)* @static.gv0 211 store volatile i32 1, i32 addrspace(1)* @static.gv1 212 br label %bb2 213 214bb1: 215 store volatile i32 0, i32 addrspace(1)* @static.gv2 216 store volatile i32 1, i32 addrspace(1)* @static.gv3 217 br label %bb2 218 219bb2: 220 ret void 221} 222