1*9880d681SAndroid Build Coastguard Worker; Test STOCGs that are presented as selects. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i64 *) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Test with the loaded value first. 8*9880d681SAndroid Build Coastguard Workerdefine void @f1(i64 *%ptr, i64 %alt, i32 %limit) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 11*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe %r3, 0(%r2) 12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 13*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 14*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 15*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 16*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; ...and with the loaded value second 21*9880d681SAndroid Build Coastguard Workerdefine void @f2(i64 *%ptr, i64 %alt, i32 %limit) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 23*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 24*9880d681SAndroid Build Coastguard Worker; CHECK: stocgl %r3, 0(%r2) 25*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 26*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 27*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 28*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %alt, i64 %orig 29*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned STOCG range. 34*9880d681SAndroid Build Coastguard Workerdefine void @f3(i64 *%base, i64 %alt, i32 %limit) { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 36*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 37*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe %r3, 524280(%r2) 38*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 39*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 65535 40*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 41*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 42*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 43*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; Check the next doubleword up. Other sequences besides this one would be OK. 48*9880d681SAndroid Build Coastguard Workerdefine void @f4(i64 *%base, i64 %alt, i32 %limit) { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 50*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, 524288 51*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 52*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe %r3, 0(%r2) 53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 54*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 65536 55*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 56*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 57*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 58*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; Check the low end of the STOCG range. 63*9880d681SAndroid Build Coastguard Workerdefine void @f5(i64 *%base, i64 %alt, i32 %limit) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 65*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 66*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe %r3, -524288(%r2) 67*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 68*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 -65536 69*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 70*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 71*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 72*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Check the next doubleword down, with the same comments as f4. 77*9880d681SAndroid Build Coastguard Workerdefine void @f6(i64 *%base, i64 %alt, i32 %limit) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 79*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, -524296 80*9880d681SAndroid Build Coastguard Worker; CHECK: clfi %r4, 42 81*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe %r3, 0(%r2) 82*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 83*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i64 -65537 84*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 85*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 86*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 87*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 88*9880d681SAndroid Build Coastguard Worker ret void 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; Try a frame index base. 92*9880d681SAndroid Build Coastguard Workerdefine void @f7(i64 %alt, i32 %limit) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 94*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 95*9880d681SAndroid Build Coastguard Worker; CHECK: stocghe {{%r[0-9]+}}, {{[0-9]+}}(%r15) 96*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 97*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 98*9880d681SAndroid Build Coastguard Worker %ptr = alloca i64 99*9880d681SAndroid Build Coastguard Worker call void @foo(i64 *%ptr) 100*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %limit, 42 101*9880d681SAndroid Build Coastguard Worker %orig = load i64 , i64 *%ptr 102*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i64 %orig, i64 %alt 103*9880d681SAndroid Build Coastguard Worker store i64 %res, i64 *%ptr 104*9880d681SAndroid Build Coastguard Worker call void @foo(i64 *%ptr) 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; Test that conditionally-executed stores do not use STOC, since STOC 109*9880d681SAndroid Build Coastguard Worker; is allowed to trap even when the condition is false. 110*9880d681SAndroid Build Coastguard Workerdefine void @f8(i64 %a, i64 %b, i64 *%dest) { 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 112*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: stocg %r3, 0(%r4) 113*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i64 %a, %b 116*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %store, label %exit 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerstore: 119*9880d681SAndroid Build Coastguard Worker store i64 %b, i64 *%dest 120*9880d681SAndroid Build Coastguard Worker br label %exit 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerexit: 123*9880d681SAndroid Build Coastguard Worker ret void 124*9880d681SAndroid Build Coastguard Worker} 125