129 lines · plain
1; Test LOCR and LOCGR.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 -verify-machineinstrs | FileCheck %s4;5; Run the test again to make sure it still works the same even6; in the presence of the load-store-on-condition-2 facility.7; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 -verify-machineinstrs | FileCheck %s8;9; And again in the presence of the select instructions.10; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 -verify-machineinstrs | FileCheck %s11 12; Test LOCR.13define i32 @f1(i32 %a, i32 %b, i32 %limit) {14; CHECK-LABEL: f1:15; CHECK: clfi %r4, 4216; CHECK: locrhe %r2, %r317; CHECK: br %r1418 %cond = icmp ult i32 %limit, 4219 %res = select i1 %cond, i32 %a, i32 %b20 ret i32 %res21}22 23; Test LOCGR.24define i64 @f2(i64 %a, i64 %b, i64 %limit) {25; CHECK-LABEL: f2:26; CHECK: clgfi %r4, 4227; CHECK: locgrhe %r2, %r328; CHECK: br %r1429 %cond = icmp ult i64 %limit, 4230 %res = select i1 %cond, i64 %a, i64 %b31 ret i64 %res32}33 34; Test LOCR in a case that could use COMPARE AND BRANCH. We prefer using35; LOCR if possible.36define i32 @f3(i32 %a, i32 %b, i32 %limit) {37; CHECK-LABEL: f3:38; CHECK: chi %r4, 4239; CHECK: locrlh %r2, %r340; CHECK: br %r1441 %cond = icmp eq i32 %limit, 4242 %res = select i1 %cond, i32 %a, i32 %b43 ret i32 %res44}45 46; ...and again for LOCGR.47define i64 @f4(i64 %a, i64 %b, i64 %limit) {48; CHECK-LABEL: f4:49; CHECK: cghi %r4, 4250; CHECK: locgrlh %r2, %r351; CHECK: br %r1452 %cond = icmp eq i64 %limit, 4253 %res = select i1 %cond, i64 %a, i64 %b54 ret i64 %res55}56 57; Check that we also get LOCR as a result of early if-conversion.58define i32 @f5(i32 %a, i32 %b, i32 %limit) {59; CHECK-LABEL: f5:60; CHECK: clfi %r4, 4161; CHECK: locrh %r2, %r362; CHECK: br %r1463entry:64 %cond = icmp ult i32 %limit, 4265 br i1 %cond, label %if.then, label %return66 67if.then:68 br label %return69 70return:71 %res = phi i32 [ %a, %if.then ], [ %b, %entry ]72 ret i32 %res73}74 75; ... and likewise for LOCGR.76define i64 @f6(i64 %a, i64 %b, i64 %limit) {77; CHECK-LABEL: f6:78; CHECK: clgfi %r4, 4179; CHECK: locgrh %r2, %r380; CHECK: br %r1481entry:82 %cond = icmp ult i64 %limit, 4283 br i1 %cond, label %if.then, label %return84 85if.then:86 br label %return87 88return:89 %res = phi i64 [ %a, %if.then ], [ %b, %entry ]90 ret i64 %res91}92 93; Check that inverting the condition works as well.94define i32 @f7(i32 %a, i32 %b, i32 %limit) {95; CHECK-LABEL: f7:96; CHECK: clfi %r4, 4197; CHECK: locrle %r2, %r398; CHECK: br %r1499entry:100 %cond = icmp ult i32 %limit, 42101 br i1 %cond, label %if.then, label %return102 103if.then:104 br label %return105 106return:107 %res = phi i32 [ %b, %if.then ], [ %a, %entry ]108 ret i32 %res109}110 111; ... and likewise for LOCGR.112define i64 @f8(i64 %a, i64 %b, i64 %limit) {113; CHECK-LABEL: f8:114; CHECK: clgfi %r4, 41115; CHECK: locgrle %r2, %r3116; CHECK: br %r14117entry:118 %cond = icmp ult i64 %limit, 42119 br i1 %cond, label %if.then, label %return120 121if.then:122 br label %return123 124return:125 %res = phi i64 [ %b, %if.then ], [ %a, %entry ]126 ret i64 %res127}128 129