@@ -63,18 +63,17 @@ define i32 @multiple_live2(i32 %x, i32 %y) {
63
63
ret i32 %y
64
64
}
65
65
66
- define void @operand_bundle_dead (ptr %x ) {
67
- ; CHECK-LABEL: define void @operand_bundle_dead (
66
+ define void @operand_bundle_one_dead (ptr %x ) {
67
+ ; CHECK-LABEL: define void @operand_bundle_one_dead (
68
68
; CHECK-SAME: ptr [[X:%.*]]) {
69
- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[X]], i64 8) ]
70
69
; CHECK-NEXT: ret void
71
70
;
72
71
call void @llvm.assume (i1 true ) ["align" (ptr %x , i64 8 )]
73
72
ret void
74
73
}
75
74
76
- define ptr @operand_bundle_live (ptr %x ) {
77
- ; CHECK-LABEL: define ptr @operand_bundle_live (
75
+ define ptr @operand_bundle_one_live (ptr %x ) {
76
+ ; CHECK-LABEL: define ptr @operand_bundle_one_live (
78
77
; CHECK-SAME: ptr [[X:%.*]]) {
79
78
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[X]], i64 8) ]
80
79
; CHECK-NEXT: ret ptr [[X]]
@@ -83,6 +82,93 @@ define ptr @operand_bundle_live(ptr %x) {
83
82
ret ptr %x
84
83
}
85
84
85
+ define void @operand_bundle_multiple_dead (ptr %x , ptr %y ) {
86
+ ; CHECK-LABEL: define void @operand_bundle_multiple_dead(
87
+ ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
88
+ ; CHECK-NEXT: ret void
89
+ ;
90
+ call void @llvm.assume (i1 true ) ["align" (ptr %x , i64 8 ), "align" (ptr %y , i64 8 )]
91
+ ret void
92
+ }
93
+
94
+ define ptr @operand_bundle_one_live_one_dead (ptr %x , ptr %y ) {
95
+ ; CHECK-LABEL: define ptr @operand_bundle_one_live_one_dead(
96
+ ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
97
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[Y]], i64 8) ]
98
+ ; CHECK-NEXT: ret ptr [[Y]]
99
+ ;
100
+ call void @llvm.assume (i1 true ) ["align" (ptr %x , i64 8 ), "align" (ptr %y , i64 8 )]
101
+ ret ptr %y
102
+ }
103
+
104
+ define i64 @operand_bundle_ignore_unaffected_operands (ptr %x , i64 %align ) {
105
+ ; CHECK-LABEL: define i64 @operand_bundle_ignore_unaffected_operands(
106
+ ; CHECK-SAME: ptr [[X:%.*]], i64 [[ALIGN:%.*]]) {
107
+ ; CHECK-NEXT: ret i64 [[ALIGN]]
108
+ ;
109
+ call void @llvm.assume (i1 true ) ["align" (ptr %x , i64 %align )]
110
+ ret i64 %align
111
+ }
112
+
113
+ define void @operand_bundle_remove_dead_insts (ptr %x ) {
114
+ ; CHECK-LABEL: define void @operand_bundle_remove_dead_insts(
115
+ ; CHECK-SAME: ptr [[X:%.*]]) {
116
+ ; CHECK-NEXT: ret void
117
+ ;
118
+ %gep = getelementptr i8 , ptr %x , i64 8
119
+ call void @llvm.assume (i1 true ) ["align" (ptr %gep , i64 8 )]
120
+ ret void
121
+ }
122
+
123
+ define void @operand_bundle_no_args () {
124
+ ; CHECK-LABEL: define void @operand_bundle_no_args() {
125
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "cold"() ]
126
+ ; CHECK-NEXT: ret void
127
+ ;
128
+ call void @llvm.assume (i1 true ) ["cold" ()]
129
+ ret void
130
+ }
131
+
132
+ ; Can always drop ignore bundles, regardless of uses.
133
+ define ptr @operand_bundle_ignore (ptr %x ) {
134
+ ; CHECK-LABEL: define ptr @operand_bundle_ignore(
135
+ ; CHECK-SAME: ptr [[X:%.*]]) {
136
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[X]]) ]
137
+ ; CHECK-NEXT: ret ptr [[X]]
138
+ ;
139
+ call void @llvm.assume (i1 true ) ["ignore" (), "ignore" (ptr %x ), "nonnull" (ptr %x )]
140
+ ret ptr %x
141
+ }
142
+
143
+ define void @operand_bundle_separate_storage_both_dead (ptr %x , ptr %y ) {
144
+ ; CHECK-LABEL: define void @operand_bundle_separate_storage_both_dead(
145
+ ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
146
+ ; CHECK-NEXT: ret void
147
+ ;
148
+ call void @llvm.assume (i1 true ) ["separate_storage" (ptr %x , ptr %y )]
149
+ ret void
150
+ }
151
+
152
+ define ptr @operand_bundle_separate_storage_one_live1 (ptr %x , ptr %y ) {
153
+ ; CHECK-LABEL: define ptr @operand_bundle_separate_storage_one_live1(
154
+ ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
155
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "separate_storage"(ptr [[X]], ptr [[Y]]) ]
156
+ ; CHECK-NEXT: ret ptr [[Y]]
157
+ ;
158
+ call void @llvm.assume (i1 true ) ["separate_storage" (ptr %x , ptr %y )]
159
+ ret ptr %y
160
+ }
161
+
162
+ define ptr @operand_bundle_separate_storage_one_live2 (ptr %x , ptr %y ) {
163
+ ; CHECK-LABEL: define ptr @operand_bundle_separate_storage_one_live2(
164
+ ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
165
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "separate_storage"(ptr [[X]], ptr [[Y]]) ]
166
+ ; CHECK-NEXT: ret ptr [[X]]
167
+ ;
168
+ call void @llvm.assume (i1 true ) ["separate_storage" (ptr %x , ptr %y )]
169
+ ret ptr %x
170
+ }
171
+
86
172
define void @type_test (ptr %x ) {
87
173
; CHECK-LABEL: define void @type_test(
88
174
; CHECK-SAME: ptr [[X:%.*]]) {
0 commit comments