505 lines · plain
1; RUN: opt -passes=inline -mtriple=aarch64--linux-gnu -S -o - < %s -inline-threshold=0 | FileCheck %s2 3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"4target triple = "aarch64--linux-gnu"5 6declare void @pad()7@glbl = external global i328 9define i1 @outer1() {10; CHECK-LABEL: @outer1(11; CHECK-NOT: call i1 @inner112 %C = call i1 @inner1()13 ret i1 %C14}15 16define i1 @inner1() {17entry:18 br label %if_true19 20if_true:21 %phi = phi i1 [0, %entry], [%phi, %if_true] ; Simplified to 022 br i1 %phi, label %if_true, label %exit23 24exit:25 store i32 0, ptr @glbl26 store i32 1, ptr @glbl27 store i32 2, ptr @glbl28 store i32 3, ptr @glbl29 store i32 4, ptr @glbl30 ret i1 %phi31}32 33 34define i1 @outer2(i1 %val) {35; CHECK-LABEL: @outer2(36; CHECK: call i1 @inner237 %C = call i1 @inner2(i1 %val)38 ret i1 %C39}40 41define i1 @inner2(i1 %val) {42entry:43 br label %if_true44 45if_true:46 %phi = phi i1 [%val, %entry], [%phi, %if_true] ; Cannot be simplified to a constant47 br i1 %phi, label %if_true, label %exit48 49exit:50 call void @pad()51 ret i1 %phi52}53 54 55define i1 @outer3(i1 %cond) {56; CHECK-LABEL: @outer3(57; CHECK-NOT: call i1 @inner358 %C = call i1 @inner3(i1 %cond)59 ret i1 %C60}61 62define i1 @inner3(i1 %cond) {63entry:64 br i1 %cond, label %if_true, label %exit65 66if_true:67 br label %exit68 69exit:70 %phi = phi i32 [0, %entry], [0, %if_true] ; Simplified to 071 %cmp = icmp eq i32 %phi, 072 store i32 0, ptr @glbl73 store i32 1, ptr @glbl74 store i32 2, ptr @glbl75 store i32 3, ptr @glbl76 store i32 4, ptr @glbl77 ret i1 %cmp78}79 80 81define i1 @outer4(i1 %cond) {82; CHECK-LABEL: @outer4(83; CHECK-NOT: call i1 @inner484 %C = call i1 @inner4(i1 %cond, i32 0)85 ret i1 %C86}87 88define i1 @inner4(i1 %cond, i32 %val) {89entry:90 br i1 %cond, label %if_true, label %exit91 92if_true:93 br label %exit94 95exit:96 %phi = phi i32 [0, %entry], [%val, %if_true] ; Simplified to 097 %cmp = icmp eq i32 %phi, 098 call void @pad()99 ret i1 %cmp100}101 102 103define i1 @outer5_1(i1 %cond) {104; CHECK-LABEL: @outer5_1(105; CHECK-NOT: call i1 @inner5106 %C = call i1 @inner5(i1 %cond, i32 0, i32 0)107 ret i1 %C108}109 110 111define i1 @outer5_2(i1 %cond) {112; CHECK-LABEL: @outer5_2(113; CHECK: call i1 @inner5114 %C = call i1 @inner5(i1 %cond, i32 0, i32 1)115 ret i1 %C116}117 118define i1 @inner5(i1 %cond, i32 %val1, i32 %val2) {119entry:120 br i1 %cond, label %if_true, label %exit121 122if_true:123 br label %exit124 125exit:126 %phi = phi i32 [%val1, %entry], [%val2, %if_true] ; Can be simplified to a constant if %val1 and %val2 are the same constants127 %cmp = icmp eq i32 %phi, 0128 call void @pad()129 store i32 0, ptr @glbl130 ret i1 %cmp131}132 133 134define i1 @outer6(i1 %cond, i32 %val) {135; CHECK-LABEL: @outer6(136; CHECK-NOT: call i1 @inner6137 %C = call i1 @inner6(i1 true, i32 %val, i32 0)138 ret i1 %C139}140 141define i1 @inner6(i1 %cond, i32 %val1, i32 %val2) {142entry:143 br i1 %cond, label %if_true, label %exit144 145if_true:146 br label %exit147 148exit:149 %phi = phi i32 [%val1, %entry], [%val2, %if_true] ; Simplified to 0150 %cmp = icmp eq i32 %phi, 0151 call void @pad()152 store i32 0, ptr @glbl153 store i32 1, ptr @glbl154 ret i1 %cmp155}156 157 158define i1 @outer7(i1 %cond, i32 %val) {159; CHECK-LABEL: @outer7(160; CHECK-NOT: call i1 @inner7161 %C = call i1 @inner7(i1 false, i32 0, i32 %val)162 ret i1 %C163}164 165define i1 @inner7(i1 %cond, i32 %val1, i32 %val2) {166entry:167 br i1 %cond, label %if_true, label %exit168 169if_true:170 br label %exit171 172exit:173 %phi = phi i32 [%val1, %entry], [%val2, %if_true] ; Simplified to 0174 %cmp = icmp eq i32 %phi, 0175 call void @pad()176 store i32 0, ptr @glbl177 store i32 1, ptr @glbl178 ret i1 %cmp179}180 181 182define i1 @outer8_1() {183; CHECK-LABEL: @outer8_1(184; CHECK-NOT: call i1 @inner8185 %C = call i1 @inner8(i32 0)186 ret i1 %C187}188 189 190 191define i1 @outer8_2() {192; CHECK-LABEL: @outer8_2(193; CHECK-NOT: call i1 @inner8194 %C = call i1 @inner8(i32 3)195 ret i1 %C196}197 198define i1 @inner8(i32 %cond) {199entry:200 switch i32 %cond, label %default [ i32 0, label %zero201 i32 1, label %one202 i32 2, label %two ]203 204zero:205 br label %exit206 207one:208 br label %exit209 210two:211 br label %exit212 213default:214 br label %exit215 216exit:217 %phi = phi i32 [0, %zero], [1, %one], [2, %two], [-1, %default] ; Can be simplified to a constant if the switch condition is known218 %cmp = icmp eq i32 %phi, 0219 call void @pad()220 ret i1 %cmp221}222 223 224define i1 @outer9(i1 %cond) {225; CHECK-LABEL: @outer9(226; CHECK-NOT: call i1 @inner9227 %C = call i1 @inner9(i32 0, i1 %cond)228 ret i1 %C229}230 231define i1 @inner9(i32 %cond1, i1 %cond2) {232entry:233 switch i32 %cond1, label %exit [ i32 0, label %zero234 i32 1, label %one235 i32 2, label %two ]236 237zero:238 br label %exit239 240one:241 br label %exit242 243two:244 br i1 %cond2, label %two_true, label %two_false245 246two_true:247 br label %exit248 249two_false:250 br label %exit251 252exit:253 %phi = phi i32 [0, %zero], [1, %one], [2, %two_true], [2, %two_false], [-1, %entry] ; Simplified to 0254 %cmp = icmp eq i32 %phi, 0255 call void @pad()256 store i32 0, ptr @glbl257 ret i1 %cmp258}259 260 261define i32 @outer10(i1 %cond) {262; CHECK-LABEL: @outer10(263; CHECK-NOT: call i32 @inner10264 %A = alloca i32265 %C = call i32 @inner10(i1 %cond, ptr %A)266 ret i32 %C267}268 269define i32 @inner10(i1 %cond, ptr %A) {270entry:271 br label %if_true272 273if_true:274 %phi = phi ptr [%A, %entry], [%phi, %if_true] ; Simplified to %A275 %load = load i32, ptr %phi276 br i1 %cond, label %if_true, label %exit277 278exit:279 call void @pad()280 ret i32 %load281}282 283 284define i32 @outer11(i1 %cond, ptr %ptr) {285; CHECK-LABEL: @outer11(286; CHECK: call i32 @inner11287 %C = call i32 @inner11(i1 %cond, ptr %ptr)288 ret i32 %C289}290 291define i32 @inner11(i1 %cond, ptr %ptr) {292entry:293 br label %if_true294 295if_true:296 %phi = phi ptr [%ptr, %entry], [%phi, %if_true] ; Cannot be simplified297 %load = load i32, ptr %phi298 br i1 %cond, label %if_true, label %exit299 300exit:301 call void @pad()302 ret i32 %load303}304 305 306define i32 @outer12(i1 %cond) {307; CHECK-LABEL: @outer12(308; CHECK-NOT: call i32 @inner12309 %A = alloca i32310 %C = call i32 @inner12(i1 %cond, ptr %A)311 ret i32 %C312}313 314define i32 @inner12(i1 %cond, ptr %ptr) {315entry:316 br i1 %cond, label %if_true, label %exit317 318if_true:319 br label %exit320 321exit:322 %phi = phi ptr [%ptr, %entry], [%ptr, %if_true] ; Simplified to %A323 %load = load i32, ptr %phi324 call void @pad()325 ret i32 %load326}327 328 329define i32 @outer13(i1 %cond) {330; CHECK-LABEL: @outer13(331; CHECK-NOT: call i32 @inner13332 %A = alloca i32333 %C = call i32 @inner13(i1 %cond, ptr %A)334 ret i32 %C335}336 337define i32 @inner13(i1 %cond, ptr %ptr) {338entry:339 %gep1 = getelementptr inbounds i32, ptr %ptr, i32 2340 %gep2 = getelementptr inbounds i32, ptr %ptr, i32 1341 br i1 %cond, label %if_true, label %exit342 343if_true:344 %gep3 = getelementptr inbounds i32, ptr %gep2, i32 1345 br label %exit346 347exit:348 %phi = phi ptr [%gep1, %entry], [%gep3, %if_true] ; Simplifeid to %gep1349 %load = load i32, ptr %phi350 call void @pad()351 ret i32 %load352}353 354 355define i32 @outer14(i1 %cond) {356; CHECK-LABEL: @outer14(357; CHECK: call i32 @inner14358 %A1 = alloca i32359 %A2 = alloca i32360 %C = call i32 @inner14(i1 %cond, ptr %A1, ptr %A2)361 ret i32 %C362}363 364define i32 @inner14(i1 %cond, ptr %ptr1, ptr %ptr2) {365entry:366 br i1 %cond, label %if_true, label %exit367 368if_true:369 br label %exit370 371exit:372 %phi = phi ptr [%ptr1, %entry], [%ptr2, %if_true] ; Cannot be simplified373 %load = load i32, ptr %phi374 call void @pad()375 store i32 0, ptr @glbl376 ret i32 %load377}378 379 380define i32 @outer15(i1 %cond, ptr %ptr) {381; CHECK-LABEL: @outer15(382; CHECK-NOT: call i32 @inner15383 %A = alloca i32384 %C = call i32 @inner15(i1 true, ptr %ptr, ptr %A)385 ret i32 %C386}387 388define i32 @inner15(i1 %cond, ptr %ptr1, ptr %ptr2) {389entry:390 br i1 %cond, label %if_true, label %exit391 392if_true:393 br label %exit394 395exit:396 %phi = phi ptr [%ptr1, %entry], [%ptr2, %if_true] ; Simplified to %A397 %load = load i32, ptr %phi398 call void @pad()399 store i32 0, ptr @glbl400 store i32 1, ptr @glbl401 ret i32 %load402}403 404 405define i32 @outer16(i1 %cond, ptr %ptr) {406; CHECK-LABEL: @outer16(407; CHECK-NOT: call i32 @inner16408 %A = alloca i32409 %C = call i32 @inner16(i1 false, ptr %A, ptr %ptr)410 ret i32 %C411}412 413define i32 @inner16(i1 %cond, ptr %ptr1, ptr %ptr2) {414entry:415 br i1 %cond, label %if_true, label %exit416 417if_true:418 br label %exit419 420exit:421 %phi = phi ptr [%ptr1, %entry], [%ptr2, %if_true] ; Simplified to %A422 %load = load i32, ptr %phi423 call void @pad()424 store i32 0, ptr @glbl425 store i32 1, ptr @glbl426 ret i32 %load427}428 429 430define i1 @outer17(i1 %cond) {431; CHECK-LABEL: @outer17(432; CHECK: call i1 @inner17433 %A = alloca i32434 %C = call i1 @inner17(i1 %cond, ptr %A)435 ret i1 %C436}437 438define i1 @inner17(i1 %cond, ptr %ptr) {439entry:440 br i1 %cond, label %if_true, label %exit441 442if_true:443 br label %exit444 445exit:446 %phi = phi ptr [null, %entry], [%ptr, %if_true] ; Cannot be mapped to a constant447 %cmp = icmp eq ptr %phi, null448 call void @pad()449 ret i1 %cmp450}451 452 453define i1 @outer18(i1 %cond) {454; CHECK-LABEL: @outer18(455; CHECK-NOT: call i1 @inner18456 %C = call i1 @inner18(i1 %cond, i1 true)457 ret i1 %C458}459 460define i1 @inner18(i1 %cond1, i1 %cond2) {461entry:462 br i1 %cond1, label %block1, label %block2463 464block1:465 br i1 %cond2, label %block3, label %block4466 467block2:468 br i1 %cond2, label %block5, label %block4469 470block3:471 %phi = phi i32 [0, %block1], [1, %block4], [0, %block5] ; Simplified to 0472 %cmp = icmp eq i32 %phi, 0473 call void @pad()474 ret i1 %cmp475 476block4: ; Unreachable block477 br label %block3478 479block5:480 br label %block3481}482 483 484define i1 @outer19(i1 %cond) {485; CHECK-LABEL: @outer19(486; CHECK: call i1 @inner19487 %A = alloca i32488 %C = call i1 @inner19(i1 %cond, ptr %A)489 ret i1 %C490}491 492define i1 @inner19(i1 %cond, ptr %ptr) {493entry:494 br i1 %cond, label %if_true, label %exit495 496if_true:497 br label %exit498 499exit:500 %phi = phi ptr [%ptr, %entry], [null, %if_true] ; Cannot be mapped to a constant501 %cmp = icmp eq ptr %phi, null502 call void @pad()503 ret i1 %cmp504}505