pengfei updated this revision to Diff 387147. pengfei marked 3 inline comments as done. pengfei added a comment. Herald added a subscriber: dexonsmith.
Address review comments. 1. Add support for `-mno-skip-rax-setup` and its test; 2. Use module flag metadata instead of command line option in backend; Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D112413/new/ https://reviews.llvm.org/D112413 Files: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/CodeGenModule.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/CodeGen/pr23258.c clang/test/Driver/x86_features.c llvm/lib/Target/X86/X86ISelLowering.cpp llvm/test/CodeGen/X86/pr23258.ll
Index: llvm/test/CodeGen/X86/pr23258.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/pr23258.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=HAS-RAX +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse | FileCheck %s --check-prefix=HAS-RAX +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-sse | FileCheck %s --check-prefix=NO-RAX + +define dso_local void @foo() nounwind { +; HAS-RAX-LABEL: foo: +; HAS-RAX: # %bb.0: # %entry +; HAS-RAX-NEXT: movl $1, %edi +; HAS-RAX-NEXT: xorl %eax, %eax +; HAS-RAX-NEXT: jmp bar # TAILCALL +; +; NO-RAX-LABEL: foo: +; NO-RAX: # %bb.0: # %entry +; NO-RAX-NEXT: movl $1, %edi +; NO-RAX-NEXT: jmp bar # TAILCALL +entry: + tail call void (i32, ...) @bar(i32 1) + ret void +} + +declare dso_local void @bar(i32, ...) + +!llvm.module.flags = !{!0} +!0 = !{i32 4, !"SkipRaxSetup", i32 1} Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4414,7 +4414,8 @@ } } - if (Is64Bit && isVarArg && !IsWin64 && !IsMustTail) { + if (Is64Bit && isVarArg && !IsWin64 && !IsMustTail && + (Subtarget.hasSSE1() || !M->getModuleFlag("SkipRaxSetup"))) { // From AMD64 ABI document: // For calls that may call functions that use varargs or stdargs // (prototype-less calls or calls to functions containing ellipsis (...) in Index: clang/test/Driver/x86_features.c =================================================================== --- clang/test/Driver/x86_features.c +++ clang/test/Driver/x86_features.c @@ -5,3 +5,9 @@ // Test that we don't produce an error with -mieee-fp. // RUN: %clang -### %s -mieee-fp -S 2>&1 | FileCheck --check-prefix=IEEE %s // IEEE-NOT: error: unknown argument + +// RUN: %clang -### %s -mskip-rax-setup -S 2>&1 | FileCheck --check-prefix=SRS %s +// SRS: "-mskip-rax-setup" + +// RUN: %clang -### %s -mno-skip-rax-setup -S 2>&1 | FileCheck --check-prefix=NO-SRS %s +// NO-SRS-NOT: "-mskip-rax-setup" Index: clang/test/CodeGen/pr23258.c =================================================================== --- /dev/null +++ clang/test/CodeGen/pr23258.c @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=NO-SKIP +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -mskip-rax-setup -emit-llvm %s -o - | FileCheck %s -check-prefix=SKIP + +void f() {} + +// SKIP: !"SkipRaxSetup", i32 1} +// NO-SKIP-NOT: "SkipRaxSetup" Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -2194,6 +2194,11 @@ CmdArgs.push_back("-x86-asm-syntax=intel"); } + if (Arg *A = Args.getLastArg(options::OPT_mskip_rax_setup, + options::OPT_mno_skip_rax_setup)) + if (A->getOption().matches(options::OPT_mskip_rax_setup)) + CmdArgs.push_back(Args.MakeArgString("-mskip-rax-setup")); + // Set flags to support MCU ABI. if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) { CmdArgs.push_back("-mfloat-abi"); Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -813,6 +813,8 @@ getCodeGenOpts().StackProtectorGuardOffset); if (getCodeGenOpts().StackAlignment) getModule().setOverrideStackAlignment(getCodeGenOpts().StackAlignment); + if (getCodeGenOpts().SkipRaxSetup) + getModule().addModuleFlag(llvm::Module::Override, "SkipRaxSetup", 1); getTargetCodeGenInfo().emitTargetMetadata(*this, MangledDeclNames); Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -3189,6 +3189,10 @@ HelpText<"Disable function outlining (AArch64 only)">; def mno_ms_bitfields : Flag<["-"], "mno-ms-bitfields">, Group<m_Group>, HelpText<"Do not set the default structure layout to be compatible with the Microsoft compiler standard">; +def mskip_rax_setup : Flag<["-"], "mskip-rax-setup">, Group<m_Group>, Flags<[CC1Option]>, + HelpText<"Skip setting up RAX register when passing variable arguments (x86 only)">, + MarshallingInfoFlag<CodeGenOpts<"SkipRaxSetup">>; +def mno_skip_rax_setup : Flag<["-"], "mno-skip-rax-setup">, Group<m_Group>, Flags<[CC1Option]>; def mstackrealign : Flag<["-"], "mstackrealign">, Group<m_Group>, Flags<[CC1Option]>, HelpText<"Force realign the stack at entry to every function">, MarshallingInfoFlag<CodeGenOpts<"StackRealignment">>; Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -452,6 +452,9 @@ ENUM_CODEGENOPT(SwiftAsyncFramePointer, SwiftAsyncFramePointerKind, 2, SwiftAsyncFramePointerKind::Always) +/// Whether to skip RAX setup when passing variable arguments. +CODEGENOPT(SkipRaxSetup, 1, 0) + #undef CODEGENOPT #undef ENUM_CODEGENOPT #undef VALUE_CODEGENOPT
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits