mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
2493ab105d
Summary: Create a method to forget everything in SCEV. Add a cl::opt and PassManagerBuilder option to use this in LoopUnroll. Motivation: Certain Halide applications spend a very long time compiling in forgetLoop, and prefer to forget everything and rebuild SCEV from scratch. Sample difference in compile time reduction: 21.04 to 14.78 using current ToT release build. Testcase showcasing this cannot be opensourced and is fairly large. The option disabled by default, but it may be desirable to enable by default. Evidence in favor (two difference runs on different days/ToT state): File Before (s) After (s) clang-9.bc 7267.91 6639.14 llvm-as.bc 194.12 194.12 llvm-dis.bc 62.50 62.50 opt.bc 1855.85 1857.53 File Before (s) After (s) clang-9.bc 8588.70 7812.83 llvm-as.bc 196.20 194.78 llvm-dis.bc 61.55 61.97 opt.bc 1739.78 1886.26 Reviewers: sanjoy Subscribers: mehdi_amini, jlebar, zzheng, javed.absar, dmgreen, jdoerfert, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60144 llvm-svn: 358304
77 lines
2.4 KiB
C++
77 lines
2.4 KiB
C++
//===- UnrollLoopTest.cpp - Unit tests for UnrollLoop ---------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Transforms/Utils/UnrollLoop.h"
|
|
#include "llvm/Analysis/AssumptionCache.h"
|
|
#include "llvm/Analysis/LoopInfo.h"
|
|
#include "llvm/Analysis/ScalarEvolution.h"
|
|
#include "llvm/Analysis/TargetLibraryInfo.h"
|
|
#include "llvm/AsmParser/Parser.h"
|
|
#include "llvm/IR/BasicBlock.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/Support/SourceMgr.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
|
|
SMDiagnostic Err;
|
|
std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
|
|
if (!Mod)
|
|
Err.print("UnrollLoopTests", errs());
|
|
return Mod;
|
|
}
|
|
|
|
TEST(LoopUnrollRuntime, Latch) {
|
|
LLVMContext C;
|
|
|
|
std::unique_ptr<Module> M = parseIR(
|
|
C,
|
|
R"(define i32 @test(i32* %a, i32* %b, i32* %c, i64 %n) {
|
|
entry:
|
|
br label %while.cond
|
|
|
|
while.cond: ; preds = %while.body, %entry
|
|
%i.0 = phi i64 [ 0, %entry ], [ %inc, %while.body ]
|
|
%cmp = icmp slt i64 %i.0, %n
|
|
br i1 %cmp, label %while.body, label %while.end
|
|
|
|
while.body: ; preds = %while.cond
|
|
%arrayidx = getelementptr inbounds i32, i32* %b, i64 %i.0
|
|
%0 = load i32, i32* %arrayidx
|
|
%arrayidx1 = getelementptr inbounds i32, i32* %c, i64 %i.0
|
|
%1 = load i32, i32* %arrayidx1
|
|
%mul = mul nsw i32 %0, %1
|
|
%arrayidx2 = getelementptr inbounds i32, i32* %a, i64 %i.0
|
|
store i32 %mul, i32* %arrayidx2
|
|
%inc = add nsw i64 %i.0, 1
|
|
br label %while.cond
|
|
|
|
while.end: ; preds = %while.cond
|
|
ret i32 0
|
|
})"
|
|
);
|
|
|
|
auto *F = M->getFunction("test");
|
|
DominatorTree DT(*F);
|
|
LoopInfo LI(DT);
|
|
AssumptionCache AC(*F);
|
|
TargetLibraryInfoImpl TLII;
|
|
TargetLibraryInfo TLI(TLII);
|
|
ScalarEvolution SE(*F, TLI, AC, DT, LI);
|
|
|
|
Loop *L = *LI.begin();
|
|
|
|
bool PreserveLCSSA = L->isRecursivelyLCSSAForm(DT,LI);
|
|
|
|
bool ret = UnrollRuntimeLoopRemainder(L, 4, true, false, false, false, &LI,
|
|
&SE, &DT, &AC, PreserveLCSSA);
|
|
EXPECT_FALSE(ret);
|
|
}
|