[llvm] [X86] Resolve FIXME: Create cld only when needed (PR #82415)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 21 08:56:57 PST 2024


================
@@ -2194,13 +2194,35 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
   // flag (DF in EFLAGS register). Clear this flag by creating "cld" instruction
   // in each prologue of interrupt handler function.
   //
-  // FIXME: Create "cld" instruction only in these cases:
+  // Create "cld" instruction only in these cases:
   // 1. The interrupt handling function uses any of the "rep" instructions.
   // 2. Interrupt handling function calls another function.
   //
-  if (Fn.getCallingConv() == CallingConv::X86_INTR)
-    BuildMI(MBB, MBBI, DL, TII.get(X86::CLD))
-        .setMIFlag(MachineInstr::FrameSetup);
+  if (Fn.getCallingConv() == CallingConv::X86_INTR) {
+    bool NeedsCLD = false;
+
+    // Check if the function calls another function.
+    for (const BasicBlock &BB : Fn) {
+      for (const Instruction &I : BB) {
+        if (isa<CallInst>(I)) {
+          NeedsCLD = true;
+          break;
+        }
+
+        // Check for rep opcode.
+        unsigned Opcode = I.getOpcode();
+        if (X86::REP_MOVSB_32 <= Opcode && Opcode <= X86::REP_STOSW_64) {
----------------
AtariDreams wrote:

> I'm not sure I like the range check here. At the very least can you static_assert the expected size of the range in case something is added in the future that shouldn't be here.

The range is contiguous, so all numbers in the range are already taken.

https://github.com/llvm/llvm-project/pull/82415


More information about the llvm-commits mailing list