469 lines · plain
1; Test conditional sibling calls.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5 6@var = global i32 1;7@fun_a = global ptr null;8@fun_b = global ptr null;9@fun_c = global ptr null;10 11; Check a conditional sibling call.12define void @f1(i32 %val1, i32 %val2) {13; CHECK-LABEL: f1:14; CHECK: crbl %r2, %r3, 0(%r1)15; CHECK: br %r1416 %fun_a = load volatile ptr, ptr @fun_a;17 %cond = icmp slt i32 %val1, %val2;18 br i1 %cond, label %a, label %b;19 20a:21 tail call void %fun_a()22 ret void23 24b:25 store i32 1, ptr@var;26 ret void27}28 29; Check a conditional sibling call when there are two possibilities.30define void @f2(i32 %val1, i32 %val2) {31; CHECK-LABEL: f2:32; CHECK: crbl %r2, %r3, 0(%r1)33; CHECK: br %r134 %fun_a = load volatile ptr, ptr @fun_a;35 %fun_b = load volatile ptr, ptr @fun_b;36 %cond = icmp slt i32 %val1, %val2;37 br i1 %cond, label %a, label %b;38 39a:40 tail call void %fun_a()41 ret void42 43b:44 tail call void %fun_b()45 ret void46}47 48; Check a conditional sibling call with an argument - not supported.49define void @f3(i32 %val1, i32 %val2) {50; CHECK-LABEL: f3:51; CHECK: crjhe %r2, %r352; CHECK: br %r153; CHECK: br %r1454 %fun_c = load volatile ptr, ptr @fun_c;55 %cond = icmp slt i32 %val1, %val2;56 br i1 %cond, label %a, label %b;57 58a:59 tail call void %fun_c(i32 1)60 ret void61 62b:63 store i32 1, ptr@var;64 ret void65}66 67; Check a conditional sibling call - unsigned compare.68define void @f4(i32 %val1, i32 %val2) {69; CHECK-LABEL: f4:70; CHECK: clrbl %r2, %r3, 0(%r1)71; CHECK: br %r1472 %fun_a = load volatile ptr, ptr @fun_a;73 %cond = icmp ult i32 %val1, %val2;74 br i1 %cond, label %a, label %b;75 76a:77 tail call void %fun_a()78 ret void79 80b:81 store i32 1, ptr@var;82 ret void83}84 85; Check a conditional sibling call - 64-bit compare.86define void @f5(i64 %val1, i64 %val2) {87; CHECK-LABEL: f5:88; CHECK: cgrbl %r2, %r3, 0(%r1)89; CHECK: br %r1490 %fun_a = load volatile ptr, ptr @fun_a;91 %cond = icmp slt i64 %val1, %val2;92 br i1 %cond, label %a, label %b;93 94a:95 tail call void %fun_a()96 ret void97 98b:99 store i32 1, ptr@var;100 ret void101}102 103; Check a conditional sibling call - unsigned 64-bit compare.104define void @f6(i64 %val1, i64 %val2) {105; CHECK-LABEL: f6:106; CHECK: clgrbl %r2, %r3, 0(%r1)107; CHECK: br %r14108 %fun_a = load volatile ptr, ptr @fun_a;109 %cond = icmp ult i64 %val1, %val2;110 br i1 %cond, label %a, label %b;111 112a:113 tail call void %fun_a()114 ret void115 116b:117 store i32 1, ptr@var;118 ret void119}120 121; Check a conditional sibling call - less-equal compare.122define void @f7(i32 %val1, i32 %val2) {123; CHECK-LABEL: f7:124; CHECK: crble %r2, %r3, 0(%r1)125; CHECK: br %r14126 %fun_a = load volatile ptr, ptr @fun_a;127 %cond = icmp sle i32 %val1, %val2;128 br i1 %cond, label %a, label %b;129 130a:131 tail call void %fun_a()132 ret void133 134b:135 store i32 1, ptr@var;136 ret void137}138 139; Check a conditional sibling call - high compare.140define void @f8(i32 %val1, i32 %val2) {141; CHECK-LABEL: f8:142; CHECK: crbh %r2, %r3, 0(%r1)143; CHECK: br %r14144 %fun_a = load volatile ptr, ptr @fun_a;145 %cond = icmp sgt i32 %val1, %val2;146 br i1 %cond, label %a, label %b;147 148a:149 tail call void %fun_a()150 ret void151 152b:153 store i32 1, ptr@var;154 ret void155}156 157; Check a conditional sibling call - high-equal compare.158define void @f9(i32 %val1, i32 %val2) {159; CHECK-LABEL: f9:160; CHECK: crbhe %r2, %r3, 0(%r1)161; CHECK: br %r14162 %fun_a = load volatile ptr, ptr @fun_a;163 %cond = icmp sge i32 %val1, %val2;164 br i1 %cond, label %a, label %b;165 166a:167 tail call void %fun_a()168 ret void169 170b:171 store i32 1, ptr@var;172 ret void173}174 175; Check a conditional sibling call - equal compare.176define void @f10(i32 %val1, i32 %val2) {177; CHECK-LABEL: f10:178; CHECK: crbe %r2, %r3, 0(%r1)179; CHECK: br %r14180 %fun_a = load volatile ptr, ptr @fun_a;181 %cond = icmp eq i32 %val1, %val2;182 br i1 %cond, label %a, label %b;183 184a:185 tail call void %fun_a()186 ret void187 188b:189 store i32 1, ptr@var;190 ret void191}192 193; Check a conditional sibling call - unequal compare.194define void @f11(i32 %val1, i32 %val2) {195; CHECK-LABEL: f11:196; CHECK: crblh %r2, %r3, 0(%r1)197; CHECK: br %r14198 %fun_a = load volatile ptr, ptr @fun_a;199 %cond = icmp ne i32 %val1, %val2;200 br i1 %cond, label %a, label %b;201 202a:203 tail call void %fun_a()204 ret void205 206b:207 store i32 1, ptr@var;208 ret void209}210 211; Check a conditional sibling call - immediate slt.212define void @f12(i32 %val1) {213; CHECK-LABEL: f12:214; CHECK: cible %r2, 4, 0(%r1)215; CHECK: br %r14216 %fun_a = load volatile ptr, ptr @fun_a;217 %cond = icmp slt i32 %val1, 5;218 br i1 %cond, label %a, label %b;219 220a:221 tail call void %fun_a()222 ret void223 224b:225 store i32 1, ptr@var;226 ret void227}228 229; Check a conditional sibling call - immediate sle.230define void @f13(i32 %val1) {231; CHECK-LABEL: f13:232; CHECK: cible %r2, 5, 0(%r1)233; CHECK: br %r14234 %fun_a = load volatile ptr, ptr @fun_a;235 %cond = icmp sle i32 %val1, 5;236 br i1 %cond, label %a, label %b;237 238a:239 tail call void %fun_a()240 ret void241 242b:243 store i32 1, ptr@var;244 ret void245}246 247; Check a conditional sibling call - immediate sgt.248define void @f14(i32 %val1) {249; CHECK-LABEL: f14:250; CHECK: cibhe %r2, 6, 0(%r1)251; CHECK: br %r14252 %fun_a = load volatile ptr, ptr @fun_a;253 %cond = icmp sgt i32 %val1, 5;254 br i1 %cond, label %a, label %b;255 256a:257 tail call void %fun_a()258 ret void259 260b:261 store i32 1, ptr@var;262 ret void263}264 265; Check a conditional sibling call - immediate sge.266define void @f15(i32 %val1) {267; CHECK-LABEL: f15:268; CHECK: cibhe %r2, 5, 0(%r1)269; CHECK: br %r14270 %fun_a = load volatile ptr, ptr @fun_a;271 %cond = icmp sge i32 %val1, 5;272 br i1 %cond, label %a, label %b;273 274a:275 tail call void %fun_a()276 ret void277 278b:279 store i32 1, ptr@var;280 ret void281}282 283; Check a conditional sibling call - immediate eq.284define void @f16(i32 %val1) {285; CHECK-LABEL: f16:286; CHECK: cibe %r2, 5, 0(%r1)287; CHECK: br %r14288 %fun_a = load volatile ptr, ptr @fun_a;289 %cond = icmp eq i32 %val1, 5;290 br i1 %cond, label %a, label %b;291 292a:293 tail call void %fun_a()294 ret void295 296b:297 store i32 1, ptr@var;298 ret void299}300 301; Check a conditional sibling call - immediate ne.302define void @f17(i32 %val1) {303; CHECK-LABEL: f17:304; CHECK: ciblh %r2, 5, 0(%r1)305; CHECK: br %r14306 %fun_a = load volatile ptr, ptr @fun_a;307 %cond = icmp ne i32 %val1, 5;308 br i1 %cond, label %a, label %b;309 310a:311 tail call void %fun_a()312 ret void313 314b:315 store i32 1, ptr@var;316 ret void317}318 319; Check a conditional sibling call - immediate ult.320define void @f18(i32 %val1) {321; CHECK-LABEL: f18:322; CHECK: clible %r2, 4, 0(%r1)323; CHECK: br %r14324 %fun_a = load volatile ptr, ptr @fun_a;325 %cond = icmp ult i32 %val1, 5;326 br i1 %cond, label %a, label %b;327 328a:329 tail call void %fun_a()330 ret void331 332b:333 store i32 1, ptr@var;334 ret void335}336 337; Check a conditional sibling call - immediate 64-bit slt.338define void @f19(i64 %val1) {339; CHECK-LABEL: f19:340; CHECK: cgible %r2, 4, 0(%r1)341; CHECK: br %r14342 %fun_a = load volatile ptr, ptr @fun_a;343 %cond = icmp slt i64 %val1, 5;344 br i1 %cond, label %a, label %b;345 346a:347 tail call void %fun_a()348 ret void349 350b:351 store i32 1, ptr@var;352 ret void353}354 355; Check a conditional sibling call - immediate 64-bit ult.356define void @f20(i64 %val1) {357; CHECK-LABEL: f20:358; CHECK: clgible %r2, 4, 0(%r1)359; CHECK: br %r14360 %fun_a = load volatile ptr, ptr @fun_a;361 %cond = icmp ult i64 %val1, 5;362 br i1 %cond, label %a, label %b;363 364a:365 tail call void %fun_a()366 ret void367 368b:369 store i32 1, ptr@var;370 ret void371}372 373; Check a conditional sibling call to an argument - will fail due to374; intervening lgr.375define void @f21(i32 %val1, i32 %val2, ptr %fun) {376; CHECK-LABEL: f21:377; CHECK: crjhe %r2, %r3378; CHECK: lgr %r1, %r4379; CHECK: br %r1380; CHECK: br %r14381 %cond = icmp slt i32 %val1, %val2;382 br i1 %cond, label %a, label %b;383 384a:385 tail call void %fun()386 ret void387 388b:389 store i32 1, ptr@var;390 ret void391}392 393; Check a conditional sibling call - float olt compare.394define void @f22(float %val1, float %val2) {395; CHECK-LABEL: f22:396; CHECK: cebr %f0, %f2397; CHECK: blr %r1398; CHECK: br %r14399 %fun_a = load volatile ptr, ptr @fun_a;400 %cond = fcmp olt float %val1, %val2;401 br i1 %cond, label %a, label %b;402 403a:404 tail call void %fun_a()405 ret void406 407b:408 store i32 1, ptr@var;409 ret void410}411 412; Check a conditional sibling call - float ult compare.413define void @f23(float %val1, float %val2) {414; CHECK-LABEL: f23:415; CHECK: cebr %f0, %f2416; CHECK: bnher %r1417; CHECK: br %r14418 %fun_a = load volatile ptr, ptr @fun_a;419 %cond = fcmp ult float %val1, %val2;420 br i1 %cond, label %a, label %b;421 422a:423 tail call void %fun_a()424 ret void425 426b:427 store i32 1, ptr@var;428 ret void429}430 431; Check a conditional sibling call - float ord compare.432define void @f24(float %val1, float %val2) {433; CHECK-LABEL: f24:434; CHECK: cebr %f0, %f2435; CHECK: bnor %r1436; CHECK: br %r14437 %fun_a = load volatile ptr, ptr @fun_a;438 %cond = fcmp ord float %val1, %val2;439 br i1 %cond, label %a, label %b;440 441a:442 tail call void %fun_a()443 ret void444 445b:446 store i32 1, ptr@var;447 ret void448}449 450; Check a conditional sibling call - float uno compare.451define void @f25(float %val1, float %val2) {452; CHECK-LABEL: f25:453; CHECK: cebr %f0, %f2454; CHECK: jo455; CHECK: br %r14456; CHECK: br %r1457 %fun_a = load volatile ptr, ptr @fun_a;458 %cond = fcmp uno float %val1, %val2;459 br i1 %cond, label %a, label %b;460 461a:462 tail call void %fun_a()463 ret void464 465b:466 store i32 1, ptr@var;467 ret void468}469