mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
37056c888c
In one place we checked X86Subtarget.slowLEA() to decide if the pass should run. But to decide what the pass should we only check isSLM. This resulted in Goldmont going down the Bonnell path. llvm-svn: 338342
86 lines
2.6 KiB
LLVM
86 lines
2.6 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, %struct.node_t* %n, i32 0, i32 4
|
|
%0 = load i32*, 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, %struct.node_t* %n, i32 0, i32 3
|
|
%1 = load i32, 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, %struct.node_t* %n, i32 0, i32 0
|
|
%2 = load i32, 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, %struct.node_t* %n, i32 0, i32 2
|
|
%3 = load i32, 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, %struct.node_t* %n, i32 0, i32 1
|
|
%4 = load i32, 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, i32* %6, i32 %add12
|
|
%7 = load i32, 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, ...)
|