[PATCH] D60719: Demonstrate how to fix freestanding for memcpy

Clement Courbet via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 17 01:37:43 PDT 2019


courbet added a comment.

As discussed offline, I think this should go through an RFC process.

I guess the main reservation that people will have is that this might generate a very large number of load stores (because we don't have a good way to generate loops here). This is not an issue for X86 because of REPMOVS, but it would be cool to have the opinion of people familiar with other architectures. One way to tackle this issue could be to expand existing `mem*` functions before the DAG. This is already happening for `memcmp` in `ExpandMemcmp`, which could be made aware of this flag. Similar approaches could be used for other `mem*` functions. But eventually this has to be handled here as the dag itself can call `getMemcpy()`.

Also, the current approach does not protect against current users and future unsavvy users calling `SelectionDAG::getMemcpy` with `AlwaysAlign == false`, so what about actually retrieving the flag //within// the function instead of outside ? This happens e.g. in `SelectionDAG::visitMemPCpyCall()`m `AArch64TargetLowering::LowerCall` and others.



================
Comment at: clang/test/CodeGen/freestanding-disables-libc.c:6
+
+// NOTE: Test that assembly doesn't call memcpy function in freestanding mode.
+// RUN: %clang_cc1 -triple i386-unknown-unknown -O2 -S %s -o - | grep 'memcpy'
----------------
That's the responsibility of LLVM, so this test should be in `llvm/test/Codegen`.


================
Comment at: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:6093
 
+  assert(MF->getFunction().getParent()->getModuleFlag("force-inline-libc") ==
+         nullptr);
----------------
Please add an error message (maybe "modules with 'force-inline-libc' should never emit library calls")


================
Comment at: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:5483
 
+static bool IsForceInlineLibc(const SelectionDAG &DAG) {
+  const Module *M = DAG.getMachineFunction().getFunction().getParent();
----------------
isForceInlineLibc


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60719/new/

https://reviews.llvm.org/D60719





More information about the llvm-commits mailing list