brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · bc42faf Raw
146 lines · plain
1; RUN: opt -passes=inline %s -S | FileCheck %s2 3 4; Ordinary function is inlined into strictfp function.5 6define float @inlined_01(float %a) {7entry:8  %add = fadd float %a, %a9  ret float %add10}11 12define float @host_02(float %a) #0 {13entry:14  %0 = call float @inlined_01(float %a) #015  %add = call float @llvm.experimental.constrained.fadd.f32(float %0, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #016  ret float %add17; CHECK-LABEL: @host_0218; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore") #019; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #020}21 22 23; strictfp function is inlined into another strictfp function.24 25define float @inlined_03(float %a) #0 {26entry:27  %add = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.downward", metadata !"fpexcept.maytrap") #028  ret float %add29}30 31define float @host_04(float %a) #0 {32entry:33  %0 = call float @inlined_03(float %a) #034  %add = call float @llvm.experimental.constrained.fadd.f32(float %0, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #035  ret float %add36; CHECK-LABEL: @host_0437; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.downward", metadata !"fpexcept.maytrap") #038; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #039}40 41 42; strictfp function is NOT inlined into ordinary function.43 44define float @inlined_05(float %a) strictfp {45entry:46  %add = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.downward", metadata !"fpexcept.maytrap") #047  ret float %add48}49 50define float @host_06(float %a) {51entry:52  %0 = call float @inlined_05(float %a)53  %add = fadd float %0, 2.000000e+0054  ret float %add55; CHECK-LABEL: @host_0656; CHECK: call float @inlined_05(float %a)57; CHECK: fadd float %0, 2.000000e+0058}59 60 61; Calls in inlined function must get strictfp attribute.62 63declare float @func_ext(float);64 65define float @inlined_07(float %a) {66entry:67  %0 = call float @func_ext(float %a)68  %add = fadd float %0, %a69 70  ret float %add71}72 73define float @host_08(float %a) #0 {74entry:75  %0 = call float @inlined_07(float %a) #076  %add = call float @llvm.experimental.constrained.fadd.f32(float %0, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #077  ret float %add78; CHECK-LABEL: @host_0879; CHECK: call float @func_ext(float {{.*}}) #080; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore") #081; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #082}83 84 85; Cloning particular instructions.86 87; fpext has two overloaded types.88define double @inlined_09(float %a) {89entry:90  %t = fpext float %a to double91  ret double %t92}93 94define double @host_10(float %a) #0 {95entry:96  %0 = call double @inlined_09(float %a) #097  %add = call double @llvm.experimental.constrained.fadd.f64(double %0, double 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #098  ret double %add99; CHECK-LABEL: @host_10100; CHECK: call double @llvm.experimental.constrained.fpext.f64.f32(float {{.*}}, metadata !"fpexcept.ignore") #0101; CHECK: call double @llvm.experimental.constrained.fadd.f64(double {{.*}}, double 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #0102}103 104; fcmp does not depend on rounding mode and has metadata argument.105define i1 @inlined_11(float %a, float %b) {106entry:107  %t = fcmp oeq float %a, %b108  ret i1 %t109}110 111define i1 @host_12(float %a, float %b) #0 {112entry:113  %add = call float @llvm.experimental.constrained.fadd.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") #0114  %cmp = call i1 @inlined_11(float %a, float %b) #0115  ret i1 %cmp116; CHECK-LABEL: @host_12117; CHECK: call float @llvm.experimental.constrained.fadd.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") #0118; CHECK: call i1 @llvm.experimental.constrained.fcmp.f32(float {{.*}}, metadata !"oeq", metadata !"fpexcept.ignore") #0119}120 121; Intrinsic 'ceil' has constrained variant.122define float @inlined_13(float %a) {123entry:124  %t = call float @llvm.ceil.f32(float %a)125  ret float %t126}127 128define float @host_14(float %a) #0 {129entry:130  %0 = call float @inlined_13(float %a) #0131  %add = call float @llvm.experimental.constrained.fadd.f32(float %0, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #0132  ret float %add133; CHECK-LABEL: @host_14134; CHECK: call float @llvm.experimental.constrained.ceil.f32(float %a, metadata !"fpexcept.ignore") #0135; CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float 2.000000e+00, metadata !"round.dynamic", metadata !"fpexcept.strict") #0136}137 138attributes #0 = { strictfp }139 140declare float  @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)141declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)142declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)143declare i1     @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)144declare float  @llvm.experimental.constrained.ceil.f32(float, metadata)145declare float  @llvm.ceil.f32(float)146