brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 3fd2f24 Raw
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