481 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -passes=inline -mtriple=aarch64--linux-gnu -S -o - < %s -inline-threshold=0 | 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 7declare void @pad()8@glbl = external global i329 10define i32 @outer_add1(i32 %a) {11; CHECK-LABEL: define i32 @outer_add1(12; CHECK-SAME: i32 [[A:%.*]]) {13; CHECK-NEXT: call void @pad()14; CHECK-NEXT: store i32 0, ptr @glbl, align 415; CHECK-NEXT: ret i32 [[A]]16;17 %C = call i32 @add(i32 %a, i32 0)18 ret i32 %C19}20 21define i32 @outer_add2(i32 %a) {22; CHECK-LABEL: define i32 @outer_add2(23; CHECK-SAME: i32 [[A:%.*]]) {24; CHECK-NEXT: call void @pad()25; CHECK-NEXT: store i32 0, ptr @glbl, align 426; CHECK-NEXT: ret i32 [[A]]27;28 %C = call i32 @add(i32 0, i32 %a)29 ret i32 %C30}31 32define i32 @add(i32 %a, i32 %b) {33; CHECK-LABEL: define i32 @add(34; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {35; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], [[B]]36; CHECK-NEXT: call void @pad()37; CHECK-NEXT: store i32 0, ptr @glbl, align 438; CHECK-NEXT: ret i32 [[ADD]]39;40 %add = add i32 %a, %b41 call void @pad()42 store i32 0, ptr @glbl43 ret i32 %add44}45 46 47 48define i32 @outer_sub1(i32 %a) {49; CHECK-LABEL: define i32 @outer_sub1(50; CHECK-SAME: i32 [[A:%.*]]) {51; CHECK-NEXT: call void @pad()52; CHECK-NEXT: store i32 0, ptr @glbl, align 453; CHECK-NEXT: ret i32 [[A]]54;55 %C = call i32 @sub1(i32 %a, i32 0)56 ret i32 %C57}58 59define i32 @sub1(i32 %a, i32 %b) {60; CHECK-LABEL: define i32 @sub1(61; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {62; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], [[B]]63; CHECK-NEXT: call void @pad()64; CHECK-NEXT: store i32 0, ptr @glbl, align 465; CHECK-NEXT: ret i32 [[SUB]]66;67 %sub = sub i32 %a, %b68 call void @pad()69 store i32 0, ptr @glbl70 ret i32 %sub71}72 73 74define i32 @outer_sub2(i32 %a) {75; CHECK-LABEL: define i32 @outer_sub2(76; CHECK-SAME: i32 [[A:%.*]]) {77; CHECK-NEXT: call void @pad()78; CHECK-NEXT: ret i32 079;80 %C = call i32 @sub2(i32 %a)81 ret i32 %C82}83 84define i32 @sub2(i32 %a) {85; CHECK-LABEL: define i32 @sub2(86; CHECK-SAME: i32 [[A:%.*]]) {87; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], [[A]]88; CHECK-NEXT: call void @pad()89; CHECK-NEXT: ret i32 [[SUB]]90;91 %sub = sub i32 %a, %a92 call void @pad()93 ret i32 %sub94}95 96 97 98define i32 @outer_mul1(i32 %a) {99; CHECK-LABEL: define i32 @outer_mul1(100; CHECK-SAME: i32 [[A:%.*]]) {101; CHECK-NEXT: call void @pad()102; CHECK-NEXT: store i32 0, ptr @glbl, align 4103; CHECK-NEXT: ret i32 0104;105 %C = call i32 @mul(i32 %a, i32 0)106 ret i32 %C107}108 109define i32 @outer_mul2(i32 %a) {110; CHECK-LABEL: define i32 @outer_mul2(111; CHECK-SAME: i32 [[A:%.*]]) {112; CHECK-NEXT: call void @pad()113; CHECK-NEXT: store i32 0, ptr @glbl, align 4114; CHECK-NEXT: ret i32 [[A]]115;116 %C = call i32 @mul(i32 %a, i32 1)117 ret i32 %C118}119 120define i32 @mul(i32 %a, i32 %b) {121; CHECK-LABEL: define i32 @mul(122; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {123; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[A]], [[B]]124; CHECK-NEXT: call void @pad()125; CHECK-NEXT: store i32 0, ptr @glbl, align 4126; CHECK-NEXT: ret i32 [[MUL]]127;128 %mul = mul i32 %a, %b129 call void @pad()130 store i32 0, ptr @glbl131 ret i32 %mul132}133 134 135 136define i32 @outer_div1(i32 %a) {137; CHECK-LABEL: define i32 @outer_div1(138; CHECK-SAME: i32 [[A:%.*]]) {139; CHECK-NEXT: call void @pad()140; CHECK-NEXT: store i32 0, ptr @glbl, align 4141; CHECK-NEXT: ret i32 0142;143 %C = call i32 @div1(i32 0, i32 %a)144 ret i32 %C145}146 147define i32 @outer_div2(i32 %a) {148; CHECK-LABEL: define i32 @outer_div2(149; CHECK-SAME: i32 [[A:%.*]]) {150; CHECK-NEXT: call void @pad()151; CHECK-NEXT: store i32 0, ptr @glbl, align 4152; CHECK-NEXT: ret i32 [[A]]153;154 %C = call i32 @div1(i32 %a, i32 1)155 ret i32 %C156}157 158define i32 @div1(i32 %a, i32 %b) {159; CHECK-LABEL: define i32 @div1(160; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {161; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A]], [[B]]162; CHECK-NEXT: call void @pad()163; CHECK-NEXT: store i32 0, ptr @glbl, align 4164; CHECK-NEXT: ret i32 [[DIV]]165;166 %div = sdiv i32 %a, %b167 call void @pad()168 store i32 0, ptr @glbl169 ret i32 %div170}171 172 173define i32 @outer_div3(i32 %a) {174; CHECK-LABEL: define i32 @outer_div3(175; CHECK-SAME: i32 [[A:%.*]]) {176; CHECK-NEXT: call void @pad()177; CHECK-NEXT: ret i32 1178;179 %C = call i32 @div2(i32 %a)180 ret i32 %C181}182 183define i32 @div2(i32 %a) {184; CHECK-LABEL: define i32 @div2(185; CHECK-SAME: i32 [[A:%.*]]) {186; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A]], [[A]]187; CHECK-NEXT: call void @pad()188; CHECK-NEXT: ret i32 [[DIV]]189;190 %div = sdiv i32 %a, %a191 call void @pad()192 ret i32 %div193}194 195 196 197define i32 @outer_rem1(i32 %a) {198; CHECK-LABEL: define i32 @outer_rem1(199; CHECK-SAME: i32 [[A:%.*]]) {200; CHECK-NEXT: call void @pad()201; CHECK-NEXT: store i32 0, ptr @glbl, align 4202; CHECK-NEXT: ret i32 0203;204 %C = call i32 @rem1(i32 0, i32 %a)205 ret i32 %C206}207 208define i32 @outer_rem2(i32 %a) {209; CHECK-LABEL: define i32 @outer_rem2(210; CHECK-SAME: i32 [[A:%.*]]) {211; CHECK-NEXT: call void @pad()212; CHECK-NEXT: store i32 0, ptr @glbl, align 4213; CHECK-NEXT: ret i32 0214;215 %C = call i32 @rem1(i32 %a, i32 1)216 ret i32 %C217}218 219define i32 @rem1(i32 %a, i32 %b) {220; CHECK-LABEL: define i32 @rem1(221; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {222; CHECK-NEXT: [[REM:%.*]] = urem i32 [[A]], [[B]]223; CHECK-NEXT: call void @pad()224; CHECK-NEXT: store i32 0, ptr @glbl, align 4225; CHECK-NEXT: ret i32 [[REM]]226;227 %rem = urem i32 %a, %b228 call void @pad()229 store i32 0, ptr @glbl230 ret i32 %rem231}232 233 234define i32 @outer_rem3(i32 %a) {235; CHECK-LABEL: define i32 @outer_rem3(236; CHECK-SAME: i32 [[A:%.*]]) {237; CHECK-NEXT: call void @pad()238; CHECK-NEXT: ret i32 0239;240 %C = call i32 @rem2(i32 %a)241 ret i32 %C242}243 244define i32 @rem2(i32 %a) {245; CHECK-LABEL: define i32 @rem2(246; CHECK-SAME: i32 [[A:%.*]]) {247; CHECK-NEXT: [[REM:%.*]] = urem i32 [[A]], [[A]]248; CHECK-NEXT: call void @pad()249; CHECK-NEXT: ret i32 [[REM]]250;251 %rem = urem i32 %a, %a252 call void @pad()253 ret i32 %rem254}255 256 257 258define i32 @outer_shl1(i32 %a) {259; CHECK-LABEL: define i32 @outer_shl1(260; CHECK-SAME: i32 [[A:%.*]]) {261; CHECK-NEXT: call void @pad()262; CHECK-NEXT: store i32 0, ptr @glbl, align 4263; CHECK-NEXT: ret i32 [[A]]264;265 %C = call i32 @shl(i32 %a, i32 0)266 ret i32 %C267}268 269define i32 @shl(i32 %a, i32 %b) {270; CHECK-LABEL: define i32 @shl(271; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {272; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A]], [[B]]273; CHECK-NEXT: call void @pad()274; CHECK-NEXT: store i32 0, ptr @glbl, align 4275; CHECK-NEXT: ret i32 [[SHL]]276;277 %shl = shl i32 %a, %b278 call void @pad()279 store i32 0, ptr @glbl280 ret i32 %shl281}282 283 284 285define i32 @outer_shr1(i32 %a) {286; CHECK-LABEL: define i32 @outer_shr1(287; CHECK-SAME: i32 [[A:%.*]]) {288; CHECK-NEXT: call void @pad()289; CHECK-NEXT: store i32 0, ptr @glbl, align 4290; CHECK-NEXT: ret i32 [[A]]291;292 %C = call i32 @shr(i32 %a, i32 0)293 ret i32 %C294}295 296define i32 @shr(i32 %a, i32 %b) {297; CHECK-LABEL: define i32 @shr(298; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {299; CHECK-NEXT: [[SHR:%.*]] = ashr i32 [[A]], [[B]]300; CHECK-NEXT: call void @pad()301; CHECK-NEXT: store i32 0, ptr @glbl, align 4302; CHECK-NEXT: ret i32 [[SHR]]303;304 %shr = ashr i32 %a, %b305 call void @pad()306 store i32 0, ptr @glbl307 ret i32 %shr308}309 310 311 312define i1 @outer_and1(i1 %a) {313; CHECK-LABEL: define i1 @outer_and1(314; CHECK-SAME: i1 [[A:%.*]]) {315; CHECK-NEXT: call void @pad()316; CHECK-NEXT: store i32 0, ptr @glbl, align 4317; CHECK-NEXT: ret i1 false318;319 %c = call i1 @and1(i1 %a, i1 false)320 ret i1 %c321}322 323define i1 @outer_and2(i1 %a) {324; CHECK-LABEL: define i1 @outer_and2(325; CHECK-SAME: i1 [[A:%.*]]) {326; CHECK-NEXT: call void @pad()327; CHECK-NEXT: store i32 0, ptr @glbl, align 4328; CHECK-NEXT: ret i1 [[A]]329;330 %c = call i1 @and1(i1 %a, i1 true)331 ret i1 %c332}333 334define i1 @and1(i1 %a, i1 %b) {335; CHECK-LABEL: define i1 @and1(336; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {337; CHECK-NEXT: [[AND:%.*]] = and i1 [[A]], [[B]]338; CHECK-NEXT: call void @pad()339; CHECK-NEXT: store i32 0, ptr @glbl, align 4340; CHECK-NEXT: ret i1 [[AND]]341;342 %and = and i1 %a, %b343 call void @pad()344 store i32 0, ptr @glbl345 ret i1 %and346}347 348 349define i1 @outer_and3(i1 %a) {350; CHECK-LABEL: define i1 @outer_and3(351; CHECK-SAME: i1 [[A:%.*]]) {352; CHECK-NEXT: call void @pad()353; CHECK-NEXT: ret i1 [[A]]354;355 %c = call i1 @and2(i1 %a)356 ret i1 %c357}358 359define i1 @and2(i1 %a) {360; CHECK-LABEL: define i1 @and2(361; CHECK-SAME: i1 [[A:%.*]]) {362; CHECK-NEXT: [[AND:%.*]] = and i1 [[A]], [[A]]363; CHECK-NEXT: call void @pad()364; CHECK-NEXT: ret i1 [[AND]]365;366 %and = and i1 %a, %a367 call void @pad()368 ret i1 %and369}370 371 372 373define i1 @outer_or1(i1 %a) {374; CHECK-LABEL: define i1 @outer_or1(375; CHECK-SAME: i1 [[A:%.*]]) {376; CHECK-NEXT: call void @pad()377; CHECK-NEXT: store i32 0, ptr @glbl, align 4378; CHECK-NEXT: ret i1 [[A]]379;380 %c = call i1 @or1(i1 %a, i1 false)381 ret i1 %c382}383 384define i1 @outer_or2(i1 %a) {385; CHECK-LABEL: define i1 @outer_or2(386; CHECK-SAME: i1 [[A:%.*]]) {387; CHECK-NEXT: call void @pad()388; CHECK-NEXT: store i32 0, ptr @glbl, align 4389; CHECK-NEXT: ret i1 true390;391 %c = call i1 @or1(i1 %a, i1 true)392 ret i1 %c393}394 395define i1 @or1(i1 %a, i1 %b) {396; CHECK-LABEL: define i1 @or1(397; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {398; CHECK-NEXT: [[OR:%.*]] = or i1 [[A]], [[B]]399; CHECK-NEXT: call void @pad()400; CHECK-NEXT: store i32 0, ptr @glbl, align 4401; CHECK-NEXT: ret i1 [[OR]]402;403 %or = or i1 %a, %b404 call void @pad()405 store i32 0, ptr @glbl406 ret i1 %or407}408 409 410define i1 @outer_or3(i1 %a) {411; CHECK-LABEL: define i1 @outer_or3(412; CHECK-SAME: i1 [[A:%.*]]) {413; CHECK-NEXT: call void @pad()414; CHECK-NEXT: ret i1 [[A]]415;416 %c = call i1 @or2(i1 %a)417 ret i1 %c418}419 420define i1 @or2(i1 %a) {421; CHECK-LABEL: define i1 @or2(422; CHECK-SAME: i1 [[A:%.*]]) {423; CHECK-NEXT: [[OR:%.*]] = or i1 [[A]], [[A]]424; CHECK-NEXT: call void @pad()425; CHECK-NEXT: ret i1 [[OR]]426;427 %or = or i1 %a, %a428 call void @pad()429 ret i1 %or430}431 432 433 434define i1 @outer_xor1(i1 %a) {435; CHECK-LABEL: define i1 @outer_xor1(436; CHECK-SAME: i1 [[A:%.*]]) {437; CHECK-NEXT: call void @pad()438; CHECK-NEXT: store i32 0, ptr @glbl, align 4439; CHECK-NEXT: ret i1 [[A]]440;441 %c = call i1 @xor1(i1 %a, i1 false)442 ret i1 %c443}444 445define i1 @xor1(i1 %a, i1 %b) {446; CHECK-LABEL: define i1 @xor1(447; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {448; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[A]], [[B]]449; CHECK-NEXT: call void @pad()450; CHECK-NEXT: store i32 0, ptr @glbl, align 4451; CHECK-NEXT: ret i1 [[XOR]]452;453 %xor = xor i1 %a, %b454 call void @pad()455 store i32 0, ptr @glbl456 ret i1 %xor457}458 459 460define i1 @outer_xor3(i1 %a) {461; CHECK-LABEL: define i1 @outer_xor3(462; CHECK-SAME: i1 [[A:%.*]]) {463; CHECK-NEXT: call void @pad()464; CHECK-NEXT: ret i1 false465;466 %c = call i1 @xor2(i1 %a)467 ret i1 %c468}469 470define i1 @xor2(i1 %a) {471; CHECK-LABEL: define i1 @xor2(472; CHECK-SAME: i1 [[A:%.*]]) {473; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[A]], [[A]]474; CHECK-NEXT: call void @pad()475; CHECK-NEXT: ret i1 [[XOR]]476;477 %xor = xor i1 %a, %a478 call void @pad()479 ret i1 %xor480}481