13
13
; Test range with metadata
14
14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15
15
16
+ ; FIXME: This case should be reduced, but SelectionDAG::computeKnownBits() cannot
17
+ ; determine the minimum from metadata in this case. Match current results
18
+ ; for now.
19
+
16
20
define i64 @shl_metadata (i64 %arg0 , ptr %arg1.ptr ) {
17
21
; CHECK-LABEL: shl_metadata:
18
22
; CHECK: ; %bb.0:
19
23
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
20
- ; CHECK-NEXT: flat_load_dword v1, v[2:3]
21
- ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
22
- ; CHECK-NEXT: v_lshlrev_b32_e32 v1, v1, v0
23
- ; CHECK-NEXT: v_mov_b32_e32 v0, 0
24
- ; CHECK-NEXT: s_setpc_b64 s[30:31]
25
- %shift.amt = load i64 , ptr %arg1.ptr , !range !0 , !noundef !{}
26
- %shl = shl i64 %arg0 , %shift.amt
27
- ret i64 %shl
28
- }
29
-
30
- define i64 @shl_metadata_two_ranges (i64 %arg0 , ptr %arg1.ptr ) {
31
- ; CHECK-LABEL: shl_metadata_two_ranges:
32
- ; CHECK: ; %bb.0:
33
- ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34
- ; CHECK-NEXT: flat_load_dword v1, v[2:3]
35
- ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
36
- ; CHECK-NEXT: v_lshlrev_b32_e32 v1, v1, v0
37
- ; CHECK-NEXT: v_mov_b32_e32 v0, 0
38
- ; CHECK-NEXT: s_setpc_b64 s[30:31]
39
- %shift.amt = load i64 , ptr %arg1.ptr , !range !1 , !noundef !{}
40
- %shl = shl i64 %arg0 , %shift.amt
41
- ret i64 %shl
42
- }
43
-
44
- ; Known minimum is too low. Reduction must not be done.
45
- define i64 @shl_metadata_out_of_range (i64 %arg0 , ptr %arg1.ptr ) {
46
- ; CHECK-LABEL: shl_metadata_out_of_range:
47
- ; CHECK: ; %bb.0:
48
- ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
49
- ; CHECK-NEXT: flat_load_dword v2, v[2:3]
50
- ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
51
- ; CHECK-NEXT: v_lshlrev_b64 v[0:1], v2, v[0:1]
52
- ; CHECK-NEXT: s_setpc_b64 s[30:31]
53
- %shift.amt = load i64 , ptr %arg1.ptr , !range !2 , !noundef !{}
54
- %shl = shl i64 %arg0 , %shift.amt
55
- ret i64 %shl
56
- }
57
-
58
- ; Bounds cannot be truncated to i32 when load is narrowed to i32.
59
- ; Reduction must not be done.
60
- ; Bounds were chosen so that if bounds were truncated to i32 the
61
- ; known minimum would be 32 and the shl would be erroneously reduced.
62
- define i64 @shl_metadata_cant_be_narrowed_to_i32 (i64 %arg0 , ptr %arg1.ptr ) {
63
- ; CHECK-LABEL: shl_metadata_cant_be_narrowed_to_i32:
64
- ; CHECK: ; %bb.0:
65
- ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
66
24
; CHECK-NEXT: flat_load_dword v2, v[2:3]
67
25
; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
68
26
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v2, v[0:1]
69
27
; CHECK-NEXT: s_setpc_b64 s[30:31]
70
- %shift.amt = load i64 , ptr %arg1.ptr , !range !3 , !noundef !{}
28
+ %shift.amt = load i64 , ptr %arg1.ptr , !range !0
71
29
%shl = shl i64 %arg0 , %shift.amt
72
30
ret i64 %shl
73
31
}
74
32
75
- ; FIXME: This case should be reduced
76
33
define <2 x i64 > @shl_v2_metadata (<2 x i64 > %arg0 , ptr %arg1.ptr ) {
77
34
; CHECK-LABEL: shl_v2_metadata:
78
35
; CHECK: ; %bb.0:
@@ -82,12 +39,11 @@ define <2 x i64> @shl_v2_metadata(<2 x i64> %arg0, ptr %arg1.ptr) {
82
39
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v4, v[0:1]
83
40
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v6, v[2:3]
84
41
; CHECK-NEXT: s_setpc_b64 s[30:31]
85
- %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
42
+ %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0
86
43
%shl = shl <2 x i64 > %arg0 , %shift.amt
87
44
ret <2 x i64 > %shl
88
45
}
89
46
90
- ; FIXME: This case should be reduced
91
47
define <3 x i64 > @shl_v3_metadata (<3 x i64 > %arg0 , ptr %arg1.ptr ) {
92
48
; CHECK-LABEL: shl_v3_metadata:
93
49
; CHECK: ; %bb.0:
@@ -99,12 +55,11 @@ define <3 x i64> @shl_v3_metadata(<3 x i64> %arg0, ptr %arg1.ptr) {
99
55
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v8, v[0:1]
100
56
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v10, v[2:3]
101
57
; CHECK-NEXT: s_setpc_b64 s[30:31]
102
- %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
58
+ %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0
103
59
%shl = shl <3 x i64 > %arg0 , %shift.amt
104
60
ret <3 x i64 > %shl
105
61
}
106
62
107
- ; FIXME: This case should be reduced
108
63
define <4 x i64 > @shl_v4_metadata (<4 x i64 > %arg0 , ptr %arg1.ptr ) {
109
64
; CHECK-LABEL: shl_v4_metadata:
110
65
; CHECK: ; %bb.0:
@@ -119,15 +74,12 @@ define <4 x i64> @shl_v4_metadata(<4 x i64> %arg0, ptr %arg1.ptr) {
119
74
; CHECK-NEXT: v_lshlrev_b64 v[4:5], v13, v[4:5]
120
75
; CHECK-NEXT: v_lshlrev_b64 v[6:7], v15, v[6:7]
121
76
; CHECK-NEXT: s_setpc_b64 s[30:31]
122
- %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
77
+ %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0
123
78
%shl = shl <4 x i64 > %arg0 , %shift.amt
124
79
ret <4 x i64 > %shl
125
80
}
126
81
127
82
!0 = !{i64 32 , i64 64 }
128
- !1 = !{i64 32 , i64 38 , i64 42 , i64 48 }
129
- !2 = !{i64 31 , i64 38 , i64 42 , i64 48 }
130
- !3 = !{i64 32 , i64 38 , i64 2147483680 , i64 2147483681 }
131
83
132
84
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133
85
; Test range with an "or X, 16"
0 commit comments