On Fri, Dec 20, 2024 at 11:31:00AM +0100, Peter Zijlstra wrote: > Also, curse the DRM Makefiles, you can't do: > > make drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.s Small tip: You can get the path of the target by building drivers/gpu/drm/amd/amdgpu/ and finding it in the output. In this case, it'd be $ make drivers/gpu/drm/amd/amdgpu/../display/dc/basics/fixpt31_32.s Not excusing that it does not work as it should but sometimes you have to work with what you can *shrug* > > $ clang --version | head -1 > > clang version 20.0.0git (https://github.com/llvm/llvm-project.git > > 8daf4f16fa08b5d876e98108721dd1743a360326) > > So I didn't have a recent build at hand.. so I've not validated the > below. ... > If you put them size-by-side, you'll see it's more or less the same > code-gen (trivial differences), but now it just stops code-gen, where > previously it would continue. > > So this really is a compiler problem, this needs no annotation, it's > straight up broken. > > Now, the thing is, these ASSERT()s are checking for divide-by-zero, I > suspect clang figured that out and invokes UB on us and just stops > code-gen. Yeah, I think your analysis is spot on, as this was introduced by a change in clang from a few months ago according to my bisect: https://github.com/llvm/llvm-project/commit/37932643abab699e8bb1def08b7eb4eae7ff1448 Since the ASSERT does not do anything to prevent the divide by zero (it just flags it with WARN_ON) and the rest of the code doesn't either, I assume that the codegen stops as soon as it encounters the unreachable that change created from the path where divide by zero would occur via dc_fixpt_recip() -> dc_fixpt_from_fraction() -> complete_integer_division_u64() -> div64_u64_rem() Shouldn't callers of division functions harden them against dividing by zero? > Nathan, Nick, don't we have a compiler flag that forces __builtin_trap() > whenever clang pulls something like this? I think UBSAN does this, but > we really shouldn't pull in the whole of that for sanity. Right, I think that LLVM has a hidden flag for this: -mllvm -trap-unreachable That makes this particular warning disappear. It isn't the greatest because '-mllvm' flags need to be passed along to the linker for LTO but that's easy enough to deal with. I know we have talked about enabling that flag in the past but I cannot remember why we decided against it (maybe code size concerns and other optimization restrictions)? It looks like GCC has a similar flag, -funreachable-traps. Cheers, Nathan