101 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s3;4; Test that a reload of a LOCGR/SELGR operand can be folded into a LOC5; instruction.6 7declare i64 @foo()8declare i32 @foo32()9 10; Check that conditional loads of spilled values can use LOCG rather than LOCGR.11define void @f0(ptr %ptr0, ptr %dstPtr) {12; CHECK-LABEL: f0:13; CHECK: brasl %r14, foo@PLT14; CHECK: locglh {{.*}} # 8-byte Folded Reload15; CHECK: br %r1416 %ptr1 = getelementptr i64, ptr %ptr0, i64 217 %ptr2 = getelementptr i64, ptr %ptr0, i64 418 %ptr3 = getelementptr i64, ptr %ptr0, i64 619 %ptr4 = getelementptr i64, ptr %ptr0, i64 820 %ptr5 = getelementptr i64, ptr %ptr0, i64 1021 %ptr6 = getelementptr i64, ptr %ptr0, i64 1222 %ptr7 = getelementptr i64, ptr %ptr0, i64 1423 %ptr8 = getelementptr i64, ptr %ptr0, i64 1624 %ptr9 = getelementptr i64, ptr %ptr0, i64 1825 26 %val0 = load i64, ptr %ptr027 %val1 = load i64, ptr %ptr128 %val2 = load i64, ptr %ptr229 %val3 = load i64, ptr %ptr330 %val4 = load i64, ptr %ptr431 %val5 = load i64, ptr %ptr532 %val6 = load i64, ptr %ptr633 %val7 = load i64, ptr %ptr734 %val8 = load i64, ptr %ptr835 %val9 = load i64, ptr %ptr936 37 %ret = call i64 @foo()38 39 %add0 = add i64 %ret, %val040 %add1 = add i64 %add0, %val141 %add2 = add i64 %add1, %val242 %add3 = add i64 %add2, %val343 %add4 = add i64 %add3, %val444 %add5 = add i64 %add4, %val545 %add6 = add i64 %add5, %val646 %add7 = add i64 %add6, %val747 %add8 = add i64 %add7, %val848 49 %cond = icmp eq i64 %add7, %add850 %res = select i1 %cond, i64 %add8, i64 %val951 52 store i64 %res, ptr %dstPtr53 ret void54}55 56; Check that conditional loads of spilled values can use LOC rather than LOCR.57define void @f1(ptr %ptr0, ptr %dstPtr) {58; CHECK-LABEL: f1:59; CHECK: brasl %r14, foo32@PLT60; CHECK: loclh {{.*}} # 4-byte Folded Reload61; CHECK: br %r1462 %ptr1 = getelementptr i32, ptr %ptr0, i32 263 %ptr2 = getelementptr i32, ptr %ptr0, i32 464 %ptr3 = getelementptr i32, ptr %ptr0, i32 665 %ptr4 = getelementptr i32, ptr %ptr0, i32 866 %ptr5 = getelementptr i32, ptr %ptr0, i32 1067 %ptr6 = getelementptr i32, ptr %ptr0, i32 1268 %ptr7 = getelementptr i32, ptr %ptr0, i32 1469 %ptr8 = getelementptr i32, ptr %ptr0, i32 1670 %ptr9 = getelementptr i32, ptr %ptr0, i32 1871 72 %val0 = load i32, ptr %ptr073 %val1 = load i32, ptr %ptr174 %val2 = load i32, ptr %ptr275 %val3 = load i32, ptr %ptr376 %val4 = load i32, ptr %ptr477 %val5 = load i32, ptr %ptr578 %val6 = load i32, ptr %ptr679 %val7 = load i32, ptr %ptr780 %val8 = load i32, ptr %ptr881 %val9 = load i32, ptr %ptr982 83 %ret = call i32 @foo32()84 85 %add0 = add i32 %ret, %val086 %add1 = add i32 %add0, %val187 %add2 = add i32 %add1, %val288 %add3 = add i32 %add2, %val389 %add4 = add i32 %add3, %val490 %add5 = add i32 %add4, %val591 %add6 = add i32 %add5, %val692 %add7 = add i32 %add6, %val793 %add8 = add i32 %add7, %val894 95 %cond = icmp eq i32 %add7, %add896 %res = select i1 %cond, i32 %add8, i32 %val997 98 store i32 %res, ptr %dstPtr99 ret void100}101