@@ -63,18 +63,17 @@ define i32 @multiple_live2(i32 %x, i32 %y) {
6363 ret i32 %y
6464}
6565
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 (
6868; CHECK-SAME: ptr [[X:%.*]]) {
69- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[X]], i64 8) ]
7069; CHECK-NEXT: ret void
7170;
7271 call void @llvm.assume (i1 true ) ["align" (ptr %x , i64 8 )]
7372 ret void
7473}
7574
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 (
7877; CHECK-SAME: ptr [[X:%.*]]) {
7978; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[X]], i64 8) ]
8079; CHECK-NEXT: ret ptr [[X]]
@@ -83,6 +82,93 @@ define ptr @operand_bundle_live(ptr %x) {
8382 ret ptr %x
8483}
8584
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+
86172define void @type_test (ptr %x ) {
87173; CHECK-LABEL: define void @type_test(
88174; CHECK-SAME: ptr [[X:%.*]]) {
0 commit comments