brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · c6b0cd5 Raw
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