summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2018-05-09 20:52:54 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2018-05-09 20:52:54 +0000
commit74fd7600d2120476729c4290f86118ea3bba5b69 (patch)
tree5901e1611a8cfbf6517d1a2cd2f924acf5ce5bf7 /llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll
parentb143d9a5eabd6957a67daec4f02ab9209c358644 (diff)
downloadbcm5719-llvm-74fd7600d2120476729c4290f86118ea3bba5b69.tar.gz
bcm5719-llvm-74fd7600d2120476729c4290f86118ea3bba5b69.zip
AMDGPU: Handle partial shift reduction for variable shifts
If the variable shift amount has known bits, we can still reduce the shift. llvm-svn: 331917
Diffstat (limited to 'llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll')
-rw-r--r--llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll36
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll b/llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll
index 65307ca6fa9..8bbac5832ad 100644
--- a/llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll
+++ b/llvm/test/CodeGen/AMDGPU/partial-shift-shrink.ll
@@ -100,3 +100,39 @@ define amdgpu_kernel void @s_trunc_srl_i64_16_to_i16(i64 %x) {
store i16 %add, i16 addrspace(1)* undef
ret void
}
+
+; GCN-LABEL: {{^}}trunc_srl_i64_var_mask15_to_i16:
+; GCN: s_waitcnt
+; GCN-NEXT: v_and_b32_e32 v1, 15, v2
+; GCN-NEXT: v_lshrrev_b32_e32 v0, v1, v0
+; GCN-NEXT: s_setpc_b64
+define i16 @trunc_srl_i64_var_mask15_to_i16(i64 %x, i64 %amt) {
+ %amt.masked = and i64 %amt, 15
+ %shift = lshr i64 %x, %amt.masked
+ %trunc = trunc i64 %shift to i16
+ ret i16 %trunc
+}
+
+; GCN-LABEL: {{^}}trunc_srl_i64_var_mask16_to_i16:
+; GCN: s_waitcnt
+; GCN-NEXT: v_and_b32_e32 v2, 16, v2
+; GCN-NEXT: v_lshrrev_b64 v[0:1], v2, v[0:1]
+; GCN-NEXT: s_setpc_b64
+define i16 @trunc_srl_i64_var_mask16_to_i16(i64 %x, i64 %amt) {
+ %amt.masked = and i64 %amt, 16
+ %shift = lshr i64 %x, %amt.masked
+ %trunc = trunc i64 %shift to i16
+ ret i16 %trunc
+}
+
+; GCN-LABEL: {{^}}trunc_srl_i64_var_mask31_to_i16:
+; GCN: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GCN-NEXT: v_and_b32_e32 v2, 31, v2
+; GCN-NEXT: v_lshrrev_b64 v[0:1], v2, v[0:1]
+; GCN-NEXT: s_setpc_b64 s[30:31]
+define i16 @trunc_srl_i64_var_mask31_to_i16(i64 %x, i64 %amt) {
+ %amt.masked = and i64 %amt, 31
+ %shift = lshr i64 %x, %amt.masked
+ %trunc = trunc i64 %shift to i16
+ ret i16 %trunc
+}
OpenPOWER on IntegriCloud