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