252 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 i32 @outer1(i1 %cond) {10; CHECK-LABEL: @outer1(11; CHECK-NOT: call i32 @inner112 %C = call i32 @inner1(i1 %cond, i32 1)13 ret i32 %C14}15 16define i32 @inner1(i1 %cond, i32 %val) {17 %select = select i1 %cond, i32 1, i32 %val ; Simplified to 118 call void @pad()19 store i32 0, ptr @glbl20 ret i32 %select ; Simplifies to ret i32 121}22 23 24define i32 @outer2(i32 %val) {25; CHECK-LABEL: @outer2(26; CHECK-NOT: call i32 @inner227 %C = call i32 @inner2(i1 true, i32 %val)28 ret i32 %C29}30 31define i32 @inner2(i1 %cond, i32 %val) {32 %select = select i1 %cond, i32 1, i32 %val ; Simplifies to 133 call void @pad()34 store i32 0, ptr @glbl35 ret i32 %select ; Simplifies to ret i32 136}37 38 39define i32 @outer3(i32 %val) {40; CHECK-LABEL: @outer3(41; CHECK-NOT: call i32 @inner342 %C = call i32 @inner3(i1 false, i32 %val)43 ret i32 %C44}45 46define i32 @inner3(i1 %cond, i32 %val) {47 %select = select i1 %cond, i32 %val, i32 -1 ; Simplifies to -148 call void @pad()49 store i32 0, ptr @glbl50 ret i32 %select ; Simplifies to ret i32 -151}52 53 54define i32 @outer4() {55; CHECK-LABEL: @outer4(56; CHECK-NOT: call i32 @inner457 %C = call i32 @inner4(i1 true, i32 1, i32 -1)58 ret i32 %C59}60 61define i32 @inner4(i1 %cond, i32 %val1, i32 %val2) {62 %select = select i1 %cond, i32 %val1, i32 %val2 ; Simplifies to 163 call void @pad()64 store i32 0, ptr @glbl65 store i32 1, ptr @glbl66 ret i32 %select ; Simplifies to ret i32 167}68 69 70define i1 @outer5() {71; CHECK-LABEL: @outer5(72; CHECK-NOT: call i1 @inner573 %C = call i1 @inner5(i1 true, i1 true, i1 false)74 ret i1 %C75}76 77declare void @dead()78 79define i1 @inner5(i1 %cond, i1 %val1, i1 %val2) {80 %select = select i1 %cond, i1 %val1, i1 %val2 ; Simplifies to true81 br i1 %select, label %exit, label %isfalse ; Simplifies to br label %end82 83isfalse: ; This block is unreachable once inlined84 call void @dead()85 br label %exit86 87exit:88 store i32 0, ptr @glbl89 ret i1 %select ; Simplifies to ret i1 true90}91 92 93define i32 @outer6(i1 %cond) {94; CHECK-LABEL: @outer6(95; CHECK-NOT: call i32 @inner696 %A = alloca i3297 %C = call i32 @inner6(i1 %cond, ptr %A)98 ret i32 %C99}100 101define i32 @inner6(i1 %cond, ptr %ptr) {102 %G1 = getelementptr inbounds i32, ptr %ptr, i32 1103 %G2 = getelementptr inbounds i32, ptr %G1, i32 1104 %G3 = getelementptr inbounds i32, ptr %ptr, i32 2105 %select = select i1 %cond, ptr %G2, ptr %G3 ; Simplified to %A[2]106 %load = load i32, ptr %select ; SROA'ed107 call void @pad()108 ret i32 %load ; Simplified109}110 111 112define i32 @outer7(ptr %ptr) {113; CHECK-LABEL: @outer7(114; CHECK-NOT: call i32 @inner7115 %A = alloca i32116 %C = call i32 @inner7(i1 true, ptr %A, ptr %ptr)117 ret i32 %C118}119 120define i32 @inner7(i1 %cond, ptr %p1, ptr %p2) {121 %select = select i1 %cond, ptr %p1, ptr %p2 ; Simplifies to %A122 %load = load i32, ptr %select ; SROA'ed123 call void @pad()124 store i32 0, ptr @glbl125 ret i32 %load ; Simplified126}127 128 129define i32 @outer8(ptr %ptr) {130; CHECK-LABEL: @outer8(131; CHECK-NOT: call i32 @inner8132 %A = alloca i32133 %C = call i32 @inner8(i1 false, ptr %ptr, ptr %A)134 ret i32 %C135}136 137define i32 @inner8(i1 %cond, ptr %p1, ptr %p2) {138 %select = select i1 %cond, ptr %p1, ptr %p2 ; Simplifies to %A139 %load = load i32, ptr %select ; SROA'ed140 call void @pad()141 store i32 0, ptr @glbl142 ret i32 %load ; Simplified143}144 145 146define <2 x i32> @outer9(<2 x i32> %val) {147; CHECK-LABEL: @outer9(148; CHECK-NOT: call <2 x i32> @inner9149 %C = call <2 x i32> @inner9(<2 x i1> <i1 true, i1 true>, <2 x i32> %val)150 ret <2 x i32> %C151}152 153define <2 x i32> @inner9(<2 x i1> %cond, <2 x i32> %val) {154 %select = select <2 x i1> %cond, <2 x i32> <i32 1, i32 1>, <2 x i32> %val ; Simplifies to <1, 1>155 call void @pad()156 store i32 0, ptr @glbl157 ret <2 x i32> %select ; Simplifies to ret <2 x i32> <1, 1>158}159 160 161define <2 x i32> @outer10(<2 x i32> %val) {162; CHECK-LABEL: @outer10(163; CHECK-NOT: call <2 x i32> @inner10164 %C = call <2 x i32> @inner10(<2 x i1> <i1 false, i1 false>, <2 x i32> %val)165 ret <2 x i32> %C166}167 168define <2 x i32> @inner10(<2 x i1> %cond, <2 x i32> %val) {169 %select = select <2 x i1> %cond, < 2 x i32> %val, <2 x i32> <i32 -1, i32 -1> ; Simplifies to <-1, -1>170 call void @pad()171 store i32 0, ptr @glbl172 ret <2 x i32> %select ; Simplifies to ret <2 x i32> <-1, -1>173}174 175 176define <2 x i32> @outer11() {177; CHECK-LABEL: @outer11(178; CHECK-NOT: call <2 x i32> @inner11179 %C = call <2 x i32> @inner11(<2 x i1> <i1 true, i1 false>)180 ret <2 x i32> %C181}182 183define <2 x i32> @inner11(<2 x i1> %cond) {184 %select = select <2 x i1> %cond, <2 x i32> <i32 1, i32 1>, < 2 x i32> <i32 -1, i32 -1> ; Simplifies to <1, -1>185 call void @pad()186 ret <2 x i32> %select ; Simplifies to ret <2 x i32> <1, -1>187}188 189 190define i1 @outer12(ptr %ptr) {191; CHECK-LABEL: @outer12(192; CHECK-NOT: call i1 @inner12193 %C = call i1 @inner12(i1 true, ptr @glbl, ptr %ptr)194 ret i1 %C195}196 197define i1 @inner12(i1 %cond, ptr %ptr1, ptr %ptr2) {198 %select = select i1 %cond, ptr %ptr1, ptr %ptr2 ; Simplified to @glbl199 %cmp = icmp eq ptr %select, @glbl ; Simplified to true200 call void @pad()201 store i32 0, ptr @glbl202 ret i1 %cmp ; Simplifies to ret i1 true203}204 205 206define <2 x i32> @outer13(<2 x i32> %val1, <2 x i32> %val2) {207; CHECK-LABEL: @outer13(208; CHECK: call <2 x i32> @inner13209 %C = call <2 x i32> @inner13(<2 x i1> <i1 true, i1 false>, <2 x i32> %val1, <2 x i32> %val2)210 ret <2 x i32> %C211}212 213define <2 x i32> @inner13(<2 x i1> %cond, <2 x i32> %val1, < 2 x i32> %val2) {214 %select = select <2 x i1> %cond, <2 x i32> %val1, < 2 x i32> %val2 ; Cannot be Simplified215 call void @pad()216 store i32 0, ptr @glbl217 store i32 1, ptr @glbl218 ret <2 x i32> %select ; Simplified219}220 221 222define i32 @outer14(i32 %val1, i32 %val2) {223; CHECK-LABEL: @outer14(224; CHECK-NOT: call i32 @inner14225 %C = call i32 @inner14(i1 true, i32 %val1, i32 %val2)226 ret i32 %C227}228 229define i32 @inner14(i1 %cond, i32 %val1, i32 %val2) {230 %select = select i1 %cond, i32 %val1, i32 %val2 ; Simplified to %val1231 call void @pad()232 store i32 0, ptr @glbl233 store i32 1, ptr @glbl234 ret i32 %select ; Simplifies to ret i32 %val1235}236 237 238define i32 @outer15(i32 %val1, i32 %val2) {239; CHECK-LABEL: @outer15(240; CHECK-NOT: call i32 @inner15241 %C = call i32 @inner15(i1 false, i32 %val1, i32 %val2)242 ret i32 %C243}244 245define i32 @inner15(i1 %cond, i32 %val1, i32 %val2) {246 %select = select i1 %cond, i32 %val1, i32 %val2 ; Simplified to %val2247 call void @pad()248 store i32 0, ptr @glbl249 store i32 1, ptr @glbl250 ret i32 %select ; Simplifies to ret i32 %val2251}252