94 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mcpu=ppc64 -mtriple=powerpc64-unknown-linux-gnu -fast-isel=false < %s | FileCheck %s2 3; Test case for PR 14779: anonymous aggregates are not handled correctly.4; Darwin bug report PR 15821 is similar.5; The bug is triggered by passing a byval structure after an anonymous6; aggregate.7 8%tarray = type { i64, ptr }9 10define ptr @func1({ i64, ptr } %array, ptr %ptr) {11entry:12 %array_ptr = extractvalue {i64, ptr } %array, 113 %cond = icmp eq ptr %array_ptr, %ptr14 br i1 %cond, label %equal, label %unequal15equal:16 ret ptr %array_ptr17unequal:18 ret ptr %ptr19}20 21; CHECK-LABEL: func1:22; CHECK-DAG: std 3, -[[OFFSET1:[0-9]+]]23; CHECK-DAG: std 5, -[[OFFSET2:[0-9]+]]24; CHECK: cmpld {{([0-9]+,)?}}4, 525; CHECK: ld 3, -[[OFFSET1]](1)26; CHECK: ld 3, -[[OFFSET2]](1)27 28define ptr @func2({ i64, ptr } %array1, ptr byval(%tarray) %array2) {29entry:30 %array1_ptr = extractvalue {i64, ptr } %array1, 131 %tmp = getelementptr inbounds %tarray, ptr %array2, i32 0, i32 132 %array2_ptr = load ptr, ptr %tmp33 %cond = icmp eq ptr %array1_ptr, %array2_ptr34 br i1 %cond, label %equal, label %unequal35equal:36 ret ptr %array1_ptr37unequal:38 ret ptr %array2_ptr39}40; CHECK-LABEL: func2:41; CHECK-DAG: cmpld {{([0-9]+,)?}}4, 342; CHECK-DAG: std 6, 72(1)43; CHECK-DAG: std 5, 64(1)44; CHECK-DAG: std 3, -[[OFFSET1:[0-9]+]]45; CHECK-DAG: std 3, -[[OFFSET2:[0-9]+]]46; CHECK: ld 3, -[[OFFSET1]](1)47; CHECK: ld 3, -[[OFFSET2]](1)48 49define ptr @func3(ptr byval({ i64, ptr }) %array1, ptr byval(%tarray) %array2) {50entry:51 %tmp1 = getelementptr inbounds { i64, ptr }, ptr %array1, i32 0, i32 152 %array1_ptr = load ptr, ptr %tmp153 %tmp2 = getelementptr inbounds %tarray, ptr %array2, i32 0, i32 154 %array2_ptr = load ptr, ptr %tmp255 %cond = icmp eq ptr %array1_ptr, %array2_ptr56 br i1 %cond, label %equal, label %unequal57equal:58 ret ptr %array1_ptr59unequal:60 ret ptr %array2_ptr61}62 63; CHECK-LABEL: func3:64; CHECK-DAG: cmpld {{([0-9]+,)?}}3, 465; CHECK-DAG: std 3, -[[OFFSET2:[0-9]+]](1)66; CHECK-DAG: std 4, -[[OFFSET1:[0-9]+]](1)67; CHECK: ld 3, -[[OFFSET2]](1)68; CHECK: ld 3, -[[OFFSET1]](1)69 70define ptr @func4(i64 %p1, i64 %p2, i64 %p3, i64 %p4,71 i64 %p5, i64 %p6, i64 %p7, i64 %p8,72 { i64, ptr } %array1, ptr byval(%tarray) %array2) {73entry:74 %array1_ptr = extractvalue {i64, ptr } %array1, 175 %tmp = getelementptr inbounds %tarray, ptr %array2, i32 0, i32 176 %array2_ptr = load ptr, ptr %tmp77 %cond = icmp eq ptr %array1_ptr, %array2_ptr78 br i1 %cond, label %equal, label %unequal79equal:80 ret ptr %array1_ptr81unequal:82 ret ptr %array2_ptr83}84 85; CHECK-LABEL: func4:86; CHECK-DAG: ld [[REG2:[0-9]+]], 120(1)87; CHECK-DAG: ld [[REG3:[0-9]+]], 136(1)88; CHECK-DAG: std [[REG2]], -[[OFFSET1:[0-9]+]](1)89; CHECK: std [[REG3]], -[[OFFSET2:[0-9]+]](1)90; CHECK: cmpld {{([0-9]+,)?}}[[REG2]], [[REG3]]91; CHECK: ld 3, -[[OFFSET1]](1)92; CHECK: ld 3, -[[OFFSET2]](1)93 94