brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · d7f0f4e Raw
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