250 lines · plain
1; REQUIRES: asserts2; RUN: opt -passes=inline -mtriple=aarch64--linux-gnu -S -debug-only=inline-cost < %s 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"5target triple = "aarch64--linux-gnu"6 7define i32 @outer1(ptr %ptr, i32 %i) {8 %C = call i32 @inner1(ptr %ptr, i32 %i)9 ret i32 %C10}11 12; sext can be folded into gep.13; CHECK: Analyzing call of inner114; CHECK: NumInstructionsSimplified: 315; CHECK: NumInstructions: 416define i32 @inner1(ptr %ptr, i32 %i) {17 %E = sext i32 %i to i6418 %G = getelementptr inbounds i32, ptr %ptr, i64 %E19 %L = load i32, ptr %G20 ret i32 %L21}22 23define i32 @outer2(ptr %ptr, i32 %i) {24 %C = call i32 @inner2(ptr %ptr, i32 %i)25 ret i32 %C26}27 28; zext from i32 to i64 is free.29; CHECK: Analyzing call of inner230; CHECK: NumInstructionsSimplified: 331; CHECK: NumInstructions: 432define i32 @inner2(ptr %ptr, i32 %i) {33 %E = zext i32 %i to i6434 %G = getelementptr inbounds i32, ptr %ptr, i64 %E35 %L = load i32, ptr %G36 ret i32 %L37}38 39define i32 @outer3(ptr %ptr, i16 %i) {40 %C = call i32 @inner3(ptr %ptr, i16 %i)41 ret i32 %C42}43 44; zext can be folded into gep.45; CHECK: Analyzing call of inner346; CHECK: NumInstructionsSimplified: 347; CHECK: NumInstructions: 448define i32 @inner3(ptr %ptr, i16 %i) {49 %E = zext i16 %i to i6450 %G = getelementptr inbounds i32, ptr %ptr, i64 %E51 %L = load i32, ptr %G52 ret i32 %L53}54 55define i16 @outer4(ptr %ptr) {56 %C = call i16 @inner4(ptr %ptr)57 ret i16 %C58}59 60; It is an ExtLoad.61; CHECK: Analyzing call of inner462; CHECK: NumInstructionsSimplified: 263; CHECK: NumInstructions: 364define i16 @inner4(ptr %ptr) {65 %L = load i8, ptr %ptr66 %E = zext i8 %L to i1667 ret i16 %E68}69 70define i16 @outer5(ptr %ptr) {71 %C = call i16 @inner5(ptr %ptr)72 ret i16 %C73}74 75; It is an ExtLoad.76; CHECK: Analyzing call of inner577; CHECK: NumInstructionsSimplified: 278; CHECK: NumInstructions: 379define i16 @inner5(ptr %ptr) {80 %L = load i8, ptr %ptr81 %E = sext i8 %L to i1682 ret i16 %E83}84 85define i32 @outer6(ptr %ptr) {86 %C = call i32 @inner6(ptr %ptr)87 ret i32 %C88}89 90; It is an ExtLoad.91; CHECK: Analyzing call of inner692; CHECK: NumInstructionsSimplified: 293; CHECK: NumInstructions: 394define i32 @inner6(ptr %ptr) {95 %L = load i8, ptr %ptr96 %E = zext i8 %L to i3297 ret i32 %E98}99 100define i32 @outer7(ptr %ptr) {101 %C = call i32 @inner7(ptr %ptr)102 ret i32 %C103}104 105; It is an ExtLoad.106; CHECK: Analyzing call of inner7107; CHECK: NumInstructionsSimplified: 2108; CHECK: NumInstructions: 3109define i32 @inner7(ptr %ptr) {110 %L = load i8, ptr %ptr111 %E = sext i8 %L to i32112 ret i32 %E113}114 115define i32 @outer8(ptr %ptr) {116 %C = call i32 @inner8(ptr %ptr)117 ret i32 %C118}119 120; It is an ExtLoad.121; CHECK: Analyzing call of inner8122; CHECK: NumInstructionsSimplified: 2123; CHECK: NumInstructions: 3124define i32 @inner8(ptr %ptr) {125 %L = load i16, ptr %ptr126 %E = zext i16 %L to i32127 ret i32 %E128}129 130define i32 @outer9(ptr %ptr) {131 %C = call i32 @inner9(ptr %ptr)132 ret i32 %C133}134 135; It is an ExtLoad.136; CHECK: Analyzing call of inner9137; CHECK: NumInstructionsSimplified: 2138; CHECK: NumInstructions: 3139define i32 @inner9(ptr %ptr) {140 %L = load i16, ptr %ptr141 %E = sext i16 %L to i32142 ret i32 %E143}144 145define i64 @outer10(ptr %ptr) {146 %C = call i64 @inner10(ptr %ptr)147 ret i64 %C148}149 150; It is an ExtLoad.151; CHECK: Analyzing call of inner10152; CHECK: NumInstructionsSimplified: 2153; CHECK: NumInstructions: 3154define i64 @inner10(ptr %ptr) {155 %L = load i8, ptr %ptr156 %E = zext i8 %L to i64157 ret i64 %E158}159 160define i64 @outer11(ptr %ptr) {161 %C = call i64 @inner11(ptr %ptr)162 ret i64 %C163}164 165; It is an ExtLoad.166; CHECK: Analyzing call of inner11167; CHECK: NumInstructionsSimplified: 2168; CHECK: NumInstructions: 3169define i64 @inner11(ptr %ptr) {170 %L = load i8, ptr %ptr171 %E = sext i8 %L to i64172 ret i64 %E173}174 175define i64 @outer12(ptr %ptr) {176 %C = call i64 @inner12(ptr %ptr)177 ret i64 %C178}179 180; It is an ExtLoad.181; CHECK: Analyzing call of inner12182; CHECK: NumInstructionsSimplified: 2183; CHECK: NumInstructions: 3184define i64 @inner12(ptr %ptr) {185 %L = load i16, ptr %ptr186 %E = zext i16 %L to i64187 ret i64 %E188}189 190define i64 @outer13(ptr %ptr) {191 %C = call i64 @inner13(ptr %ptr)192 ret i64 %C193}194 195; It is an ExtLoad.196; CHECK: Analyzing call of inner13197; CHECK: NumInstructionsSimplified: 2198; CHECK: NumInstructions: 3199define i64 @inner13(ptr %ptr) {200 %L = load i16, ptr %ptr201 %E = sext i16 %L to i64202 ret i64 %E203}204 205define i64 @outer14(ptr %ptr) {206 %C = call i64 @inner14(ptr %ptr)207 ret i64 %C208}209 210; It is an ExtLoad.211; CHECK: Analyzing call of inner14212; CHECK: NumInstructionsSimplified: 2213; CHECK: NumInstructions: 3214define i64 @inner14(ptr %ptr) {215 %L = load i32, ptr %ptr216 %E = zext i32 %L to i64217 ret i64 %E218}219 220define i64 @outer15(ptr %ptr) {221 %C = call i64 @inner15(ptr %ptr)222 ret i64 %C223}224 225; It is an ExtLoad.226; CHECK: Analyzing call of inner15227; CHECK: NumInstructionsSimplified: 2228; CHECK: NumInstructions: 3229define i64 @inner15(ptr %ptr) {230 %L = load i32, ptr %ptr231 %E = sext i32 %L to i64232 ret i64 %E233}234 235define i64 @outer16(i32 %V1, i64 %V2) {236 %C = call i64 @inner16(i32 %V1, i64 %V2)237 ret i64 %C238}239 240; sext can be folded into shl.241; CHECK: Analyzing call of inner16242; CHECK: NumInstructionsSimplified: 2243; CHECK: NumInstructions: 4244define i64 @inner16(i32 %V1, i64 %V2) {245 %E = sext i32 %V1 to i64246 %S = shl i64 %E, 3247 %A = add i64 %V2, %S248 ret i64 %A249}250