Add Constant Hoisting Pass

Retry commit r200022 with a fix for the build bot errors. Constant expressions
have (unlike instructions) module scope use lists and therefore may have users
in different functions. The fix is to simply ignore these out-of-function uses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200034 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Juergen Ributzka
2014-01-24 20:18:00 +00:00
parent 86720f7c65
commit 96172cb4a4
20 changed files with 722 additions and 40 deletions

View File

@@ -38,7 +38,8 @@ entry:
define void @t2(i8* nocapture %C) nounwind {
entry:
; CHECK-LABEL: t2:
; CHECK: ldr [[REG2:r[0-9]+]], [r1, #32]
; CHECK: movw [[REG2:r[0-9]+]], #16716
; CHECK: movt [[REG2:r[0-9]+]], #72
; CHECK: str [[REG2]], [r0, #32]
; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1]
; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0]
@@ -79,7 +80,8 @@ entry:
; CHECK: strb [[REG5]], [r0, #6]
; CHECK: movw [[REG6:r[0-9]+]], #21587
; CHECK: strh [[REG6]], [r0, #4]
; CHECK: ldr [[REG7:r[0-9]+]],
; CHECK: movw [[REG7:r[0-9]+]], #18500
; CHECK: movt [[REG7:r[0-9]+]], #22866
; CHECK: str [[REG7]]
tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([7 x i8]* @.str5, i64 0, i64 0), i64 7, i32 1, i1 false)
ret void

View File

@@ -0,0 +1,67 @@
; RUN: llc < %s -mtriple=x86_64-darwin -mcpu=corei7 | grep movabsq | count 3
define i64 @constant_hoisting(i64 %o0, i64 %o1, i64 %o2, i64 %o3, i64 %o4, i64 %o5) {
entry:
%l0 = and i64 %o0, -281474976710654
%c0 = icmp ne i64 %l0, 0
br i1 %c0, label %fail, label %bb1
bb1:
%l1 = and i64 %o1, -281474976710654
%c1 = icmp ne i64 %l1, 0
br i1 %c1, label %fail, label %bb2
bb2:
%l2 = and i64 %o2, -281474976710654
%c2 = icmp ne i64 %l2, 0
br i1 %c2, label %fail, label %bb3
bb3:
%l3 = and i64 %o3, -281474976710654
%c3 = icmp ne i64 %l3, 0
br i1 %c3, label %fail, label %bb4
bb4:
%l4 = and i64 %o4, -281474976710653
%c4 = icmp ne i64 %l4, 0
br i1 %c4, label %fail, label %bb5
bb5:
%l5 = and i64 %o5, -281474976710652
%c5 = icmp ne i64 %l5, 0
br i1 %c5, label %fail, label %bb6
bb6:
ret i64 %l5
fail:
ret i64 -1
}
define void @constant_expressions() {
entry:
%0 = load i64* inttoptr (i64 add (i64 51250129900, i64 0) to i64*)
%1 = load i64* inttoptr (i64 add (i64 51250129900, i64 8) to i64*)
%2 = load i64* inttoptr (i64 add (i64 51250129900, i64 16) to i64*)
%3 = load i64* inttoptr (i64 add (i64 51250129900, i64 24) to i64*)
%4 = add i64 %0, %1
%5 = add i64 %2, %3
%6 = add i64 %4, %5
store i64 %6, i64* inttoptr (i64 add (i64 51250129900, i64 0) to i64*)
ret void
}
define void @constant_expressions2() {
entry:
%0 = load i64* inttoptr (i64 51250129900 to i64*)
%1 = load i64* inttoptr (i64 51250129908 to i64*)
%2 = load i64* inttoptr (i64 51250129916 to i64*)
%3 = load i64* inttoptr (i64 51250129924 to i64*)
%4 = add i64 %0, %1
%5 = add i64 %2, %3
%6 = add i64 %4, %5
store i64 %6, i64* inttoptr (i64 51250129900 to i64*)
ret void
}