brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 324ba0e Raw
191 lines · plain
1; Test all condition-code masks that are relevant for CRJ.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i32 @foo()6@g1 = dso_local global i16 07 8define dso_local void @f1(i32 %target) {9; CHECK-LABEL: f1:10; CHECK: .cfi_def_cfa_offset11; CHECK: .L[[LABEL:.*]]:12; CHECK: crje %r2, {{%r[0-9]+}}, .L[[LABEL]]13  br label %loop14loop:15  %val = call i32 @foo()16  %cond = icmp eq i32 %val, %target17  br i1 %cond, label %loop, label %exit18exit:19  ret void20}21 22define dso_local void @f2(i32 %target) {23; CHECK-LABEL: f2:24; CHECK: .cfi_def_cfa_offset25; CHECK: .L[[LABEL:.*]]:26; CHECK: crjlh %r2, {{%r[0-9]+}}, .L[[LABEL]]27  br label %loop28loop:29  %val = call i32 @foo()30  %cond = icmp ne i32 %val, %target31  br i1 %cond, label %loop, label %exit32exit:33  ret void34}35 36define dso_local void @f3(i32 %target) {37; CHECK-LABEL: f3:38; CHECK: .cfi_def_cfa_offset39; CHECK: .L[[LABEL:.*]]:40; CHECK: crjle %r2, {{%r[0-9]+}}, .L[[LABEL]]41  br label %loop42loop:43  %val = call i32 @foo()44  %cond = icmp sle i32 %val, %target45  br i1 %cond, label %loop, label %exit46exit:47  ret void48}49 50define dso_local void @f4(i32 %target) {51; CHECK-LABEL: f4:52; CHECK: .cfi_def_cfa_offset53; CHECK: .L[[LABEL:.*]]:54; CHECK: crjl %r2, {{%r[0-9]+}}, .L[[LABEL]]55  br label %loop56loop:57  %val = call i32 @foo()58  %cond = icmp slt i32 %val, %target59  br i1 %cond, label %loop, label %exit60exit:61  ret void62}63 64define dso_local void @f5(i32 %target) {65; CHECK-LABEL: f5:66; CHECK: .cfi_def_cfa_offset67; CHECK: .L[[LABEL:.*]]:68; CHECK: crjh %r2, {{%r[0-9]+}}, .L[[LABEL]]69  br label %loop70loop:71  %val = call i32 @foo()72  %cond = icmp sgt i32 %val, %target73  br i1 %cond, label %loop, label %exit74exit:75  ret void76}77 78define dso_local void @f6(i32 %target) {79; CHECK-LABEL: f6:80; CHECK: .cfi_def_cfa_offset81; CHECK: .L[[LABEL:.*]]:82; CHECK: crjhe %r2, {{%r[0-9]+}}, .L[[LABEL]]83  br label %loop84loop:85  %val = call i32 @foo()86  %cond = icmp sge i32 %val, %target87  br i1 %cond, label %loop, label %exit88exit:89  ret void90}91 92; Check that CRJ is used for checking equality with a zero-extending93; character load.94define dso_local void @f7(ptr %targetptr) {95; CHECK-LABEL: f7:96; CHECK: .cfi_def_cfa_offset97; CHECK: .L[[LABEL:.*]]:98; CHECK: llc [[REG:%r[0-5]]],99; CHECK: crje %r2, [[REG]], .L[[LABEL]]100  br label %loop101loop:102  %val = call i32 @foo()103  %byte = load i8, ptr %targetptr104  %target = zext i8 %byte to i32105  %cond = icmp eq i32 %val, %target106  br i1 %cond, label %loop, label %exit107exit:108  ret void109}110 111; ...and zero-extending i16 loads.112define dso_local void @f8(ptr %targetptr) {113; CHECK-LABEL: f8:114; CHECK: .cfi_def_cfa_offset115; CHECK: .L[[LABEL:.*]]:116; CHECK: llh [[REG:%r[0-5]]],117; CHECK: crje %r2, [[REG]], .L[[LABEL]]118  br label %loop119loop:120  %val = call i32 @foo()121  %half = load i16, ptr %targetptr122  %target = zext i16 %half to i32123  %cond = icmp eq i32 %val, %target124  br i1 %cond, label %loop, label %exit125exit:126  ret void127}128 129; ...unless the address is a global.130define dso_local void @f9(ptr %targetptr) {131; CHECK-LABEL: f9:132; CHECK: .cfi_def_cfa_offset133; CHECK: .L[[LABEL:.*]]:134; CHECK: clhrl %r2, g1135; CHECK: je .L[[LABEL]]136  br label %loop137loop:138  %val = call i32 @foo()139  %half = load i16, ptr@g1140  %target = zext i16 %half to i32141  %cond = icmp eq i32 %val, %target142  br i1 %cond, label %loop, label %exit143exit:144  ret void145}146 147; Check that CRJ is used for checking order between two zero-extending148; byte loads, even if the original comparison was unsigned.149define dso_local void @f10(ptr %targetptr1) {150; CHECK-LABEL: f10:151; CHECK: .cfi_def_cfa_offset152; CHECK: .L[[LABEL:.*]]:153; CHECK-DAG: llc [[REG1:%r[0-5]]], 0(154; CHECK-DAG: llc [[REG2:%r[0-5]]], 1(155; CHECK: crjl [[REG1]], [[REG2]], .L[[LABEL]]156  br label %loop157loop:158  %val = call i32 @foo()159  %targetptr2 = getelementptr i8, ptr %targetptr1, i64 1160  %byte1 = load i8, ptr %targetptr1161  %byte2 = load i8, ptr %targetptr2162  %ext1 = zext i8 %byte1 to i32163  %ext2 = zext i8 %byte2 to i32164  %cond = icmp ult i32 %ext1, %ext2165  br i1 %cond, label %loop, label %exit166exit:167  ret void168}169 170; ...likewise halfword loads.171define dso_local void @f11(ptr %targetptr1) {172; CHECK-LABEL: f11:173; CHECK: .cfi_def_cfa_offset174; CHECK: .L[[LABEL:.*]]:175; CHECK-DAG: llh [[REG1:%r[0-5]]], 0(176; CHECK-DAG: llh [[REG2:%r[0-5]]], 2(177; CHECK: crjl [[REG1]], [[REG2]], .L[[LABEL]]178  br label %loop179loop:180  %val = call i32 @foo()181  %targetptr2 = getelementptr i16, ptr %targetptr1, i64 1182  %half1 = load i16, ptr %targetptr1183  %half2 = load i16, ptr %targetptr2184  %ext1 = zext i16 %half1 to i32185  %ext2 = zext i16 %half2 to i32186  %cond = icmp ult i32 %ext1, %ext2187  br i1 %cond, label %loop, label %exit188exit:189  ret void190}191