1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; Test 64-bit addition in which the second operand is constant. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6declare i64 @foo() 7 8; Check addition of 1. 9define zeroext i1 @f1(i64 %dummy, i64 %a, ptr %res) { 10; CHECK-LABEL: f1: 11; CHECK: # %bb.0: 12; CHECK-NEXT: algfi %r3, 1 13; CHECK-NEXT: ipm %r0 14; CHECK-NEXT: risbg %r2, %r0, 63, 191, 35 15; CHECK-NEXT: stg %r3, 0(%r4) 16; CHECK-NEXT: br %r14 17 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1) 18 %val = extractvalue {i64, i1} %t, 0 19 %obit = extractvalue {i64, i1} %t, 1 20 store i64 %val, ptr %res 21 ret i1 %obit 22} 23 24; Check the high end of the ALGFI range. 25define zeroext i1 @f2(i64 %dummy, i64 %a, ptr %res) { 26; CHECK-LABEL: f2: 27; CHECK: # %bb.0: 28; CHECK-NEXT: algfi %r3, 4294967295 29; CHECK-NEXT: ipm %r0 30; CHECK-NEXT: risbg %r2, %r0, 63, 191, 35 31; CHECK-NEXT: stg %r3, 0(%r4) 32; CHECK-NEXT: br %r14 33 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 4294967295) 34 %val = extractvalue {i64, i1} %t, 0 35 %obit = extractvalue {i64, i1} %t, 1 36 store i64 %val, ptr %res 37 ret i1 %obit 38} 39 40; Check the next value up, which must be loaded into a register first. 41define zeroext i1 @f3(i64 %dummy, i64 %a, ptr %res) { 42; CHECK-LABEL: f3: 43; CHECK: # %bb.0: 44; CHECK-NEXT: llihl %r0, 1 45; CHECK-NEXT: algr %r0, %r3 46; CHECK-NEXT: ipm %r1 47; CHECK-NEXT: risbg %r2, %r1, 63, 191, 35 48; CHECK-NEXT: stg %r0, 0(%r4) 49; CHECK-NEXT: br %r14 50 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 4294967296) 51 %val = extractvalue {i64, i1} %t, 0 52 %obit = extractvalue {i64, i1} %t, 1 53 store i64 %val, ptr %res 54 ret i1 %obit 55} 56 57; Likewise for negative values. 58define zeroext i1 @f4(i64 %dummy, i64 %a, ptr %res) { 59; CHECK-LABEL: f4: 60; CHECK: # %bb.0: 61; CHECK-NEXT: lghi %r0, -1 62; CHECK-NEXT: algr %r0, %r3 63; CHECK-NEXT: ipm %r1 64; CHECK-NEXT: risbg %r2, %r1, 63, 191, 35 65; CHECK-NEXT: stg %r0, 0(%r4) 66; CHECK-NEXT: br %r14 67 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 -1) 68 %val = extractvalue {i64, i1} %t, 0 69 %obit = extractvalue {i64, i1} %t, 1 70 store i64 %val, ptr %res 71 ret i1 %obit 72} 73 74; Check using the overflow result for a branch. 75define void @f5(i64 %dummy, i64 %a, ptr %res) { 76; CHECK-LABEL: f5: 77; CHECK: # %bb.0: 78; CHECK-NEXT: algfi %r3, 1 79; CHECK-NEXT: stg %r3, 0(%r4) 80; CHECK-NEXT: jgnle foo@PLT 81; CHECK-NEXT: .LBB4_1: # %exit 82; CHECK-NEXT: br %r14 83 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1) 84 %val = extractvalue {i64, i1} %t, 0 85 %obit = extractvalue {i64, i1} %t, 1 86 store i64 %val, ptr %res 87 br i1 %obit, label %call, label %exit 88 89call: 90 tail call i64 @foo() 91 br label %exit 92 93exit: 94 ret void 95} 96 97; ... and the same with the inverted direction. 98define void @f6(i64 %dummy, i64 %a, ptr %res) { 99; CHECK-LABEL: f6: 100; CHECK: # %bb.0: 101; CHECK-NEXT: algfi %r3, 1 102; CHECK-NEXT: stg %r3, 0(%r4) 103; CHECK-NEXT: jgle foo@PLT 104; CHECK-NEXT: .LBB5_1: # %exit 105; CHECK-NEXT: br %r14 106 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1) 107 %val = extractvalue {i64, i1} %t, 0 108 %obit = extractvalue {i64, i1} %t, 1 109 store i64 %val, ptr %res 110 br i1 %obit, label %exit, label %call 111 112call: 113 tail call i64 @foo() 114 br label %exit 115 116exit: 117 ret void 118} 119 120declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone 121 122