brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · d46ca0b Raw
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