1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=ppc64 -mtriple=powerpc64-unknown-linux-gnu -fast-isel=false < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=g4 -mtriple=powerpc-apple-darwin8 < %s | FileCheck -check-prefix=DARWIN32 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=ppc970 -mtriple=powerpc64-apple-darwin8 < %s | FileCheck -check-prefix=DARWIN64 %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test case for PR 14779: anonymous aggregates are not handled correctly. 6*9880d681SAndroid Build Coastguard Worker; Darwin bug report PR 15821 is similar. 7*9880d681SAndroid Build Coastguard Worker; The bug is triggered by passing a byval structure after an anonymous 8*9880d681SAndroid Build Coastguard Worker; aggregate. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker%tarray = type { i64, i8* } 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i8* @func1({ i64, i8* } %array, i8* %ptr) { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %array_ptr = extractvalue {i64, i8* } %array, 1 15*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i8* %array_ptr, %ptr 16*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %equal, label %unequal 17*9880d681SAndroid Build Coastguard Workerequal: 18*9880d681SAndroid Build Coastguard Worker ret i8* %array_ptr 19*9880d681SAndroid Build Coastguard Workerunequal: 20*9880d681SAndroid Build Coastguard Worker ret i8* %ptr 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func1: 24*9880d681SAndroid Build Coastguard Worker; CHECK: cmpld {{([0-9]+,)?}}4, 5 25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: std 4, -[[OFFSET1:[0-9]+]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: std 5, -[[OFFSET2:[0-9]+]] 27*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET1]](1) 28*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET2]](1) 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; DARWIN32: _func1: 31*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr 32*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr r[[REG1:[0-9]+]], r[[REGA:[0-9]+]] 33*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr r[[REG2:[0-9]+]], r[[REGB:[0-9]+]] 34*9880d681SAndroid Build Coastguard Worker; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REGA]], r[[REGB]] 35*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG1]], -[[OFFSET1:[0-9]+]] 36*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG2]], -[[OFFSET2:[0-9]+]] 37*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET1]] 38*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET2]] 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; DARWIN64: _func1: 41*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr 42*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr r[[REG1:[0-9]+]], r[[REGA:[0-9]+]] 43*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr r[[REG2:[0-9]+]], r[[REGB:[0-9]+]] 44*9880d681SAndroid Build Coastguard Worker; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REGA]], r[[REGB]] 45*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG1]], -[[OFFSET1:[0-9]+]] 46*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG2]], -[[OFFSET2:[0-9]+]] 47*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET1]] 48*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET2]] 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i8* @func2({ i64, i8* } %array1, %tarray* byval %array2) { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %array1_ptr = extractvalue {i64, i8* } %array1, 1 54*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1 55*9880d681SAndroid Build Coastguard Worker %array2_ptr = load i8*, i8** %tmp 56*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i8* %array1_ptr, %array2_ptr 57*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %equal, label %unequal 58*9880d681SAndroid Build Coastguard Workerequal: 59*9880d681SAndroid Build Coastguard Worker ret i8* %array1_ptr 60*9880d681SAndroid Build Coastguard Workerunequal: 61*9880d681SAndroid Build Coastguard Worker ret i8* %array2_ptr 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func2: 65*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REG2:[0-9]+]], 72(1) 66*9880d681SAndroid Build Coastguard Worker; CHECK: cmpld {{([0-9]+,)?}}4, [[REG2]] 67*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: std [[REG2]], -[[OFFSET1:[0-9]+]] 68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: std 4, -[[OFFSET2:[0-9]+]] 69*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET2]](1) 70*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET1]](1) 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; DARWIN32: _func2: 73*9880d681SAndroid Build Coastguard Worker; DARWIN32: addi r[[REG1:[0-9]+]], r[[REGSP:[0-9]+]], 36 74*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG2:[0-9]+]], 44(r[[REGSP]]) 75*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr 76*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr r[[REG3:[0-9]+]], r[[REGA:[0-9]+]] 77*9880d681SAndroid Build Coastguard Worker; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REGA]], r[[REG2]] 78*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG3]], -[[OFFSET1:[0-9]+]] 79*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG2]], -[[OFFSET2:[0-9]+]] 80*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET1]] 81*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET2]] 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; DARWIN64: _func2: 84*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r[[REG2:[0-9]+]], 72(r1) 85*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr 86*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr r[[REG3:[0-9]+]], r[[REGA:[0-9]+]] 87*9880d681SAndroid Build Coastguard Worker; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REGA]], r[[REG2]] 88*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG3]], -[[OFFSET1:[0-9]+]] 89*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG2]], -[[OFFSET2:[0-9]+]] 90*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET1]] 91*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET2]] 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine i8* @func3({ i64, i8* }* byval %array1, %tarray* byval %array2) { 95*9880d681SAndroid Build Coastguard Workerentry: 96*9880d681SAndroid Build Coastguard Worker %tmp1 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %array1, i32 0, i32 1 97*9880d681SAndroid Build Coastguard Worker %array1_ptr = load i8*, i8** %tmp1 98*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1 99*9880d681SAndroid Build Coastguard Worker %array2_ptr = load i8*, i8** %tmp2 100*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i8* %array1_ptr, %array2_ptr 101*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %equal, label %unequal 102*9880d681SAndroid Build Coastguard Workerequal: 103*9880d681SAndroid Build Coastguard Worker ret i8* %array1_ptr 104*9880d681SAndroid Build Coastguard Workerunequal: 105*9880d681SAndroid Build Coastguard Worker ret i8* %array2_ptr 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func3: 109*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REG3:[0-9]+]], 72(1) 110*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REG4:[0-9]+]], 56(1) 111*9880d681SAndroid Build Coastguard Worker; CHECK: cmpld {{([0-9]+,)?}}[[REG4]], [[REG3]] 112*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REG3]], -[[OFFSET1:[0-9]+]](1) 113*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REG4]], -[[OFFSET2:[0-9]+]](1) 114*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET2]](1) 115*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET1]](1) 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker; DARWIN32: _func3: 118*9880d681SAndroid Build Coastguard Worker; DARWIN32: addi r[[REG1:[0-9]+]], r[[REGSP:[0-9]+]], 36 119*9880d681SAndroid Build Coastguard Worker; DARWIN32: addi r[[REG2:[0-9]+]], r[[REGSP]], 24 120*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG3:[0-9]+]], 44(r[[REGSP]]) 121*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG4:[0-9]+]], 32(r[[REGSP]]) 122*9880d681SAndroid Build Coastguard Worker; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REG4]], r[[REG3]] 123*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG3]], -[[OFFSET1:[0-9]+]] 124*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG4]], -[[OFFSET2:[0-9]+]] 125*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET2]] 126*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r3, -[[OFFSET1]] 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; DARWIN64: _func3: 129*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r[[REG3:[0-9]+]], 72(r1) 130*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r[[REG4:[0-9]+]], 56(r1) 131*9880d681SAndroid Build Coastguard Worker; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REG4]], r[[REG3]] 132*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG3]], -[[OFFSET1:[0-9]+]] 133*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG4]], -[[OFFSET2:[0-9]+]] 134*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET2]] 135*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET1]] 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine i8* @func4(i64 %p1, i64 %p2, i64 %p3, i64 %p4, 139*9880d681SAndroid Build Coastguard Worker i64 %p5, i64 %p6, i64 %p7, i64 %p8, 140*9880d681SAndroid Build Coastguard Worker { i64, i8* } %array1, %tarray* byval %array2) { 141*9880d681SAndroid Build Coastguard Workerentry: 142*9880d681SAndroid Build Coastguard Worker %array1_ptr = extractvalue {i64, i8* } %array1, 1 143*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1 144*9880d681SAndroid Build Coastguard Worker %array2_ptr = load i8*, i8** %tmp 145*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i8* %array1_ptr, %array2_ptr 146*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %equal, label %unequal 147*9880d681SAndroid Build Coastguard Workerequal: 148*9880d681SAndroid Build Coastguard Worker ret i8* %array1_ptr 149*9880d681SAndroid Build Coastguard Workerunequal: 150*9880d681SAndroid Build Coastguard Worker ret i8* %array2_ptr 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func4: 154*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REG3:[0-9]+]], 136(1) 155*9880d681SAndroid Build Coastguard Worker; CHECK: ld [[REG2:[0-9]+]], 120(1) 156*9880d681SAndroid Build Coastguard Worker; CHECK: cmpld {{([0-9]+,)?}}[[REG2]], [[REG3]] 157*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REG3]], -[[OFFSET2:[0-9]+]](1) 158*9880d681SAndroid Build Coastguard Worker; CHECK: std [[REG2]], -[[OFFSET1:[0-9]+]](1) 159*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET1]](1) 160*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, -[[OFFSET2]](1) 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; DARWIN32: _func4: 163*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG4:[0-9]+]], 96(r1) 164*9880d681SAndroid Build Coastguard Worker; DARWIN32: addi r[[REG1:[0-9]+]], r1, 100 165*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG3:[0-9]+]], 108(r1) 166*9880d681SAndroid Build Coastguard Worker; DARWIN32: mr r[[REG2:[0-9]+]], r[[REG4]] 167*9880d681SAndroid Build Coastguard Worker; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REG4]], r[[REG3]] 168*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG2]], -[[OFFSET1:[0-9]+]] 169*9880d681SAndroid Build Coastguard Worker; DARWIN32: stw r[[REG3]], -[[OFFSET2:[0-9]+]] 170*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG1]], -[[OFFSET1]] 171*9880d681SAndroid Build Coastguard Worker; DARWIN32: lwz r[[REG1]], -[[OFFSET2]] 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; DARWIN64: _func4: 174*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r[[REG2:[0-9]+]], 120(r1) 175*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r[[REG3:[0-9]+]], 136(r1) 176*9880d681SAndroid Build Coastguard Worker; DARWIN64: mr r[[REG4:[0-9]+]], r[[REG2]] 177*9880d681SAndroid Build Coastguard Worker; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REG2]], r[[REG3]] 178*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG4]], -[[OFFSET1:[0-9]+]] 179*9880d681SAndroid Build Coastguard Worker; DARWIN64: std r[[REG3]], -[[OFFSET2:[0-9]+]] 180*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET1]] 181*9880d681SAndroid Build Coastguard Worker; DARWIN64: ld r3, -[[OFFSET2]] 182