1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
; RUN: opt -S -inline -mtriple=arm-eabi -pass-remarks=.* -pass-remarks-missed=.* < %s 2>&1 | FileCheck %s -check-prefix=NOFP
; RUN: opt -S -inline -mtriple=arm-eabi -mattr=+vfp2 -pass-remarks=.* -pass-remarks-missed=.* < %s 2>&1 | FileCheck %s -check-prefix=FULLFP
; RUN: opt -S -inline -mtriple=arm-eabi -mattr=+vfp2,-fp64 -pass-remarks=.* -pass-remarks-missed=.* < %s 2>&1 | FileCheck %s -check-prefix=SINGLEFP
; Make sure that soft float implementations are calculated as being more expensive
; to the inliner.
; NOFP-DAG: 'single' not inlined into 'test_single' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'single' not inlined into 'test_single' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15, threshold=75)
; NOFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15015, threshold=75)
; NOFP-DAG: 'double' not inlined into 'test_double' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'double' not inlined into 'test_double' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; NOFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
; NOFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
; FULLFP-DAG: 'single' inlined into 'test_single' with (cost=0, threshold=75)
; FULLFP-DAG: 'single' inlined into 'test_single' with (cost=-15000, threshold=75)
; FULLFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15, threshold=75)
; FULLFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15015, threshold=75)
; FULLFP-DAG: 'double' inlined into 'test_double' with (cost=0, threshold=75)
; FULLFP-DAG: 'double' inlined into 'test_double' with (cost=-15000, threshold=75)
; FULLFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; FULLFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; FULLFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
; FULLFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
; SINGLEFP-DAG: 'single' inlined into 'test_single' with (cost=0, threshold=75)
; SINGLEFP-DAG: 'single' inlined into 'test_single' with (cost=-15000, threshold=75)
; SINGLEFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15, threshold=75)
; SINGLEFP-DAG: 'single_cheap' inlined into 'test_single_cheap' with (cost=-15015, threshold=75)
; SINGLEFP-DAG: 'double' not inlined into 'test_double' because too costly to inline (cost=125, threshold=75)
; SINGLEFP-DAG: 'double' not inlined into 'test_double' because too costly to inline (cost=125, threshold=75)
; SINGLEFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; SINGLEFP-DAG: 'single_force_soft' not inlined into 'test_single_force_soft' because too costly to inline (cost=125, threshold=75)
; SINGLEFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
; SINGLEFP-DAG: 'single_force_soft_fneg' not inlined into 'test_single_force_soft_fneg' because too costly to inline (cost=100, threshold=75)
define i32 @test_single(i32 %a, i8 %b, i32 %c, i8 %d) #0 {
%call = call float @single(i32 %a, i8 zeroext %b)
%call2 = call float @single(i32 %c, i8 zeroext %d)
ret i32 0
}
define i32 @test_single_cheap(i32 %a, i8 %b, i32 %c, i8 %d) #0 {
%call = call float @single_cheap(i32 %a, i8 zeroext %b)
%call2 = call float @single_cheap(i32 %c, i8 zeroext %d)
ret i32 0
}
define i32 @test_double(i32 %a, i8 %b, i32 %c, i8 %d) #0 {
%call = call double @double(i32 %a, i8 zeroext %b)
%call2 = call double @double(i32 %c, i8 zeroext %d)
ret i32 0
}
define i32 @test_single_force_soft(i32 %a, i8 %b, i32 %c, i8 %d) #1 {
%call = call float @single_force_soft(i32 %a, i8 zeroext %b) #1
%call2 = call float @single_force_soft(i32 %c, i8 zeroext %d) #1
ret i32 0
}
define i32 @test_single_force_soft_fneg(i32 %a, i8 %b, i32 %c, i8 %d) #1 {
%call = call float @single_force_soft_fneg(i32 %a, i8 zeroext %b) #1
%call2 = call float @single_force_soft_fneg(i32 %c, i8 zeroext %d) #1
ret i32 0
}
define internal float @single(i32 %response, i8 zeroext %value1) #0 {
entry:
%conv = zext i8 %value1 to i32
%sub = add nsw i32 %conv, -1
%conv1 = sitofp i32 %sub to float
%0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1)
%mul = fmul float %0, 2.620000e+03
%conv2 = sitofp i32 %response to float
%sub3 = fsub float %conv2, %mul
%div = fdiv float %sub3, %mul
ret float %div
}
define internal float @single_cheap(i32 %response, i8 zeroext %value1) #0 {
entry:
%conv = zext i8 %value1 to i32
%sub = add nsw i32 %conv, -1
%conv1 = bitcast i32 %sub to float
%conv2 = bitcast i32 %response to float
%0 = tail call float @llvm.pow.f32(float %conv2, float %conv1)
%1 = tail call float @llvm.pow.f32(float %0, float %0)
%2 = tail call float @llvm.pow.f32(float %1, float %1)
ret float %2
}
define internal double @double(i32 %response, i8 zeroext %value1) #0 {
entry:
%conv = zext i8 %value1 to i32
%sub = add nsw i32 %conv, -1
%conv1 = sitofp i32 %sub to double
%0 = tail call double @llvm.pow.f64(double 0x3FF028F5C0000000, double %conv1)
%mul = fmul double %0, 2.620000e+03
%conv2 = sitofp i32 %response to double
%sub3 = fsub double %conv2, %mul
%div = fdiv double %sub3, %mul
ret double %div
}
define internal float @single_force_soft(i32 %response, i8 zeroext %value1) #1 {
entry:
%conv = zext i8 %value1 to i32
%sub = add nsw i32 %conv, -1
%conv1 = sitofp i32 %sub to float
%0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1)
%mul = fmul float %0, 2.620000e+03
%conv2 = sitofp i32 %response to float
%sub3 = fsub float %conv2, %mul
%div = fdiv float %sub3, %mul
ret float %div
}
define internal float @single_force_soft_fneg(i32 %response, i8 zeroext %value1) #1 {
entry:
%conv = zext i8 %value1 to i32
%sub = add nsw i32 %conv, -1
%conv1 = sitofp i32 %sub to float
%0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1)
%mul = fsub float -0.0, %0
%conv2 = sitofp i32 %response to float
%sub3 = fsub float %conv2, %mul
%div = fdiv float %sub3, %mul
ret float %div
}
declare float @llvm.pow.f32(float, float) optsize minsize
declare double @llvm.pow.f64(double, double) optsize minsize
attributes #0 = { optsize }
attributes #1 = { optsize "use-soft-float"="true" "target-features"="+soft-float" }
|