197 lines · plain
1; Test 32-bit signed comparison in which the second operand is a variable.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i32 @foo()6 7; Check register comparison.8define double @f1(double %a, double %b, i32 %i1, i32 %i2) {9; CHECK-LABEL: f1:10; CHECK: crbl %r2, %r3, 0(%r14)11; CHECK: ldr %f0, %f212; CHECK: br %r1413 %cond = icmp slt i32 %i1, %i214 %res = select i1 %cond, double %a, double %b15 ret double %res16}17 18; Check the low end of the C range.19define double @f2(double %a, double %b, i32 %i1, ptr %ptr) {20; CHECK-LABEL: f2:21; CHECK: c %r2, 0(%r3)22; CHECK-NEXT: blr %r1423; CHECK: ldr %f0, %f224; CHECK: br %r1425 %i2 = load i32, ptr %ptr26 %cond = icmp slt i32 %i1, %i227 %res = select i1 %cond, double %a, double %b28 ret double %res29}30 31; Check the high end of the aligned C range.32define double @f3(double %a, double %b, i32 %i1, ptr %base) {33; CHECK-LABEL: f3:34; CHECK: c %r2, 4092(%r3)35; CHECK-NEXT: blr %r1436; CHECK: ldr %f0, %f237; CHECK: br %r1438 %ptr = getelementptr i32, ptr %base, i64 102339 %i2 = load i32, ptr %ptr40 %cond = icmp slt i32 %i1, %i241 %res = select i1 %cond, double %a, double %b42 ret double %res43}44 45; Check the next word up, which should use CY instead of C.46define double @f4(double %a, double %b, i32 %i1, ptr %base) {47; CHECK-LABEL: f4:48; CHECK: cy %r2, 4096(%r3)49; CHECK-NEXT: blr %r1450; CHECK: ldr %f0, %f251; CHECK: br %r1452 %ptr = getelementptr i32, ptr %base, i64 102453 %i2 = load i32, ptr %ptr54 %cond = icmp slt i32 %i1, %i255 %res = select i1 %cond, double %a, double %b56 ret double %res57}58 59; Check the high end of the aligned CY range.60define double @f5(double %a, double %b, i32 %i1, ptr %base) {61; CHECK-LABEL: f5:62; CHECK: cy %r2, 524284(%r3)63; CHECK-NEXT: blr %r1464; CHECK: ldr %f0, %f265; CHECK: br %r1466 %ptr = getelementptr i32, ptr %base, i64 13107167 %i2 = load i32, ptr %ptr68 %cond = icmp slt i32 %i1, %i269 %res = select i1 %cond, double %a, double %b70 ret double %res71}72 73; Check the next word up, which needs separate address logic.74; Other sequences besides this one would be OK.75define double @f6(double %a, double %b, i32 %i1, ptr %base) {76; CHECK-LABEL: f6:77; CHECK: agfi %r3, 52428878; CHECK: c %r2, 0(%r3)79; CHECK-NEXT: blr %r1480; CHECK: ldr %f0, %f281; CHECK: br %r1482 %ptr = getelementptr i32, ptr %base, i64 13107283 %i2 = load i32, ptr %ptr84 %cond = icmp slt i32 %i1, %i285 %res = select i1 %cond, double %a, double %b86 ret double %res87}88 89; Check the high end of the negative aligned CY range.90define double @f7(double %a, double %b, i32 %i1, ptr %base) {91; CHECK-LABEL: f7:92; CHECK: cy %r2, -4(%r3)93; CHECK-NEXT: blr %r1494; CHECK: ldr %f0, %f295; CHECK: br %r1496 %ptr = getelementptr i32, ptr %base, i64 -197 %i2 = load i32, ptr %ptr98 %cond = icmp slt i32 %i1, %i299 %res = select i1 %cond, double %a, double %b100 ret double %res101}102 103; Check the low end of the CY range.104define double @f8(double %a, double %b, i32 %i1, ptr %base) {105; CHECK-LABEL: f8:106; CHECK: cy %r2, -524288(%r3)107; CHECK-NEXT: blr %r14108; CHECK: ldr %f0, %f2109; CHECK: br %r14110 %ptr = getelementptr i32, ptr %base, i64 -131072111 %i2 = load i32, ptr %ptr112 %cond = icmp slt i32 %i1, %i2113 %res = select i1 %cond, double %a, double %b114 ret double %res115}116 117; Check the next word down, which needs separate address logic.118; Other sequences besides this one would be OK.119define double @f9(double %a, double %b, i32 %i1, ptr %base) {120; CHECK-LABEL: f9:121; CHECK: agfi %r3, -524292122; CHECK: c %r2, 0(%r3)123; CHECK-NEXT: blr %r14124; CHECK: ldr %f0, %f2125; CHECK: br %r14126 %ptr = getelementptr i32, ptr %base, i64 -131073127 %i2 = load i32, ptr %ptr128 %cond = icmp slt i32 %i1, %i2129 %res = select i1 %cond, double %a, double %b130 ret double %res131}132 133; Check that C allows an index.134define double @f10(double %a, double %b, i32 %i1, i64 %base, i64 %index) {135; CHECK-LABEL: f10:136; CHECK: c %r2, 4092({{%r4,%r3|%r3,%r4}})137; CHECK-NEXT: blr %r14138; CHECK: ldr %f0, %f2139; CHECK: br %r14140 %add1 = add i64 %base, %index141 %add2 = add i64 %add1, 4092142 %ptr = inttoptr i64 %add2 to ptr143 %i2 = load i32, ptr %ptr144 %cond = icmp slt i32 %i1, %i2145 %res = select i1 %cond, double %a, double %b146 ret double %res147}148 149; Check that CY allows an index.150define double @f11(double %a, double %b, i32 %i1, i64 %base, i64 %index) {151; CHECK-LABEL: f11:152; CHECK: cy %r2, 4096({{%r4,%r3|%r3,%r4}})153; CHECK-NEXT: blr %r14154; CHECK: ldr %f0, %f2155; CHECK: br %r14156 %add1 = add i64 %base, %index157 %add2 = add i64 %add1, 4096158 %ptr = inttoptr i64 %add2 to ptr159 %i2 = load i32, ptr %ptr160 %cond = icmp slt i32 %i1, %i2161 %res = select i1 %cond, double %a, double %b162 ret double %res163}164 165; The first branch here got recreated by insertBranch while splitting the166; critical edge %entry->%while.body, which lost the kills information for CC.167define void @f12(i32 %a, i32 %b) {168; CHECK-LABEL: f12:169; CHECK: cije %r2, 0170; CHECK: crjlh %r2,171; CHECK: br %r14172entry:173 %cmp11 = icmp eq i32 %a, 0174 br i1 %cmp11, label %while.end, label %while.body175 176while.body:177 %c = call i32 @foo()178 %cmp12 = icmp eq i32 %c, %b179 br i1 %cmp12, label %while.end, label %while.body180 181while.end:182 ret void183}184 185; Check the comparison can be reversed if that allows C to be used.186define double @f13(double %a, double %b, i32 %i2, ptr %ptr) {187; CHECK-LABEL: f13:188; CHECK: c %r2, 0(%r3)189; CHECK-NEXT: bhr %r14190; CHECK: ldr %f0, %f2191; CHECK: br %r14192 %i1 = load i32, ptr %ptr193 %cond = icmp slt i32 %i1, %i2194 %res = select i1 %cond, double %a, double %b195 ret double %res196}197