@@ -21,11 +21,39 @@ define i64 @shl_metadata(i64 %arg0, ptr %arg1.ptr) {
2121; CHECK-LABEL: shl_metadata:
2222; CHECK: ; %bb.0:
2323; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
24+ ; CHECK-NEXT: flat_load_dword v1, v[2:3]
25+ ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
26+ ; CHECK-NEXT: v_lshlrev_b32_e32 v1, v1, v0
27+ ; CHECK-NEXT: v_mov_b32_e32 v0, 0
28+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
29+ %shift.amt = load i64 , ptr %arg1.ptr , !range !0 , !noundef !{}
30+ %shl = shl i64 %arg0 , %shift.amt
31+ ret i64 %shl
32+ }
33+
34+ define i64 @shl_metadata_two_ranges (i64 %arg0 , ptr %arg1.ptr ) {
35+ ; CHECK-LABEL: shl_metadata_two_ranges:
36+ ; CHECK: ; %bb.0:
37+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
38+ ; CHECK-NEXT: flat_load_dword v1, v[2:3]
39+ ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
40+ ; CHECK-NEXT: v_lshlrev_b32_e32 v1, v1, v0
41+ ; CHECK-NEXT: v_mov_b32_e32 v0, 0
42+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
43+ %shift.amt = load i64 , ptr %arg1.ptr , !range !1 , !noundef !{}
44+ %shl = shl i64 %arg0 , %shift.amt
45+ ret i64 %shl
46+ }
47+
48+ define i64 @shl_metadata_out_of_range (i64 %arg0 , ptr %arg1.ptr ) {
49+ ; CHECK-LABEL: shl_metadata_out_of_range:
50+ ; CHECK: ; %bb.0:
51+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2452; CHECK-NEXT: flat_load_dword v2, v[2:3]
2553; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
2654; CHECK-NEXT: v_lshlrev_b64 v[0:1], v2, v[0:1]
2755; CHECK-NEXT: s_setpc_b64 s[30:31]
28- %shift.amt = load i64 , ptr %arg1.ptr , !range !0
56+ %shift.amt = load i64 , ptr %arg1.ptr , !range !2 , !noundef !{}
2957 %shl = shl i64 %arg0 , %shift.amt
3058 ret i64 %shl
3159}
@@ -39,7 +67,7 @@ define <2 x i64> @shl_v2_metadata(<2 x i64> %arg0, ptr %arg1.ptr) {
3967; CHECK-NEXT: v_lshlrev_b64 v[0:1], v4, v[0:1]
4068; CHECK-NEXT: v_lshlrev_b64 v[2:3], v6, v[2:3]
4169; CHECK-NEXT: s_setpc_b64 s[30:31]
42- %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0
70+ %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
4371 %shl = shl <2 x i64 > %arg0 , %shift.amt
4472 ret <2 x i64 > %shl
4573}
@@ -55,7 +83,7 @@ define <3 x i64> @shl_v3_metadata(<3 x i64> %arg0, ptr %arg1.ptr) {
5583; CHECK-NEXT: v_lshlrev_b64 v[0:1], v8, v[0:1]
5684; CHECK-NEXT: v_lshlrev_b64 v[2:3], v10, v[2:3]
5785; CHECK-NEXT: s_setpc_b64 s[30:31]
58- %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0
86+ %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
5987 %shl = shl <3 x i64 > %arg0 , %shift.amt
6088 ret <3 x i64 > %shl
6189}
@@ -74,12 +102,14 @@ define <4 x i64> @shl_v4_metadata(<4 x i64> %arg0, ptr %arg1.ptr) {
74102; CHECK-NEXT: v_lshlrev_b64 v[4:5], v13, v[4:5]
75103; CHECK-NEXT: v_lshlrev_b64 v[6:7], v15, v[6:7]
76104; CHECK-NEXT: s_setpc_b64 s[30:31]
77- %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0
105+ %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
78106 %shl = shl <4 x i64 > %arg0 , %shift.amt
79107 ret <4 x i64 > %shl
80108}
81109
82110!0 = !{i64 32 , i64 64 }
111+ !1 = !{i64 32 , i64 38 , i64 42 , i64 48 }
112+ !2 = !{i64 31 , i64 38 , i64 42 , i64 48 }
83113
84114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85115; Test range with an "or X, 16"
0 commit comments