1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -passes=inline -mtriple=aarch64--linux-gnu -S -o - < %s -inline-threshold=0 | FileCheck %s 3 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 i32 9 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 4 15; CHECK-NEXT: ret i32 [[A]] 16; 17 %C = call i32 @add(i32 %a, i32 0) 18 ret i32 %C 19} 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 4 26; CHECK-NEXT: ret i32 [[A]] 27; 28 %C = call i32 @add(i32 0, i32 %a) 29 ret i32 %C 30} 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 4 38; CHECK-NEXT: ret i32 [[ADD]] 39; 40 %add = add i32 %a, %b 41 call void @pad() 42 store i32 0, ptr @glbl 43 ret i32 %add 44} 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 4 53; CHECK-NEXT: ret i32 [[A]] 54; 55 %C = call i32 @sub1(i32 %a, i32 0) 56 ret i32 %C 57} 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 4 65; CHECK-NEXT: ret i32 [[SUB]] 66; 67 %sub = sub i32 %a, %b 68 call void @pad() 69 store i32 0, ptr @glbl 70 ret i32 %sub 71} 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 0 79; 80 %C = call i32 @sub2(i32 %a) 81 ret i32 %C 82} 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, %a 92 call void @pad() 93 ret i32 %sub 94} 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 4 103; CHECK-NEXT: ret i32 0 104; 105 %C = call i32 @mul(i32 %a, i32 0) 106 ret i32 %C 107} 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 4 114; CHECK-NEXT: ret i32 [[A]] 115; 116 %C = call i32 @mul(i32 %a, i32 1) 117 ret i32 %C 118} 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 4 126; CHECK-NEXT: ret i32 [[MUL]] 127; 128 %mul = mul i32 %a, %b 129 call void @pad() 130 store i32 0, ptr @glbl 131 ret i32 %mul 132} 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 4 141; CHECK-NEXT: ret i32 0 142; 143 %C = call i32 @div1(i32 0, i32 %a) 144 ret i32 %C 145} 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 4 152; CHECK-NEXT: ret i32 [[A]] 153; 154 %C = call i32 @div1(i32 %a, i32 1) 155 ret i32 %C 156} 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 4 164; CHECK-NEXT: ret i32 [[DIV]] 165; 166 %div = sdiv i32 %a, %b 167 call void @pad() 168 store i32 0, ptr @glbl 169 ret i32 %div 170} 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 1 178; 179 %C = call i32 @div2(i32 %a) 180 ret i32 %C 181} 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, %a 191 call void @pad() 192 ret i32 %div 193} 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 4 202; CHECK-NEXT: ret i32 0 203; 204 %C = call i32 @rem1(i32 0, i32 %a) 205 ret i32 %C 206} 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 4 213; CHECK-NEXT: ret i32 0 214; 215 %C = call i32 @rem1(i32 %a, i32 1) 216 ret i32 %C 217} 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 4 225; CHECK-NEXT: ret i32 [[REM]] 226; 227 %rem = urem i32 %a, %b 228 call void @pad() 229 store i32 0, ptr @glbl 230 ret i32 %rem 231} 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 0 239; 240 %C = call i32 @rem2(i32 %a) 241 ret i32 %C 242} 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, %a 252 call void @pad() 253 ret i32 %rem 254} 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 4 263; CHECK-NEXT: ret i32 [[A]] 264; 265 %C = call i32 @shl(i32 %a, i32 0) 266 ret i32 %C 267} 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 4 275; CHECK-NEXT: ret i32 [[SHL]] 276; 277 %shl = shl i32 %a, %b 278 call void @pad() 279 store i32 0, ptr @glbl 280 ret i32 %shl 281} 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 4 290; CHECK-NEXT: ret i32 [[A]] 291; 292 %C = call i32 @shr(i32 %a, i32 0) 293 ret i32 %C 294} 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 4 302; CHECK-NEXT: ret i32 [[SHR]] 303; 304 %shr = ashr i32 %a, %b 305 call void @pad() 306 store i32 0, ptr @glbl 307 ret i32 %shr 308} 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 4 317; CHECK-NEXT: ret i1 false 318; 319 %c = call i1 @and1(i1 %a, i1 false) 320 ret i1 %c 321} 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 4 328; CHECK-NEXT: ret i1 [[A]] 329; 330 %c = call i1 @and1(i1 %a, i1 true) 331 ret i1 %c 332} 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 4 340; CHECK-NEXT: ret i1 [[AND]] 341; 342 %and = and i1 %a, %b 343 call void @pad() 344 store i32 0, ptr @glbl 345 ret i1 %and 346} 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 %c 357} 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, %a 367 call void @pad() 368 ret i1 %and 369} 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 4 378; CHECK-NEXT: ret i1 [[A]] 379; 380 %c = call i1 @or1(i1 %a, i1 false) 381 ret i1 %c 382} 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 4 389; CHECK-NEXT: ret i1 true 390; 391 %c = call i1 @or1(i1 %a, i1 true) 392 ret i1 %c 393} 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 4 401; CHECK-NEXT: ret i1 [[OR]] 402; 403 %or = or i1 %a, %b 404 call void @pad() 405 store i32 0, ptr @glbl 406 ret i1 %or 407} 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 %c 418} 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, %a 428 call void @pad() 429 ret i1 %or 430} 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 4 439; CHECK-NEXT: ret i1 [[A]] 440; 441 %c = call i1 @xor1(i1 %a, i1 false) 442 ret i1 %c 443} 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 4 451; CHECK-NEXT: ret i1 [[XOR]] 452; 453 %xor = xor i1 %a, %b 454 call void @pad() 455 store i32 0, ptr @glbl 456 ret i1 %xor 457} 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 false 465; 466 %c = call i1 @xor2(i1 %a) 467 ret i1 %c 468} 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, %a 478 call void @pad() 479 ret i1 %xor 480} 481