MatzeB wrote: I think I traced the clang regression down to `InlineCostCallAnalyzer::isColdCallSite` returning `true` in more instances. It previously did not do that because of what feels more like an accidental loss of precision:
The example I analyzed starts out as a single-block function with a call resulting in this BFI: ``` - entry: float = 1.0, int = 8 ``` It seems that when we inline calls we just scale their BFI values to the callsite. And given that the entry block only had a factor of `int = 8` we have basically no precision left on the low-end. So after inlining a bit more the BFI in my example looks like this: ``` - entry: float = 1.0, int = 8 - if.then.i: float = 0.0, int = 0 - if.else.i: float = 0.0, int = 7 - if.end15.sink.split.i: float = 0.0, int = 0 - if.end15.i: float = 0.0, int = 8 - if.then19.i: float = 0.0, int = 5 - _ZN4llvm12DenseMapBaseINS_8DenseMapIPNS_10StructTypeEPNS_12StructLayoutENS_12DenseMapInfoIS3_vEENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E20InsertIntoBucketImplIS3_EEPSA_RKS3_RKT_SE_.exit: float = 0.0, int = 8 ``` Note that some blocks frequencies got scaled down to `0`. But more importantly no matter what we do it is impossible to have any code marked as "cold" in this situation. Because the cold code threshold is computed as 2% of the entry block frequency. With an entry block value of `int = 8` the 2% cold-threshold is integer `0` and it is effectively impossible for any block to be below that threshold. In comparison with the new conversion scheme we end up with: ``` - entry: float = 1.0, int = 18014398509481984 - if.then.i: float = 0.0, int = 9002696048640 - if.else.i: float = 0.0, int = 18005395813433344 - if.end15.sink.split.i: float = 0.0, int = 18000892999733 - if.end15.i: float = 0.0, int = 18014398509481984 - if.then19.i: float = 0.0, int = 11258999068426240 - _ZN4llvm12DenseMapBaseINS_8DenseMapIPNS_10StructTypeEPNS_12StructLayoutENS_12DenseMapInfoIS3_vEENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E20InsertIntoBucketImplIS3_EEPSA_RKS3_RKT_SE_.exit: float = 0.0, int = 18014398509481984 ``` for the same situation and blocks like `if.end15.sink.split.i` end up being classified as cold code now. https://github.com/llvm/llvm-project/pull/66285 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits