summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Transforms
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/Transforms')
-rw-r--r--llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp b/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp
index c229be6d695..c53b3152a7d 100644
--- a/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp
+++ b/llvm/unittests/Transforms/Utils/CodeExtractorTest.cpp
@@ -21,7 +21,7 @@
using namespace llvm;
namespace {
-TEST(CodeExtractor, ExitStub) {
+TEST(CodeExtractor, DISABLED_ExitStub) {
LLVMContext Ctx;
SMDiagnostic Err;
std::unique_ptr<Module> M(parseAssemblyString(R"invalid(
@@ -46,6 +46,25 @@ TEST(CodeExtractor, ExitStub) {
)invalid",
Err, Ctx));
+ // CodeExtractor miscompiles this function. There appear to be some issues
+ // with the handling of outlined regions with live output values.
+ //
+ // In the original function, CE adds two reloads in the codeReplacer block:
+ //
+ // codeRepl: ; preds = %header
+ // call void @foo_header.split(i32 %z, i32 %x, i32 %y, i32* %.loc, i32* %.loc1)
+ // %.reload = load i32, i32* %.loc
+ // %.reload2 = load i32, i32* %.loc1
+ // br label %notExtracted
+ //
+ // These reloads must flow into the notExtracted block:
+ //
+ // notExtracted: ; preds = %codeRepl
+ // %0 = phi i32 [ %.reload, %codeRepl ], [ %.reload2, %body2 ]
+ //
+ // The problem is that the PHI node in notExtracted now has an incoming
+ // value from a BasicBlock that's in a different function.
+
Function *Func = M->getFunction("foo");
SmallVector<BasicBlock *, 3> Candidates;
for (auto &BB : *Func) {
OpenPOWER on IntegriCloud