mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
b18c061910
This removes some of the class variables. Merge basic block processing into runOnMachineFunction to keep the flags local. Pass MachineBasicBlock around instead of an iterator. We can get the iterator in the few places that need it. Allows a range-based outer for loop. Separate the Atom optimization from the rest of the optimizations. This allows fixupIncDec to create INC/DEC and still allow Atom to turn it back into LEA when profitable by its heuristics. I'd like to improve fixupIncDec to turn LEAs into ADD any time the base or index register is equal to the destination register. This is profitable regardless of the various slow flags. But again we would want Atom to be able to undo that. Differential Revision: https://reviews.llvm.org/D60993 llvm-svn: 359581
66 lines
2.2 KiB
LLVM
66 lines
2.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mcpu=generic -mtriple=x86_64-unknown-linux-gnu -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK
|
|
; RUN: llc -mcpu=atom -mtriple=x86_64-unknown-linux-gnu -relocation-model=static < %s | FileCheck %s --check-prefix=ATOM
|
|
|
|
@A = external global [0 x double]
|
|
|
|
define void @foo(i64 %n) nounwind {
|
|
; CHECK-LABEL: foo:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testq %rdi, %rdi
|
|
; CHECK-NEXT: jle .LBB0_3
|
|
; CHECK-NEXT: # %bb.1: # %for.body.preheader
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
|
|
; CHECK-NEXT: .p2align 4, 0x90
|
|
; CHECK-NEXT: .LBB0_2: # %for.body
|
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
|
|
; CHECK-NEXT: mulsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movsd %xmm1, A(,%rax,8)
|
|
; CHECK-NEXT: incq %rax
|
|
; CHECK-NEXT: cmpq %rax, %rdi
|
|
; CHECK-NEXT: jne .LBB0_2
|
|
; CHECK-NEXT: .LBB0_3: # %for.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; ATOM-LABEL: foo:
|
|
; ATOM: # %bb.0: # %entry
|
|
; ATOM-NEXT: testq %rdi, %rdi
|
|
; ATOM-NEXT: jle .LBB0_3
|
|
; ATOM-NEXT: # %bb.1: # %for.body.preheader
|
|
; ATOM-NEXT: xorl %eax, %eax
|
|
; ATOM-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
|
|
; ATOM-NEXT: .p2align 4, 0x90
|
|
; ATOM-NEXT: .LBB0_2: # %for.body
|
|
; ATOM-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; ATOM-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
|
|
; ATOM-NEXT: mulsd %xmm0, %xmm1
|
|
; ATOM-NEXT: movsd %xmm1, A(,%rax,8)
|
|
; ATOM-NEXT: leaq 1(%rax), %rax
|
|
; ATOM-NEXT: cmpq %rax, %rdi
|
|
; ATOM-NEXT: jne .LBB0_2
|
|
; ATOM-NEXT: .LBB0_3: # %for.end
|
|
; ATOM-NEXT: nop
|
|
; ATOM-NEXT: nop
|
|
; ATOM-NEXT: nop
|
|
; ATOM-NEXT: nop
|
|
; ATOM-NEXT: retq
|
|
entry:
|
|
%cmp5 = icmp sgt i64 %n, 0
|
|
br i1 %cmp5, label %for.body, label %for.end
|
|
|
|
for.body:
|
|
%i.06 = phi i64 [ %inc, %for.body ], [ 0, %entry ]
|
|
%arrayidx = getelementptr [0 x double], [0 x double]* @A, i64 0, i64 %i.06
|
|
%tmp3 = load double, double* %arrayidx, align 8
|
|
%mul = fmul double %tmp3, 2.300000e+00
|
|
store double %mul, double* %arrayidx, align 8
|
|
%inc = add nsw i64 %i.06, 1
|
|
%exitcond = icmp eq i64 %inc, %n
|
|
br i1 %exitcond, label %for.end, label %for.body
|
|
|
|
for.end:
|
|
ret void
|
|
}
|