IndependentBlock: Add option to disable scalar to array rewriting.

llvm-svn: 186418
This commit is contained in:
Hongbin Zheng 2013-07-16 15:19:33 +00:00
parent c6aa9f5c2a
commit 5a772dcd84
5 changed files with 69 additions and 1 deletions

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
//
#include "polly/LinkAllPasses.h"
#include "polly/Options.h"
#include "polly/CodeGen/BlockGenerators.h"
#include "polly/CodeGen/Cloog.h"
#include "polly/ScopDetection.h"
@ -21,7 +22,7 @@
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Assembly/Writer.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Support/CommandLine.h"
#define DEBUG_TYPE "polly-independent"
#include "llvm/Support/Debug.h"
@ -30,6 +31,11 @@
using namespace polly;
using namespace llvm;
static cl::opt<bool>
DisableIntraScopScalarToArray("disable-polly-intra-scop-scalar-to-array",
cl::desc("Do not rewrite scalar to array to generate independent blocks"),
cl::Hidden, cl::init(false), cl::cat(PollyCategory));
namespace {
struct IndependentBlocks : public FunctionPass {
RegionInfo *RI;
@ -379,6 +385,8 @@ bool IndependentBlocks::translateScalarToArray(Instruction *Inst,
if (isEscapeUse(U, R))
LoadOutside.push_back(U);
if (DisableIntraScopScalarToArray) continue;
if (canSynthesize(U, LI, SE, R))
continue;
@ -465,6 +473,8 @@ bool IndependentBlocks::isIndependentBlock(const Region *R,
}
}
if (DisableIntraScopScalarToArray) continue;
for (Instruction::op_iterator OI = Inst->op_begin(), OE = Inst->op_end();
OI != OE; ++OI) {
if (isEscapeOperand(*OI, BB, R)) {

View File

@ -1,5 +1,7 @@
; RUN: opt %loadPolly -basicaa -polly-independent -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -polly-codegen-scev -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s -check-prefix=SCALARACCESS
; RUN: opt %loadPolly -basicaa -polly-independent -polly-codegen-scev -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s -check-prefix=SCALARACCESS
; void f(long A[], int N, int *init_ptr) {
; long i, j;
@ -21,6 +23,8 @@ entry:
; CHECK: entry
; CHECK: %init.s2a = alloca i64
; CHECK: br label %for.i
; SCALARACCESS-NOT: alloca
br label %for.i
for.i:
@ -30,6 +34,7 @@ for.i:
entry.next:
%init = load i64* %init_ptr
; SCALARACCESS-NOT: store
br label %for.j
for.j:
@ -37,6 +42,7 @@ for.j:
%init_plus_two = add i64 %init, 2
; CHECK: %init.loadarray = load i64* %init.s2a
; CHECK: %init_plus_two = add i64 %init.loadarray, 2
; SCALARACCESS: %init_plus_two = add i64 %init, 2
%scevgep = getelementptr i64* %A, i64 %indvar.j
store i64 %init_plus_two, i64* %scevgep
%indvar.j.next = add nsw i64 %indvar.j, 1

View File

@ -1,5 +1,7 @@
; RUN: opt %loadPolly -basicaa -polly-independent -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -polly-codegen-scev -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s -check-prefix=SCALARACCESS
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -polly-codegen-scev -S < %s | FileCheck %s -check-prefix=SCALARACCESS
; void f(long A[], int N, int *init_ptr) {
; long i, j;
@ -22,6 +24,8 @@ entry:
; CHECK: entry
; CHECK: %init.s2a = alloca i64
; CHECK: br label %for.i
; SCALARACCESS-NOT: alloca
br label %for.i
for.i:
@ -31,6 +35,7 @@ for.i:
entry.next:
%init = load i64* %init_ptr
; SCALARACCESS-NOT: store
br label %for.j
for.j:
@ -44,6 +49,9 @@ for.j:
; The SCEV of %init_sum is (%init + %init_2). It is referring to both an
; UnknownValue in the same and in a different basic block. We want only the
; reference to the different basic block to be replaced.
; SCALARACCESS: %init_2 = load i64* %init_ptr
; SCALARACCESS: %init_sum = add i64 %init, %init_2
%scevgep = getelementptr i64* %A, i64 %indvar.j
store i64 %init_sum, i64* %scevgep
%indvar.j.next = add nsw i64 %indvar.j, 1

View File

@ -1,5 +1,7 @@
; RUN: opt %loadPolly -basicaa -polly-independent -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -polly-codegen-scev -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -polly-codegen-scev -S < %s | FileCheck %s
; void f(long A[], int N, int *init_ptr) {
; long i, j;

View File

@ -1,5 +1,7 @@
; RUN: opt %loadPolly -basicaa -polly-independent < %s -S | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -polly-codegen-scev < %s -S | FileCheck %s
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s -check-prefix=SCALARACCESS
; RUN: opt %loadPolly -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -polly-codegen-scev < %s -S | FileCheck %s -check-prefix=SCALARACCESS
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@ -36,6 +38,8 @@ entry:
br label %for.cond
; CHECK: entry:
; CHECK-NOT: alloca
; SCALARACCESS: entry:
; SCALARACCESS-NOT: alloca
for.cond:
%indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
@ -51,6 +55,9 @@ for.body:
; CHECK: for.body:
; CHECK: %float = uitofp i64 %indvar to float
; CHECK: store float %float, float* %arrayidx
; SCALARACCESS: for.body:
; SCALARACCESS: %float = uitofp i64 %indvar to float
; SCALARACCESS: store float %float, float* %arrayidx
for.inc:
%indvar.next = add i64 %indvar, 1
@ -70,6 +77,9 @@ entry:
; CHECK: entry:
; CHECK: %scalar.s2a = alloca float
; CHECK: fence
; SCALARACCESS: entry:
; SCALARACCESS-NOT: alloca
; SCALARACCESS: fence
for.cond:
%indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
@ -87,6 +97,12 @@ for.body.a:
; CHECK: store float %scalar, float* %scalar.s2a
; CHECK: br label %for.body.b
; SCALARACCESS: for.body.a:
; SCALARACCESS: %arrayidx = getelementptr [1024 x float]* @A, i64 0, i64 %indvar
; SCALARACCESS: %scalar = load float* %arrayidx
; SCALARACCESS-NOT: store
; SCALARACCESS: br label %for.body.b
for.body.b:
%arrayidx2 = getelementptr [1024 x float]* @A, i64 0, i64 %indvar
%float = uitofp i64 %indvar to float
@ -102,6 +118,14 @@ for.body.b:
; CHECK: store float %sum, float* %arrayidx2
; CHECK: br label %for.inc
; SCALARACCESS: for.body.b:
; SCALARACCESS: %arrayidx2 = getelementptr [1024 x float]* @A, i64 0, i64 %indvar
; SCALARACCESS: %float = uitofp i64 %indvar to float
; SCALARACCESS-NOT: load
; SCALARACCESS: %sum = fadd float %scalar, %float
; SCALARACCESS: store float %sum, float* %arrayidx2
; SCALARACCESS: br label %for.inc
for.inc:
%indvar.next = add i64 %indvar, 1
br label %for.cond
@ -114,6 +138,8 @@ return:
; It is not possible to have a scop which accesses a scalar element that is
; a global variable. All global variables are pointers containing possibly
; a single element. Hence they do not need to be handled anyways.
; Please note that this is still required when scalar to array rewritting is
; disabled.
; CHECK: @use_after_scop()
define i32 @use_after_scop() nounwind {
@ -124,6 +150,10 @@ entry:
; CHECK: %scalar.s2a = alloca float
; CHECK: fence
; SCALARACCESS: entry:
; SCALARACCESS: %scalar.s2a = alloca float
; SCALARACCESS: fence
for.head:
%indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
br label %for.body
@ -137,6 +167,10 @@ for.body:
; CHECK: %scalar = load float* %arrayidx
; CHECK: store float %scalar, float* %scalar.s2a
; SCALARACCESS: for.body:
; SCALARACCESS: %scalar = load float* %arrayidx
; SCALARACCESS: store float %scalar, float* %scalar.s2a
for.inc:
%indvar.next = add i64 %indvar, 1
%exitcond = icmp ne i64 %indvar, 1024
@ -152,6 +186,11 @@ for.after:
; CHECK: fence seq_cst
; CHECK: %return_value = fptosi float %scalar.loadoutside to i32
; SCALARACCESS: for.after:
; SCALARACCESS: %scalar.loadoutside = load float* %scalar.s2a
; SCALARACCESS: fence seq_cst
; SCALARACCESS: %return_value = fptosi float %scalar.loadoutside to i32
return:
ret i32 %return_value
}
@ -187,6 +226,9 @@ for.body:
; CHECK: for.body:
; CHECK: store float %scalar, float* %arrayidx
; SCALARACCESS: for.body:
; SCALARACCESS: store float %scalar, float* %arrayidx
for.inc:
%indvar.next = add i64 %indvar, 1
br label %for.cond