[llvm] Fix stack layout for frames larger than 2gb (PR #84114)
    Wesley Wiser via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Mar  8 08:21:19 PST 2024
    
    
  
================
@@ -1419,7 +1419,7 @@ class DarwinX86AsmBackend : public X86AsmBackend {
         unsigned Reg = *MRI.getLLVMRegNum(Inst.getRegister(), true);
         SavedRegs[SavedRegIdx++] = Reg;
         StackAdjust += OffsetSize;
-        MinAbsOffset = std::min(MinAbsOffset, abs(Inst.getOffset()));
+        MinAbsOffset = std::min<int64_t>(MinAbsOffset, llabs(Inst.getOffset()));
----------------
wesleywiser wrote:
I think so but advice would be appreciated! My understanding is that on *nix, `long` is a 64-bit signed integer while on Windows, `long` is a 32-bit signed integer. Therefore `labs` is sufficient on *nix where `int64_t` and `long` are both 64-bit but will cause incorrect results on Windows as the `int64_t` will be shortened to a 32-bit `long`. 
Using `llabs` will work correctly on Windows as `long long` is a 64-bit signed integer but on *nix will cause a promotion from `int64_t` to a 128-bit integer and then subsequent conversion back to 64-bit. I think this is ~fine but inefficient.
I looked briefly to see if there was an LLVM utility function somewhere with an implementation of `abs` for `int64_t` but didn't find anything. Is there a better way to handle this?  
https://github.com/llvm/llvm-project/pull/84114
    
    
More information about the llvm-commits
mailing list