@@ -21,11 +21,39 @@ define i64 @shl_metadata(i64 %arg0, ptr %arg1.ptr) {
21
21
; CHECK-LABEL: shl_metadata:
22
22
; CHECK: ; %bb.0:
23
23
; 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)
24
52
; CHECK-NEXT: flat_load_dword v2, v[2:3]
25
53
; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
26
54
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v2, v[0:1]
27
55
; 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 !{}
29
57
%shl = shl i64 %arg0 , %shift.amt
30
58
ret i64 %shl
31
59
}
@@ -39,7 +67,7 @@ define <2 x i64> @shl_v2_metadata(<2 x i64> %arg0, ptr %arg1.ptr) {
39
67
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v4, v[0:1]
40
68
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v6, v[2:3]
41
69
; 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 !{}
43
71
%shl = shl <2 x i64 > %arg0 , %shift.amt
44
72
ret <2 x i64 > %shl
45
73
}
@@ -55,7 +83,7 @@ define <3 x i64> @shl_v3_metadata(<3 x i64> %arg0, ptr %arg1.ptr) {
55
83
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v8, v[0:1]
56
84
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v10, v[2:3]
57
85
; 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 !{}
59
87
%shl = shl <3 x i64 > %arg0 , %shift.amt
60
88
ret <3 x i64 > %shl
61
89
}
@@ -74,12 +102,14 @@ define <4 x i64> @shl_v4_metadata(<4 x i64> %arg0, ptr %arg1.ptr) {
74
102
; CHECK-NEXT: v_lshlrev_b64 v[4:5], v13, v[4:5]
75
103
; CHECK-NEXT: v_lshlrev_b64 v[6:7], v15, v[6:7]
76
104
; 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 !{}
78
106
%shl = shl <4 x i64 > %arg0 , %shift.amt
79
107
ret <4 x i64 > %shl
80
108
}
81
109
82
110
!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 }
83
113
84
114
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85
115
; Test range with an "or X, 16"
0 commit comments