[SystemZ] Remove no-op MVCs

The stack coloring pass has code to delete stores and loads that become
trivially dead after coloring.  Extend it to cope with single instructions
that copy from one frame index to another.

The testcase happens to show an example of this kicking in at the moment.
It did occur in Real Code too though.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185705 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Sandiford
2013-07-05 14:38:48 +00:00
parent e684b96e3c
commit 71804149a3
5 changed files with 134 additions and 1 deletions
+89
View File
@@ -456,3 +456,92 @@ skip:
ret void
}
; This used to generate a no-op MVC. It is very sensitive to spill heuristics.
define void @f11() {
; CHECK: f11:
; CHECK-NOT: mvc [[OFFSET:[0-9]+]](8,%r15), [[OFFSET]](%r15)
; CHECK: br %r14
entry:
%val0 = load volatile i64 *@h0
%val1 = load volatile i64 *@h1
%val2 = load volatile i64 *@h2
%val3 = load volatile i64 *@h3
%val4 = load volatile i64 *@h4
%val5 = load volatile i64 *@h5
%val6 = load volatile i64 *@h6
%val7 = load volatile i64 *@h7
%altval0 = load volatile i64 *@h0
%altval1 = load volatile i64 *@h1
call void @foo()
store volatile i64 %val0, i64 *@h0
store volatile i64 %val1, i64 *@h1
store volatile i64 %val2, i64 *@h2
store volatile i64 %val3, i64 *@h3
store volatile i64 %val4, i64 *@h4
store volatile i64 %val5, i64 *@h5
store volatile i64 %val6, i64 *@h6
store volatile i64 %val7, i64 *@h7
%check = load volatile i64 *@h0
%cond = icmp eq i64 %check, 0
br i1 %cond, label %a1, label %b1
a1:
call void @foo()
br label %join1
b1:
call void @foo()
br label %join1
join1:
%newval0 = phi i64 [ %val0, %a1 ], [ %altval0, %b1 ]
call void @foo()
store volatile i64 %val1, i64 *@h1
store volatile i64 %val2, i64 *@h2
store volatile i64 %val3, i64 *@h3
store volatile i64 %val4, i64 *@h4
store volatile i64 %val5, i64 *@h5
store volatile i64 %val6, i64 *@h6
store volatile i64 %val7, i64 *@h7
br i1 %cond, label %a2, label %b2
a2:
call void @foo()
br label %join2
b2:
call void @foo()
br label %join2
join2:
%newval1 = phi i64 [ %val1, %a2 ], [ %altval1, %b2 ]
call void @foo()
store volatile i64 %val2, i64 *@h2
store volatile i64 %val3, i64 *@h3
store volatile i64 %val4, i64 *@h4
store volatile i64 %val5, i64 *@h5
store volatile i64 %val6, i64 *@h6
store volatile i64 %val7, i64 *@h7
call void @foo()
store volatile i64 %newval0, i64 *@h0
store volatile i64 %newval1, i64 *@h1
store volatile i64 %val2, i64 *@h2
store volatile i64 %val3, i64 *@h3
store volatile i64 %val4, i64 *@h4
store volatile i64 %val5, i64 *@h5
store volatile i64 %val6, i64 *@h6
store volatile i64 %val7, i64 *@h7
ret void
}