brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 57175fa Raw
204 lines · plain
1; RUN: opt -S -passes=always-inline < %s | FileCheck %s2 3declare void @f()4declare i32 @g()5declare fastcc i32 @g.fastcc()6 7define i32 @callee_0() alwaysinline {8 entry:9  call void @f()10  ret i32 211}12 13define i32 @caller_0() {14; CHECK-LABEL: @caller_0(15 entry:16; CHECK: entry:17; CHECK-NEXT: call void @f()18; CHECK-NEXT: ret i32 219  %x = call i32 @callee_0() [ "deopt"(i32 5) ]20  ret i32 %x21}22 23define i32 @callee_1() alwaysinline {24 entry:25  call void @f() [ "deopt"() ]26  call void @f() [ "deopt"(i32 0, i32 1) ]27  call void @f() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]28  ret i32 229}30 31define i32 @caller_1() {32; CHECK-LABEL: @caller_1(33 entry:34; CHECK: entry:35; CHECK-NEXT:  call void @f() [ "deopt"(i32 5) ]36; CHECK-NEXT:  call void @f() [ "deopt"(i32 5, i32 0, i32 1) ]37; CHECK-NEXT:  call void @f() [ "deopt"(i32 5, i32 0, i32 1), "foo"(double 0.000000e+00) ]38; CHECK-NEXT:  ret i32 239 40  %x = call i32 @callee_1() [ "deopt"(i32 5) ]41  ret i32 %x42}43 44define i32 @callee_2() alwaysinline {45 entry:46  %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]47  ret i32 %v48}49 50define i32 @caller_2(i32 %val) {51; CHECK-LABEL: @caller_2(52 entry:53; CHECK: entry:54; CHECK-NEXT:   [[RVAL:%[^ ]+]] = call i32 @g() [ "deopt"(i32 %val, i32 0, i32 1), "foo"(double 0.000000e+00) ]55; CHECK-NEXT:   ret i32 [[RVAL]]56  %x = call i32 @callee_2() [ "deopt"(i32 %val) ]57  ret i32 %x58}59 60define i32 @callee_3() alwaysinline {61 entry:62  %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]63  ret i32 %v64}65 66define i32 @caller_3() personality i8 3 {67; CHECK-LABEL: @caller_3(68 entry:69  %x = invoke i32 @callee_3() [ "deopt"(i32 7) ] to label %normal unwind label %unwind70; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]71 72 normal:73  ret i32 %x74 75 unwind:76  %cleanup = landingpad i8 cleanup77  ret i32 10178}79 80define i32 @callee_4() alwaysinline personality i8 3 {81 entry:82  %v = invoke i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind83 84 normal:85  ret i32 %v86 87 unwind:88  %cleanup = landingpad i8 cleanup89  ret i32 10090}91 92define i32 @caller_4() {93; CHECK-LABEL: @caller_4(94 entry:95; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]96  %x = call i32 @callee_4() [ "deopt"(i32 7) ]97  ret i32 %x98}99 100define i32 @callee_5() alwaysinline personality i8 3 {101 entry:102  %v = invoke fastcc i32 @g.fastcc() #0 [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind103 104 normal:105  ret i32 %v106 107 unwind:108  %cleanup = landingpad i8 cleanup109  ret i32 100110}111 112define i32 @caller_5() {113; CHECK-LABEL: @caller_5(114 entry:115; CHECK:  invoke fastcc i32 @g.fastcc() #[[FOO_BAR_ATTR_IDX:[0-9]+]] [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]116  %x = call i32 @callee_5() [ "deopt"(i32 7) ]117  ret i32 %x118}119 120define i32 @callee_6() alwaysinline personality i8 3 {121 entry:122  %v = call fastcc i32 @g.fastcc() #0 [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]123  ret i32 %v124}125 126define i32 @caller_6() {127; CHECK-LABEL: @caller_6(128 entry:129; CHECK: call fastcc i32 @g.fastcc() #[[FOO_BAR_ATTR_IDX]] [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]130  %x = call i32 @callee_6() [ "deopt"(i32 7) ]131  ret i32 %x132}133 134define i32 @callee_7(i1 %val) alwaysinline personality i8 3 {135; We want something that PruningFunctionCloner is not smart enough to136; recognize, but can be recognized by recursivelySimplifyInstruction.137 138 entry:139  br i1 %val, label %check, label %precheck140 141 precheck:142  br label %check143 144 check:145  %p = phi i1 [ %val, %entry ], [ true, %precheck ]146  br i1 %p, label %do.not, label %do147 148 do.not:149  ret i32 0150 151 do:152  %v = call fastcc i32 @g.fastcc() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]153  ret i32 %v154}155 156define i32 @caller_7() {157; CHECK-LABEL: @caller_7(158 entry:159; CHECK-NOT: call fastcc i32 @g.fastcc()160; CHECK: ret i32 0161  %x = call i32 @callee_7(i1 true) [ "deopt"(i32 7) ]162  ret i32 %x163}164 165define i32 @callee_8(i1 %val) alwaysinline personality i8 3 {166; We want something that PruningFunctionCloner is not smart enough to167; recognize, but can be recognized by recursivelySimplifyInstruction.168 169 entry:170  br i1 %val, label %check, label %precheck171 172 precheck:173  br label %check174 175 check:176  %p = phi i1 [ %val, %entry ], [ true, %precheck ]177  br i1 %p, label %do.not, label %do178 179 do.not:180  ret i32 0181 182 do:183  %phi = phi i32 [ 0, %check ], [ %v, %do ]184  %v = call fastcc i32 @g.fastcc() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]185  %ic = icmp eq i32 %v, 42186  br i1 %ic, label %do, label %done187 188 done:189  ret i32 %phi190}191 192define i32 @caller_8() {193; CHECK-LABEL: @caller_8(194 entry:195; CHECK-NOT: call fastcc i32 @g.fastcc()196; CHECK: ret i32 0197  %x = call i32 @callee_8(i1 true) [ "deopt"(i32 7) ]198  ret i32 %x199}200 201attributes #0 = { "foo"="bar" }202 203; CHECK: attributes #[[FOO_BAR_ATTR_IDX]] = { "foo"="bar" }204