[hoisting] Fix reporting logic

Summary: We don't want to use Cost analysis results when `Config.hoisting_report_only_expensive` is false

Reviewed By: ezgicicek

Differential Revision: D14124555

fbshipit-source-id: e809bb80a
master
Mehdi Bouaziz 6 years ago committed by Facebook Github Bot
parent 60bde6da6e
commit b212f1ce6c

@ -79,36 +79,40 @@ let model_satisfies ~f tenv pname =
InvariantModels.ProcName.dispatch tenv pname |> Option.exists ~f InvariantModels.ProcName.dispatch tenv pname |> Option.exists ~f
let get_issue_to_report tenv Call.({pname; node; params}) integer_type_widths inferbo_invariant_map let is_call_expensive Call.({pname; node; params}) integer_type_widths inferbo_invariant_map =
= (* only report if function call has expensive/symbolic cost *)
(* If a function is modeled as variant for hoisting (like match Ondemand.analyze_proc_name pname with
List.size or __cast ), we don't want to report it *) | Some ({Summary.payloads= {Payloads.cost= Some {CostDomain.post= cost_record}}} as summary)
let is_variant_for_hoisting = when CostDomain.BasicCost.is_symbolic (CostDomain.get_operation_cost cost_record) ->
model_satisfies ~f:InvariantModels.is_variant_for_hoisting tenv pname let last_node = InstrCFG.last_of_underlying_node node in
in let instr_node_id = InstrCFG.Node.id last_node in
let inferbo_invariant_map = Lazy.force inferbo_invariant_map in
let inferbo_mem =
Option.value_exn (BufferOverrunAnalysis.extract_pre instr_node_id inferbo_invariant_map)
in
let callee_formals = Summary.get_proc_desc summary |> Procdesc.get_pvar_formals in
let loc = InstrCFG.Node.loc last_node in
(* get the cost of the function call *)
Cost.instantiate_cost integer_type_widths ~inferbo_caller_mem:inferbo_mem ~callee_pname:pname
~callee_formals ~params
~callee_cost:(CostDomain.get_operation_cost cost_record)
~loc
|> CostDomain.BasicCost.is_symbolic
| _ ->
false
let get_issue_to_report tenv (Call.({pname}) as call) integer_type_widths inferbo_invariant_map =
let report_invariant = let report_invariant =
((not is_variant_for_hoisting) && not Config.hoisting_report_only_expensive) if Config.hoisting_report_only_expensive then
|| is_call_expensive call integer_type_widths inferbo_invariant_map
(* only report if function call has expensive/symbolic cost *) else
match Ondemand.analyze_proc_name pname with (* If a function is modeled as variant for hoisting (like
| Some ({Summary.payloads= {Payloads.cost= Some {CostDomain.post= cost_record}}} as summary) List.size or __cast ), we don't want to report it *)
when CostDomain.BasicCost.is_symbolic (CostDomain.get_operation_cost cost_record) -> let is_variant_for_hoisting =
let last_node = InstrCFG.last_of_underlying_node node in model_satisfies ~f:InvariantModels.is_variant_for_hoisting tenv pname
let instr_node_id = InstrCFG.Node.id last_node in in
let inferbo_invariant_map = Lazy.force inferbo_invariant_map in not is_variant_for_hoisting
let inferbo_mem =
Option.value_exn (BufferOverrunAnalysis.extract_pre instr_node_id inferbo_invariant_map)
in
let callee_formals = Summary.get_proc_desc summary |> Procdesc.get_pvar_formals in
let loc = InstrCFG.Node.loc last_node in
(* get the cost of the function call *)
Cost.instantiate_cost integer_type_widths ~inferbo_caller_mem:inferbo_mem
~callee_pname:pname ~callee_formals ~params
~callee_cost:(CostDomain.get_operation_cost cost_record)
~loc
|> CostDomain.BasicCost.is_symbolic
| _ ->
false
in in
if report_invariant then if report_invariant then
if model_satisfies ~f:InvariantModels.is_invariant tenv pname then if model_satisfies ~f:InvariantModels.is_invariant tenv pname then

@ -106,19 +106,15 @@ let all_checkers =
; active= Config.uninit ; active= Config.uninit
; callbacks= [(Procedure Uninit.checker, Language.Clang)] } ; callbacks= [(Procedure Uninit.checker, Language.Clang)] }
; { name= "cost analysis" ; { name= "cost analysis"
; active= Config.cost ; active= Config.cost || (Config.loop_hoisting && Config.hoisting_report_only_expensive)
; callbacks= [(Procedure Cost.checker, Language.Clang); (Procedure Cost.checker, Language.Java)] ; callbacks= [(Procedure Cost.checker, Language.Clang); (Procedure Cost.checker, Language.Java)]
} }
; { name= "loop hoisting" ; { name= "loop hoisting"
; active= Config.loop_hoisting ; active= Config.loop_hoisting
; callbacks= ; callbacks=
( (Procedure Hoisting.checker, Language.Clang) (Procedure Hoisting.checker, Language.Clang)
:: (Procedure Hoisting.checker, Language.Java) :: (Procedure Hoisting.checker, Language.Java)
:: :: (if Config.purity then [(Procedure Purity.checker, Language.Java)] else []) }
( if Config.hoisting_report_only_expensive then
[(Procedure Cost.checker, Language.Clang); (Procedure Cost.checker, Language.Java)]
else [] )
@ if Config.purity then [(Procedure Purity.checker, Language.Java)] else [] ) }
; { name= "Starvation analysis" ; { name= "Starvation analysis"
; active= Config.starvation ; active= Config.starvation
; callbacks= ; callbacks=

Loading…
Cancel
Save