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
-
20
16
define i64 @shl_metadata (i64 %arg0 , ptr %arg1.ptr ) {
21
17
; CHECK-LABEL: shl_metadata:
22
18
; CHECK: ; %bb.0:
23
19
; 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)
24
66
; CHECK-NEXT: flat_load_dword v2, v[2:3]
25
67
; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
26
68
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v2, v[0:1]
27
69
; CHECK-NEXT: s_setpc_b64 s[30:31]
28
- %shift.amt = load i64 , ptr %arg1.ptr , !range !0
70
+ %shift.amt = load i64 , ptr %arg1.ptr , !range !3 , !noundef !{}
29
71
%shl = shl i64 %arg0 , %shift.amt
30
72
ret i64 %shl
31
73
}
32
74
75
+ ; FIXME: This case should be reduced
33
76
define <2 x i64 > @shl_v2_metadata (<2 x i64 > %arg0 , ptr %arg1.ptr ) {
34
77
; CHECK-LABEL: shl_v2_metadata:
35
78
; CHECK: ; %bb.0:
@@ -39,11 +82,12 @@ define <2 x i64> @shl_v2_metadata(<2 x i64> %arg0, ptr %arg1.ptr) {
39
82
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v4, v[0:1]
40
83
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v6, v[2:3]
41
84
; CHECK-NEXT: s_setpc_b64 s[30:31]
42
- %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0
85
+ %shift.amt = load <2 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
43
86
%shl = shl <2 x i64 > %arg0 , %shift.amt
44
87
ret <2 x i64 > %shl
45
88
}
46
89
90
+ ; FIXME: This case should be reduced
47
91
define <3 x i64 > @shl_v3_metadata (<3 x i64 > %arg0 , ptr %arg1.ptr ) {
48
92
; CHECK-LABEL: shl_v3_metadata:
49
93
; CHECK: ; %bb.0:
@@ -55,11 +99,12 @@ define <3 x i64> @shl_v3_metadata(<3 x i64> %arg0, ptr %arg1.ptr) {
55
99
; CHECK-NEXT: v_lshlrev_b64 v[0:1], v8, v[0:1]
56
100
; CHECK-NEXT: v_lshlrev_b64 v[2:3], v10, v[2:3]
57
101
; CHECK-NEXT: s_setpc_b64 s[30:31]
58
- %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0
102
+ %shift.amt = load <3 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
59
103
%shl = shl <3 x i64 > %arg0 , %shift.amt
60
104
ret <3 x i64 > %shl
61
105
}
62
106
107
+ ; FIXME: This case should be reduced
63
108
define <4 x i64 > @shl_v4_metadata (<4 x i64 > %arg0 , ptr %arg1.ptr ) {
64
109
; CHECK-LABEL: shl_v4_metadata:
65
110
; CHECK: ; %bb.0:
@@ -74,12 +119,15 @@ define <4 x i64> @shl_v4_metadata(<4 x i64> %arg0, ptr %arg1.ptr) {
74
119
; CHECK-NEXT: v_lshlrev_b64 v[4:5], v13, v[4:5]
75
120
; CHECK-NEXT: v_lshlrev_b64 v[6:7], v15, v[6:7]
76
121
; CHECK-NEXT: s_setpc_b64 s[30:31]
77
- %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0
122
+ %shift.amt = load <4 x i64 >, ptr %arg1.ptr , !range !0 , !noundef !{}
78
123
%shl = shl <4 x i64 > %arg0 , %shift.amt
79
124
ret <4 x i64 > %shl
80
125
}
81
126
82
127
!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 }
83
131
84
132
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85
133
; Test range with an "or X, 16"
0 commit comments