diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-01-03 17:58:24 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-01-03 17:58:24 +0000 |
commit | 5772566ed66f8c4c09dcda81e96eb11a303b2140 (patch) | |
tree | 6022c03d45da38c5cb6ec736c5b3e02582d76da8 /llvm/test/CodeGen/PowerPC/code-align.ll | |
parent | 409af508589990413231e9ac567db1289de1b18c (diff) | |
download | bcm5719-llvm-5772566ed66f8c4c09dcda81e96eb11a303b2140.tar.gz bcm5719-llvm-5772566ed66f8c4c09dcda81e96eb11a303b2140.zip |
[PowerPC/BlockPlacement] Allow target to provide a per-loop alignment preference
The existing code provided for specifying a global loop alignment preference.
However, the preferred loop alignment might depend on the loop itself. For
recent POWER cores, loops between 5 and 8 instructions should have 32-byte
alignment (while the others are better with 16-byte alignment) so that the
entire loop will fit in one i-cache line.
To support this, getPrefLoopAlignment has been made virtual, and can be
provided with an optional MachineLoop* so the target can inspect the loop
before answering the query. The default behavior, as before, is to return the
value set with setPrefLoopAlignment. MachineBlockPlacement now queries the
target for each loop instead of only once per function. There should be no
functional change for other targets.
llvm-svn: 225117
Diffstat (limited to 'llvm/test/CodeGen/PowerPC/code-align.ll')
-rw-r--r-- | llvm/test/CodeGen/PowerPC/code-align.ll | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/llvm/test/CodeGen/PowerPC/code-align.ll b/llvm/test/CodeGen/PowerPC/code-align.ll index 5550547d010..306230be500 100644 --- a/llvm/test/CodeGen/PowerPC/code-align.ll +++ b/llvm/test/CodeGen/PowerPC/code-align.ll @@ -1,15 +1,15 @@ ; RUN: llc -mcpu=ppc64 < %s | FileCheck %s -check-prefix=GENERIC -; RUN: llc -mcpu=970 < %s | FileCheck %s -check-prefix=BASIC +; RUN: llc -mcpu=970 < %s | FileCheck %s -check-prefix=PWR ; RUN: llc -mcpu=a2 < %s | FileCheck %s -check-prefix=BASIC ; RUN: llc -mcpu=e500mc < %s | FileCheck %s -check-prefix=BASIC ; RUN: llc -mcpu=e5500 < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr4 < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr5 < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr5x < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr6 < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr6x < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr7 < %s | FileCheck %s -check-prefix=BASIC -; RUN: llc -mcpu=pwr8 < %s | FileCheck %s -check-prefix=BASIC +; RUN: llc -mcpu=pwr4 < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr5 < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr5x < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr6 < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr6x < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr7 < %s | FileCheck %s -check-prefix=PWR +; RUN: llc -mcpu=pwr8 < %s | FileCheck %s -check-prefix=PWR target datalayout = "E-m:e-i64:64-n32:64" target triple = "powerpc64-unknown-linux-gnu" @@ -21,10 +21,13 @@ entry: ; GENERIC-LABEL: .globl foo ; BASIC-LABEL: .globl foo +; PWR-LABEL: .globl foo ; GENERIC: .align 2 ; BASIC: .align 4 +; PWR: .align 4 ; GENERIC: @foo ; BASIC: @foo +; PWR: @foo } ; Function Attrs: nounwind @@ -34,12 +37,16 @@ entry: ; GENERIC-LABEL: @loop ; BASIC-LABEL: @loop +; PWR-LABEL: @loop ; GENERIC: mtctr ; BASIC: mtctr +; PWR: mtctr ; GENERIC-NOT: .align ; BASIC: .align 4 +; PWR: .align 4 ; GENERIC: bdnz ; BASIC: bdnz +; PWR: bdnz vector.body: ; preds = %vector.body, %entry %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ] @@ -60,6 +67,38 @@ for.end: ; preds = %vector.body ret void } +; Function Attrs: nounwind +define void @sloop(i32 signext %x, i32* nocapture %a) #1 { +entry: + br label %for.body + +; GENERIC-LABEL: @sloop +; BASIC-LABEL: @sloop +; PWR-LABEL: @sloop +; GENERIC: mtctr +; BASIC: mtctr +; PWR: mtctr +; GENERIC-NOT: .align +; BASIC: .align 4 +; PWR: .align 5 +; GENERIC: bdnz +; BASIC: bdnz +; PWR: bdnz + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %add = add nsw i32 %0, 4 + store i32 %add, i32* %arrayidx, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 2048 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + attributes #0 = { nounwind readnone } attributes #1 = { nounwind } |