1; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \ 2; RUN: -mtriple powerpc-ibm-aix-xcoff -stop-after=machine-cp < %s | \ 3; RUN: FileCheck --check-prefixes=CHECKMIR,MIR32 %s 4 5; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \ 6; RUN: -mtriple powerpc-ibm-aix-xcoff < %s | \ 7; RUN: FileCheck --check-prefixes=CHECKASM,ASMOBJ32,ASM32 %s 8 9; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \ 10; RUN: -mtriple powerpc64-ibm-aix-xcoff -stop-after=machine-cp < %s | \ 11; RUN: FileCheck --check-prefixes=CHECKMIR,MIR64 %s 12 13; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \ 14; RUN: -mtriple powerpc64-ibm-aix-xcoff < %s | \ 15; RUN: FileCheck --check-prefixes=CHECKASM,ASM64 %s 16 17; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \ 18; RUN: -mtriple powerpc-ibm-aix-xcoff -filetype=obj < %s -o %t 19; RUN: llvm-objdump -d %t | FileCheck \ 20; RUN: --check-prefixes=CHECKOBJ,ASMOBJ32,OBJ32 %s 21 22define signext i32 @callThroughPtr(i32 ()* nocapture) { 23 %2 = tail call signext i32 %0() 24 ret i32 %2 25} 26 27; CHECKMIR: name: callThroughPtr 28 29; MIR32: liveins: $r3 30; MIR32: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1 31; MIR32-DAG: STW $r2, 20, $r1 32; MIR32-DAG: renamable $r11 = LWZ 8, renamable $r3 :: (dereferenceable invariant load 4 from %ir.0 + 8) 33; MIR32-DAG: renamable $[[REG:r[0-9]+]] = LWZ 0, renamable $r3 :: (dereferenceable invariant load 4 from %ir.0) 34; MIR32-DAG: $r2 = LWZ 4, killed renamable $r3 :: (dereferenceable invariant load 4 from %ir.0 + 4) 35; MIR32-DAG: MTCTR killed renamable $[[REG]], implicit-def $ctr 36; MIR32-NEXT: BCTRL_LWZinto_toc 20, $r1, csr_aix32, implicit-def dead $lr, implicit-def dead $r2, implicit $ctr, implicit $rm, implicit $r11, implicit $r2, implicit-def $r1, implicit-def $r3 37; MIR32-NEXT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1 38 39; MIR64: liveins: $x3 40; MIR64: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1 41; MIR64-DAG: STD $x2, 40, $x1 :: (store 8 into stack + 40) 42; MIR64-DAG: renamable $x11 = LD 16, renamable $x3 :: (dereferenceable invariant load 8 from %ir.0 + 16) 43; MIR64-DAG: renamable $[[REG:x[0-9]+]] = LD 0, renamable $x3 :: (dereferenceable invariant load 8 from %ir.0) 44; MIR64-DAG: $x2 = LD 8, killed renamable $x3 :: (dereferenceable invariant load 8 from %ir.0 + 8) 45; MIR64-DAG: MTCTR8 killed renamable $[[REG]], implicit-def $ctr8 46; MIR64-NEXT: BCTRL8_LDinto_toc 40, $x1, csr_ppc64, implicit-def dead $lr8, implicit-def dead $x2, implicit $ctr8, implicit $rm, implicit $x11, implicit $x2, implicit-def $r1, implicit-def $x3 47; MIR64-NEXT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1 48 49; CHECKASM-LABEL: .callThroughPtr: 50 51; ASM32: stwu 1, -64(1) 52; ASM32-DAG: lwz [[REG:[0-9]+]], 0(3) 53; ASM32-DAG: stw 2, 20(1) 54; ASM32-DAG: mtctr [[REG]] 55; ASM32-DAG: lwz 11, 8(3) 56; ASM32-DAG: lwz 2, 4(3) 57; ASM32-NEXT: bctrl 58; ASM32-NEXT: lwz 2, 20(1) 59; ASM32-NEXT: addi 1, 1, 64 60 61; ASM64: stdu 1, -112(1) 62; ASM64-DAG: ld [[REG:[0-9]+]], 0(3) 63; ASM64-DAG: std 2, 40(1) 64; ASM64-DAG: mtctr [[REG]] 65; ASM64-DAG: ld 11, 16(3) 66; ASM64-DAG: ld 2, 8(3) 67; ASM64-NEXT: bctrl 68; ASM64-NEXT: ld 2, 40(1) 69; ASM64-NEXT: addi 1, 1, 112 70 71; OBJ32-LABEL: .text: 72; OBJ32: stwu 1, -64(1) 73; OBJ32-DAG: lwz [[REG:[0-9]+]], 0(3) 74; OBJ32-DAG: stw 2, 20(1) 75; OBJ32-DAG: mtctr [[REG]] 76; OBJ32-DAG: lwz 11, 8(3) 77; OBJ32-DAG: lwz 2, 4(3) 78; OBJ32-NEXT: 4e 80 04 21 bctrl 79; OBJ32-NEXT: 80 41 00 14 lwz 2, 20(1) 80; OBJ32-NEXT: addi 1, 1, 64 81 82define void @callThroughPtrWithArgs(void (i32, i16, i64)* nocapture) { 83 tail call void %0(i32 signext 1, i16 zeroext 2, i64 3) 84 ret void 85} 86 87; CHECKMIR: name: callThroughPtrWithArgs 88 89; MIR32: liveins: $r3 90; MIR32: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1 91; MIR32-DAG: renamable $[[REG:r[0-9]+]] = LWZ 0, renamable $r3 :: (dereferenceable invariant load 4 from %ir.0) 92; MIR32-DAG: MTCTR killed renamable $[[REG]], implicit-def $ctr 93; MIR32-DAG: STW $r2, 20, $r1 :: (store 4 into stack + 20) 94; MIR32-DAG: renamable $r11 = LWZ 8, renamable $r3 :: (dereferenceable invariant load 4 from %ir.0 + 8) 95; MIR32-DAG: $r2 = LWZ 4, killed renamable $r3 :: (dereferenceable invariant load 4 from %ir.0 + 4) 96; MIR32-DAG: $r3 = LI 1 97; MIR32-DAG: $r4 = LI 2 98; MIR32-DAG: $r5 = LI 0 99; MIR32-DAG: $r6 = LI 3 100; MIR32-NEXT: BCTRL_LWZinto_toc 20, $r1, csr_aix32, implicit-def dead $lr, implicit-def dead $r2, implicit $ctr, implicit $rm, implicit $r11, implicit $r3, implicit $r4, implicit $r5, implicit $r6, implicit $r2, implicit-def $r1 101; MIR32-NEXT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1 102 103; MIR64: liveins: $x3 104; MIR64: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1 105; MIR64-DAG: renamable $[[REG:x[0-9]+]] = LD 0, renamable $x3 :: (dereferenceable invariant load 8 from %ir.0) 106; MIR64-DAG: MTCTR8 killed renamable $[[REG]], implicit-def $ctr8 107; MIR64-DAG: STD $x2, 40, $x1 :: (store 8 into stack + 40) 108; MIR64-DAG: renamable $x11 = LD 16, renamable $x3 :: (dereferenceable invariant load 8 from %ir.0 + 16) 109; MIR64-DAG: $x2 = LD 8, killed renamable $x3 :: (dereferenceable invariant load 8 from %ir.0 + 8) 110; MIR64-DAG: $x3 = LI8 1 111; MIR64-DAG: $x4 = LI8 2 112; MIR64-DAG: $x5 = LI8 3 113; MIR64-NEXT: BCTRL8_LDinto_toc 40, $x1, csr_ppc64, implicit-def dead $lr8, implicit-def dead $x2, implicit $ctr8, implicit $rm, implicit $x11, implicit $x3, implicit $x4, implicit $x5, implicit $x2, implicit-def $r1 114; MIR64-NEXT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1 115 116; CHECKASM-LABEL: .callThroughPtrWithArgs: 117; CHECKOBJ-LABEL: <.callThroughPtrWithArgs>: 118 119; ASMOBJ32: stwu 1, -64(1) 120; ASMOBJ32-DAG: lwz [[REG:[0-9]+]], 0(3) 121; ASMOBJ32-DAG: li 5, 0 122; ASMOBJ32-DAG: li 6, 3 123; ASMOBJ32-DAG: stw 2, 20(1) 124; ASMOBJ32-DAG: mtctr [[REG]] 125; ASMOBJ32-DAG: li 4, 2 126; ASMOBJ32-DAG: lwz 11, 8(3) 127; ASMOBJ32-DAG: lwz 2, 4(3) 128; ASMOBJ32-DAG: li 3, 1 129; ASMOBJ32-NEXT: bctrl 130; ASMOBJ32-NEXT: lwz 2, 20(1) 131; ASMOBJ32-NEXT: addi 1, 1, 64 132 133; ASM64: stdu 1, -112(1) 134; ASM64-DAG: ld [[REG:[0-9]+]], 0(3) 135; ASM64-DAG: li 5, 3 136; ASM64-DAG: std 2, 40(1) 137; ASM64-DAG: mtctr [[REG]] 138; ASM64-DAG: li 4, 2 139; ASM64-DAG: ld 11, 16(3) 140; ASM64-DAG: ld 2, 8(3) 141; ASM64-DAG: li 3, 1 142; ASM64-NEXT: bctrl 143; ASM64-NEXT: ld 2, 40(1) 144; ASM64-NEXT: addi 1, 1, 112 145