llvm-6502/test/CodeGen/X86/atom-fixup-lea2.ll
Preston Gurd d6ac8e9a03 This patch adds the X86FixupLEAs pass, which will reduce instruction
latency for certain models of the Intel Atom family, by converting
instructions into their equivalent LEA instructions, when it is both
useful and possible to do so.




git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180573 91177308-0d34-0410-b5e6-96231b3b80d8
2013-04-25 20:29:37 +00:00

85 lines
2.5 KiB
LLVM

; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck %s
; CHECK:BB#5
; CHECK-NEXT:leal
; CHECK-NEXT:leal
; CHECK-NEXT:leal
; CHECK-NEXT:movl
; Test for fixup lea pre-emit pass. LEA instructions should be substituted for
; ADD instructions which compute the address and index of the load because they
; precede the load within 5 instructions. An LEA should also be substituted for
; an ADD which computes part of the index because it precedes the index LEA
; within 5 instructions, this substitution is referred to as backwards chaining.
; Original C Code
;struct node_t
;{
; int k, m, n, p;
; int * array;
;};
;extern struct node_t getnode();
;int test()
;{
; int sum = 0;
; struct node_t n = getnode();
; if(n.array != 0 && n.p > 0 && n.k > 0 && n.n > 0 && n.m > 0) {
; sum = ((int*)((int)n.array + n.p) )[ n.k + n.m + n.n ];
; }
; return sum;
;}
%struct.node_t = type { i32, i32, i32, i32, i32* }
define i32 @test() {
entry:
%n = alloca %struct.node_t, align 4
call void bitcast (void (%struct.node_t*, ...)* @getnode to void (%struct.node_t*)*)(%struct.node_t* sret %n)
%array = getelementptr inbounds %struct.node_t* %n, i32 0, i32 4
%0 = load i32** %array, align 4
%cmp = icmp eq i32* %0, null
br i1 %cmp, label %if.end, label %land.lhs.true
land.lhs.true:
%p = getelementptr inbounds %struct.node_t* %n, i32 0, i32 3
%1 = load i32* %p, align 4
%cmp1 = icmp sgt i32 %1, 0
br i1 %cmp1, label %land.lhs.true2, label %if.end
land.lhs.true2:
%k = getelementptr inbounds %struct.node_t* %n, i32 0, i32 0
%2 = load i32* %k, align 4
%cmp3 = icmp sgt i32 %2, 0
br i1 %cmp3, label %land.lhs.true4, label %if.end
land.lhs.true4:
%n5 = getelementptr inbounds %struct.node_t* %n, i32 0, i32 2
%3 = load i32* %n5, align 4
%cmp6 = icmp sgt i32 %3, 0
br i1 %cmp6, label %land.lhs.true7, label %if.end
land.lhs.true7:
%m = getelementptr inbounds %struct.node_t* %n, i32 0, i32 1
%4 = load i32* %m, align 4
%cmp8 = icmp sgt i32 %4, 0
br i1 %cmp8, label %if.then, label %if.end
if.then:
%add = add i32 %3, %2
%add12 = add i32 %add, %4
%5 = ptrtoint i32* %0 to i32
%add15 = add nsw i32 %1, %5
%6 = inttoptr i32 %add15 to i32*
%arrayidx = getelementptr inbounds i32* %6, i32 %add12
%7 = load i32* %arrayidx, align 4
br label %if.end
if.end:
%sum.0 = phi i32 [ %7, %if.then ], [ 0, %land.lhs.true7 ], [ 0, %land.lhs.true4 ], [ 0, %land.lhs.true2 ], [ 0, %land.lhs.true ], [ 0, %entry ]
ret i32 %sum.0
}
declare void @getnode(%struct.node_t* sret, ...)