1*9880d681SAndroid Build Coastguard Worker; Test that compares are omitted if CC already has the right value 2*9880d681SAndroid Build Coastguard Worker; (z196 version). 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 -no-integrated-as | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Addition provides enough for equality comparisons with zero. First teest 7*9880d681SAndroid Build Coastguard Worker; the EQ case with LOC. 8*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a, i32 %b, i32 *%cptr) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: loce %r3, 0(%r4) 12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 13*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 14*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 15*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 16*9880d681SAndroid Build Coastguard Worker %arg = select i1 %cmp, i32 %c, i32 %b 17*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %arg) 18*9880d681SAndroid Build Coastguard Worker ret i32 %add 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; ...and again with STOC. 22*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b, i32 *%cptr) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 24*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stoce %r3, 0(%r4) 26*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 27*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 28*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 29*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 30*9880d681SAndroid Build Coastguard Worker %newval = select i1 %cmp, i32 %b, i32 %c 31*9880d681SAndroid Build Coastguard Worker store i32 %newval, i32 *%cptr 32*9880d681SAndroid Build Coastguard Worker ret i32 %add 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; Reverse the select order and test with LOCR. 36*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b, i32 %c) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 38*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: locrne %r3, %r4 40*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 41*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 42*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 43*9880d681SAndroid Build Coastguard Worker %arg = select i1 %cmp, i32 %b, i32 %c 44*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %arg) 45*9880d681SAndroid Build Coastguard Worker ret i32 %add 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; ...and again with LOC. 49*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %b, i32 *%cptr) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 51*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: locne %r3, 0(%r4) 53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 54*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 55*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 56*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 57*9880d681SAndroid Build Coastguard Worker %arg = select i1 %cmp, i32 %b, i32 %c 58*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %arg) 59*9880d681SAndroid Build Coastguard Worker ret i32 %add 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; ...and again with STOC. 63*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32 %a, i32 %b, i32 *%cptr) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 65*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stocne %r3, 0(%r4) 67*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 68*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 69*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %add, 0 70*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 71*9880d681SAndroid Build Coastguard Worker %newval = select i1 %cmp, i32 %c, i32 %b 72*9880d681SAndroid Build Coastguard Worker store i32 %newval, i32 *%cptr 73*9880d681SAndroid Build Coastguard Worker ret i32 %add 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Change the EQ in f3 to NE. 77*9880d681SAndroid Build Coastguard Workerdefine i32 @f6(i32 %a, i32 %b, i32 %c) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 79*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: locre %r3, %r4 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 83*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 84*9880d681SAndroid Build Coastguard Worker %arg = select i1 %cmp, i32 %b, i32 %c 85*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %arg) 86*9880d681SAndroid Build Coastguard Worker ret i32 %add 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; ...and again with LOC. 90*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(i32 %a, i32 %b, i32 *%cptr) { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 92*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: loce %r3, 0(%r4) 94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 95*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 96*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 97*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 98*9880d681SAndroid Build Coastguard Worker %arg = select i1 %cmp, i32 %b, i32 %c 99*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "blah $0", "{r3}"(i32 %arg) 100*9880d681SAndroid Build Coastguard Worker ret i32 %add 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; ...and again with STOC. 104*9880d681SAndroid Build Coastguard Workerdefine i32 @f8(i32 %a, i32 %b, i32 *%cptr) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 106*9880d681SAndroid Build Coastguard Worker; CHECK: afi %r2, 1000000 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stoce %r3, 0(%r4) 108*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 109*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, 1000000 110*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %add, 0 111*9880d681SAndroid Build Coastguard Worker %c = load i32 , i32 *%cptr 112*9880d681SAndroid Build Coastguard Worker %newval = select i1 %cmp, i32 %c, i32 %b 113*9880d681SAndroid Build Coastguard Worker store i32 %newval, i32 *%cptr 114*9880d681SAndroid Build Coastguard Worker ret i32 %add 115*9880d681SAndroid Build Coastguard Worker} 116