[llvm] r257253 - [BranchFolding] Set correct mem refs
박준모 via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 10 21:30:00 PST 2016
Hi Michael.
Thanks for comments. I’ll try harder to make secure code.
When we run “llc -march=aarch64 -mtriple=aarch64-none-linux-gnu -stop-after branch-folder -o /dev/null branch-folder-merge-mmos.ll”, we can get result likes below.
Compiling will be stopped after “branch-folder” optimization. So there is no foo label. And “–o /dev/null”, this is just for avoiding error “LLVM ERROR: IO failure on output stream.”.
And this option is used for several testcases.
If we don’t use the option “-stop-after branch-folder”, we don’t need to use “-o /dev/null”. As you said, there is no error with “-o -”.
I deleted test function. Are there any comments for testcase?
-Junmo
--- |
; ModuleID = 'branch-folder-merge-mmos.ll'
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-none-linux-gnu"
define void @foo(i32 %a, i32 %b, float* nocapture %foo_arr) {
entry:
%cmp = icmp sgt i32 %a, 0
br i1 %cmp, label %if.then, label %if.end
if.then: ; preds = %entry
%0 = load float, float* %foo_arr, align 4
%arrayidx1.i1 = getelementptr inbounds float, float* %foo_arr, i64 1
%1 = load float, float* %arrayidx1.i1, align 4
%sub.i = fsub float %0, %1
store float %sub.i, float* %foo_arr, align 4
br label %if.end3
if.end: ; preds = %entry
%cmp1 = icmp sgt i32 %b, 0
br i1 %cmp1, label %if.then2, label %if.end3
if.then2: ; preds = %if.end
%2 = load float, float* %foo_arr, align 4
%arrayidx1.i2 = getelementptr inbounds float, float* %foo_arr, i64 1
%3 = load float, float* %arrayidx1.i2, align 4
%sub.i3 = fsub float %2, %3
store float %sub.i3, float* %foo_arr, align 4
br label %if.end3
if.end3: ; preds = %if.then2, %if.end, %if.then
ret void
}
...
---
name: foo
alignment: 2
exposesReturnsTwice: false
hasInlineAsm: false
isSSA: false
tracksRegLiveness: false
tracksSubRegLiveness: false
liveins:
- { reg: '%w0' }
- { reg: '%w1' }
- { reg: '%x2' }
frameInfo:
isFrameAddressTaken: false
isReturnAddressTaken: false
hasStackMap: false
hasPatchPoint: false
stackSize: 0
offsetAdjustment: 0
maxAlignment: 0
adjustsStack: false
hasCalls: false
maxCallFrameSize: 0
hasOpaqueSPAdjustment: false
hasVAStart: false
hasMustTailInVarArgFunc: false
body: |
bb.0.entry:
successors: %bb.2.if.then2(0x50000000 / 0x80000000 = 62.50%), %bb.1.if.end(0x30000000 / 0x80000000 = 37.50%)
liveins: %w0, %w1, %x2
dead %wzr = SUBSWri killed %w0, 1, 0, implicit-def %nzcv
Bcc 10, %bb.2.if.then2, implicit %nzcv
bb.1.if.end:
successors: %bb.2.if.then2(0x50000000 / 0x80000000 = 62.50%), %bb.3.if.end3(0x30000000 / 0x80000000 = 37.50%)
liveins: %w1, %x2
dead %wzr = SUBSWri killed %w1, 1, 0, implicit-def %nzcv
Bcc 11, %bb.3.if.end3, implicit %nzcv
bb.2.if.then2:
successors: %bb.3.if.end3(0x80000000 / 0x80000000 = 100.00%)
liveins: %x2
%s0 = LDRSui %x2, 0 :: (load 4 from %ir.foo_arr)
%s1 = LDRSui %x2, 1 :: (load 4 from %ir.arrayidx1.i2), (load 4 from %ir.arrayidx1.i1)
%s0 = FSUBSrr killed %s0, killed %s1
STRSui killed %s0, killed %x2, 0 :: (store 4 into %ir.foo_arr)
bb.3.if.end3:
RET_ReallyLR
...
From: mzolotukhin at apple.com [mailto:mzolotukhin at apple.com]
Sent: Monday, January 11, 2016 12:42 PM
To: 박준모
Cc: Benjamin Kramer; Chandler Carruth via llvm-commits
Subject: Re: [llvm] r257253 - [BranchFolding] Set correct mem refs
On Jan 10, 2016, at 6:53 PM, 박준모 <junmoz.park at samsung.com> wrote:
Hi Benjamin, Michael.
Hi Junmo,
I couldn't expect that array's memory reference information can be changed with -O3 option.
Why I used combination of "Opt -O3 & llc" is that I want to represent real world's problem.(Branch folding can be occurred after Function Inlining.)
I see. LLVM exploits a modular structure, so (almost) every transformation can be tested independently on others. That doesn’t mean all transformations work only on artificial tests - all of them actually target some real world problems, but testing them in isolation is just much more stable.
But this makes test failure on some machine. (Index of arrayidx1 can be changed, when optimization pass is changed.)
So I change my test code likes below. I hope below code is ok for everyone. If there are no objections, I will recommit this.
I haven’t looked at the code, but if you didn’t change it, I suppose it’s still considered “ok to commit”. However, I have some comments regarding the test - please see below.
diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp
index 6080349..df5cac5 100644
--- a/lib/CodeGen/BranchFolding.cpp
+++ b/lib/CodeGen/BranchFolding.cpp
@@ -780,7 +780,7 @@ removeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos,
assert(MBBICommon->isIdenticalTo(&*MBBI) && "Expected matching MIIs!");
if (MBBICommon->mayLoad() || MBBICommon->mayStore())
- MBBICommon->setMemRefs(MBBI->mergeMemRefsWith(*MBBI));
+ MBBICommon->setMemRefs(MBBICommon->mergeMemRefsWith(*MBBI));
++MBBI;
++MBBICommon;
diff --git a/test/CodeGen/AArch64/branch-folder-merge-mmos.ll b/test/CodeGen/AArch64/branch-folder-merge-mmos.ll
new file mode 100644
index 0000000..1c79e60
--- /dev/null
+++ b/test/CodeGen/AArch64/branch-folder-merge-mmos.ll
@@ -0,0 +1,44 @@
+; RUN: llc -march=aarch64 -mtriple=aarch64-none-linux-gnu -stop-after branch-folder -o /dev/null < %s | FileCheck %s
This doesn’t make much sense to me - why the output is /dev/null? I’m surprised that could work at all. I guess it should be “-o -“, so that output would be in stdout, which then will be piped to FileCheck.
+target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
+
+; Function Attrs: norecurse nounwind
+define void @test(float* nocapture %test_arr) #0 {
Why does the test need this function? We don’t check anything in it, so I suppose it can be completely removed.
+entry:
+ %0 = load float, float* %test_arr, align 4
+ %arrayidx1 = getelementptr inbounds float, float* %test_arr, i64 1
+ %1 = load float, float* %arrayidx1, align 4
+ %sub = fsub float %0, %1
+ store float %sub, float* %test_arr, align 4
+ ret void
+}
+
+; Function Attrs: norecurse nounwind
+define void @foo(i32 %a, i32 %b, float* nocapture %foo_arr) #0 {
It is a good practice to use "CHECK-LABEL: @foo” in the test. This way, if the test contains several functions, CHECK directives are guaranteed to work in the intended scope of the given function (they work in between CHECK-LABEL directives).
+; CHECK: (load 4 from %ir.arrayidx1.{{i[1-2]}}), (load 4 from %ir.arrayidx1.{{i[1-2]}})
+entry:
+ %cmp = icmp sgt i32 %a, 0
+ br i1 %cmp, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ %0 = load float, float* %foo_arr, align 4
+ %arrayidx1.i1 = getelementptr inbounds float, float* %foo_arr, i64 1
+ %1 = load float, float* %arrayidx1.i1, align 4
+ %sub.i = fsub float %0, %1
+ store float %sub.i, float* %foo_arr, align 4
+ br label %if.end3
+
+if.end: ; preds = %entry
+ %cmp1 = icmp sgt i32 %b, 0
+ br i1 %cmp1, label %if.then2, label %if.end3
+
+if.then2: ; preds = %if.end
+ %2 = load float, float* %foo_arr, align 4
+ %arrayidx1.i2 = getelementptr inbounds float, float* %foo_arr, i64 1
Michael
Junmo.
-----Original Message-----
From: Benjamin Kramer [ <mailto:benny.kra at gmail.com> mailto:benny.kra at gmail.com]
Sent: Sunday, January 10, 2016 4:57 AM
To: Junmo Park
Cc: Chandler Carruth via llvm-commits
Subject: Re: [llvm] r257253 - [BranchFolding] Set correct mem refs
On Sat, Jan 9, 2016 at 8:30 AM, Junmo Park via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
Author: flyingforyou
Date: Sat Jan 9 01:30:13 2016
New Revision: 257253
URL: http://llvm.org/viewvc/llvm-project?rev=257253 <http://llvm.org/viewvc/llvm-project?rev=257253&view=rev> &view=rev
Log:
[BranchFolding] Set correct mem refs
Merge MBBICommon and MBBI's MMOs.
Differential Revision: http://reviews.llvm.org/D15990
Added:
llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll
Modified:
llvm/trunk/lib/CodeGen/BranchFolding.cpp
Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=257253 <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=257253&r1=257252&r2=257253&view=diff> &r1=257252&r2=257253&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
+++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Sat Jan 9 01:30:13 2016
@@ -780,7 +780,7 @@ removeMMOsFromMemoryOperations(MachineBa
assert(MBBICommon->isIdenticalTo(&*MBBI) && "Expected matching MIIs!");
if (MBBICommon->mayLoad() || MBBICommon->mayStore())
- MBBICommon->setMemRefs(MBBI->mergeMemRefsWith(*MBBI));
+ MBBICommon->setMemRefs(MBBICommon->mergeMemRefsWith(*MBBI));
++MBBI;
++MBBICommon;
Added: llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll?rev=257253 <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll?rev=257253&view=auto> &view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/branch-folder-merge-mmos.ll Sat Jan 9 01:30:13 2016
@@ -0,0 +1,53 @@
+; RUN: opt < %s -O3 | llc -march=aarch64 -mtriple=aarch64-none-linux-gnu -stop-after branch-folder -o /dev/null | FileCheck %s
Why are you running opt -O3 on every run instead of just committing
the optimized IR? Running the O3 pipeline can cause the test to fail
when IR optimization passes change.
- Ben
+target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
+
+; Function Attrs: nounwind
+define void @test(float* %test_arr) #0 {
+entry:
+ %test_arr.addr = alloca float*, align 8
+ store float* %test_arr, float** %test_arr.addr, align 8
+ %0 = load float*, float** %test_arr.addr, align 8
+ %arrayidx = getelementptr inbounds float, float* %0, i64 0
+ %1 = load float, float* %arrayidx, align 4
+ %2 = load float*, float** %test_arr.addr, align 8
+ %arrayidx1 = getelementptr inbounds float, float* %2, i64 1
+ %3 = load float, float* %arrayidx1, align 4
+ %sub = fsub float %1, %3
+ %4 = load float*, float** %test_arr.addr, align 8
+ %arrayidx2 = getelementptr inbounds float, float* %4, i64 0
+ store float %sub, float* %arrayidx2, align 4
+ ret void
+}
+
+; Function Attrs: nounwind
+define void @foo(i32 %a, i32 %b, float* %foo_arr) #0 {
+; CHECK: (load 4 from %ir.arrayidx1.i2), (load 4 from %ir.arrayidx1.i)
+entry:
+ %a.addr = alloca i32, align 4
+ %b.addr = alloca i32, align 4
+ %foo_arr.addr = alloca float*, align 8
+ store i32 %a, i32* %a.addr, align 4
+ store i32 %b, i32* %b.addr, align 4
+ store float* %foo_arr, float** %foo_arr.addr, align 8
+ %0 = load i32, i32* %a.addr, align 4
+ %cmp = icmp sgt i32 %0, 0
+ br i1 %cmp, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ %1 = load float*, float** %foo_arr.addr, align 8
+ call void @test(float* %1)
+ br label %if.end3
+
+if.end: ; preds = %entry
+ %2 = load i32, i32* %b.addr, align 4
+ %cmp1 = icmp sgt i32 %2, 0
+ br i1 %cmp1, label %if.then2, label %if.end3
+
+if.then2: ; preds = %if.end
+ %3 = load float*, float** %foo_arr.addr, align 8
+ call void @test(float* %3)
+ br label %if.end3
+
+if.end3: ; preds = %if.then, %if.then2, %if.end
+ ret void
+}
_______________________________________________
llvm-commits mailing list
llvm-commits at lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
<diff.txt>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160111/ae82a9d4/attachment.html>
More information about the llvm-commits
mailing list