1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr7 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-n32:64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64le-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Make sure that we don't generate a std r, 0(0) -- the memory address cannot 6*9880d681SAndroid Build Coastguard Worker; be stored in r0. 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 8*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: std {{[0-9]+}}, 0(0) 9*9880d681SAndroid Build Coastguard Worker; CHECK: blr 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine void @test1({ i8*, void (i8*, i8*)* } %fn_arg) { 12*9880d681SAndroid Build Coastguard Worker %fn = alloca { i8*, void (i8*, i8*)* } 13*9880d681SAndroid Build Coastguard Worker %sp = alloca i8*, align 8 14*9880d681SAndroid Build Coastguard Worker %regs = alloca [18 x i64], align 8 15*9880d681SAndroid Build Coastguard Worker store { i8*, void (i8*, i8*)* } %fn_arg, { i8*, void (i8*, i8*)* }* %fn 16*9880d681SAndroid Build Coastguard Worker %1 = bitcast [18 x i64]* %regs to i64* 17*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 14, $0", "=*m"(i64* %1) 18*9880d681SAndroid Build Coastguard Worker %2 = bitcast [18 x i64]* %regs to i8* 19*9880d681SAndroid Build Coastguard Worker %3 = getelementptr i8, i8* %2, i32 8 20*9880d681SAndroid Build Coastguard Worker %4 = bitcast i8* %3 to i64* 21*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 15, $0", "=*m"(i64* %4) 22*9880d681SAndroid Build Coastguard Worker %5 = bitcast [18 x i64]* %regs to i8* 23*9880d681SAndroid Build Coastguard Worker %6 = getelementptr i8, i8* %5, i32 16 24*9880d681SAndroid Build Coastguard Worker %7 = bitcast i8* %6 to i64* 25*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 16, $0", "=*m"(i64* %7) 26*9880d681SAndroid Build Coastguard Worker %8 = bitcast [18 x i64]* %regs to i8* 27*9880d681SAndroid Build Coastguard Worker %9 = getelementptr i8, i8* %8, i32 24 28*9880d681SAndroid Build Coastguard Worker %10 = bitcast i8* %9 to i64* 29*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 17, $0", "=*m"(i64* %10) 30*9880d681SAndroid Build Coastguard Worker %11 = bitcast [18 x i64]* %regs to i8* 31*9880d681SAndroid Build Coastguard Worker %12 = getelementptr i8, i8* %11, i32 32 32*9880d681SAndroid Build Coastguard Worker %13 = bitcast i8* %12 to i64* 33*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 18, $0", "=*m"(i64* %13) 34*9880d681SAndroid Build Coastguard Worker %14 = bitcast [18 x i64]* %regs to i8* 35*9880d681SAndroid Build Coastguard Worker %15 = getelementptr i8, i8* %14, i32 40 36*9880d681SAndroid Build Coastguard Worker %16 = bitcast i8* %15 to i64* 37*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 19, $0", "=*m"(i64* %16) 38*9880d681SAndroid Build Coastguard Worker %17 = bitcast [18 x i64]* %regs to i8* 39*9880d681SAndroid Build Coastguard Worker %18 = getelementptr i8, i8* %17, i32 48 40*9880d681SAndroid Build Coastguard Worker %19 = bitcast i8* %18 to i64* 41*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 20, $0", "=*m"(i64* %19) 42*9880d681SAndroid Build Coastguard Worker %20 = bitcast [18 x i64]* %regs to i8* 43*9880d681SAndroid Build Coastguard Worker %21 = getelementptr i8, i8* %20, i32 56 44*9880d681SAndroid Build Coastguard Worker %22 = bitcast i8* %21 to i64* 45*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 21, $0", "=*m"(i64* %22) 46*9880d681SAndroid Build Coastguard Worker %23 = bitcast [18 x i64]* %regs to i8* 47*9880d681SAndroid Build Coastguard Worker %24 = getelementptr i8, i8* %23, i32 64 48*9880d681SAndroid Build Coastguard Worker %25 = bitcast i8* %24 to i64* 49*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 22, $0", "=*m"(i64* %25) 50*9880d681SAndroid Build Coastguard Worker %26 = bitcast [18 x i64]* %regs to i8* 51*9880d681SAndroid Build Coastguard Worker %27 = getelementptr i8, i8* %26, i32 72 52*9880d681SAndroid Build Coastguard Worker %28 = bitcast i8* %27 to i64* 53*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 23, $0", "=*m"(i64* %28) 54*9880d681SAndroid Build Coastguard Worker %29 = bitcast [18 x i64]* %regs to i8* 55*9880d681SAndroid Build Coastguard Worker %30 = getelementptr i8, i8* %29, i32 80 56*9880d681SAndroid Build Coastguard Worker %31 = bitcast i8* %30 to i64* 57*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 24, $0", "=*m"(i64* %31) 58*9880d681SAndroid Build Coastguard Worker %32 = bitcast [18 x i64]* %regs to i8* 59*9880d681SAndroid Build Coastguard Worker %33 = getelementptr i8, i8* %32, i32 88 60*9880d681SAndroid Build Coastguard Worker %34 = bitcast i8* %33 to i64* 61*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 25, $0", "=*m"(i64* %34) 62*9880d681SAndroid Build Coastguard Worker %35 = bitcast [18 x i64]* %regs to i8* 63*9880d681SAndroid Build Coastguard Worker %36 = getelementptr i8, i8* %35, i32 96 64*9880d681SAndroid Build Coastguard Worker %37 = bitcast i8* %36 to i64* 65*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 26, $0", "=*m"(i64* %37) 66*9880d681SAndroid Build Coastguard Worker %38 = bitcast [18 x i64]* %regs to i8* 67*9880d681SAndroid Build Coastguard Worker %39 = getelementptr i8, i8* %38, i32 104 68*9880d681SAndroid Build Coastguard Worker %40 = bitcast i8* %39 to i64* 69*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 27, $0", "=*m"(i64* %40) 70*9880d681SAndroid Build Coastguard Worker %41 = bitcast [18 x i64]* %regs to i8* 71*9880d681SAndroid Build Coastguard Worker %42 = getelementptr i8, i8* %41, i32 112 72*9880d681SAndroid Build Coastguard Worker %43 = bitcast i8* %42 to i64* 73*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 28, $0", "=*m"(i64* %43) 74*9880d681SAndroid Build Coastguard Worker %44 = bitcast [18 x i64]* %regs to i8* 75*9880d681SAndroid Build Coastguard Worker %45 = getelementptr i8, i8* %44, i32 120 76*9880d681SAndroid Build Coastguard Worker %46 = bitcast i8* %45 to i64* 77*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 29, $0", "=*m"(i64* %46) 78*9880d681SAndroid Build Coastguard Worker %47 = bitcast [18 x i64]* %regs to i8* 79*9880d681SAndroid Build Coastguard Worker %48 = getelementptr i8, i8* %47, i32 128 80*9880d681SAndroid Build Coastguard Worker %49 = bitcast i8* %48 to i64* 81*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 30, $0", "=*m"(i64* %49) 82*9880d681SAndroid Build Coastguard Worker %50 = bitcast [18 x i64]* %regs to i8* 83*9880d681SAndroid Build Coastguard Worker %51 = getelementptr i8, i8* %50, i32 136 84*9880d681SAndroid Build Coastguard Worker %52 = bitcast i8* %51 to i64* 85*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "std 31, $0", "=*m"(i64* %52) 86*9880d681SAndroid Build Coastguard Worker %53 = getelementptr { i8*, void (i8*, i8*)* }, { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 1 87*9880d681SAndroid Build Coastguard Worker %.funcptr = load void (i8*, i8*)*, void (i8*, i8*)** %53 88*9880d681SAndroid Build Coastguard Worker %54 = getelementptr { i8*, void (i8*, i8*)* }, { i8*, void (i8*, i8*)* }* %fn, i32 0, i32 0 89*9880d681SAndroid Build Coastguard Worker %.ptr = load i8*, i8** %54 90*9880d681SAndroid Build Coastguard Worker %55 = load i8*, i8** %sp 91*9880d681SAndroid Build Coastguard Worker call void %.funcptr(i8* %.ptr, i8* %55) 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95