mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
0c687845b1
- A valno should be set HasRedefByEC if there is an early clobber def in the middle of its live ranges. It should not be set if the def of the valno is defined by an early clobber. - If a physical register def is tied to an use and it's an early clobber, it just means the HasRedefByEC is set since it's still one continuous live range. - Add a couple of missing checks for HasRedefByEC in the coalescer. In general, it should not coalesce a vr with a physical register if the physical register has a early clobber def somewhere. This is overly conservative but that's the price for using such a nasty inline asm "feature". llvm-svn: 90269
39 lines
1.5 KiB
LLVM
39 lines
1.5 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
|
; pr5391
|
|
|
|
define void @t() nounwind ssp {
|
|
entry:
|
|
; CHECK: t:
|
|
; CHECK: movl %ecx, %eax
|
|
; CHECK: %eax = foo (%eax, %ecx)
|
|
%b = alloca i32 ; <i32*> [#uses=2]
|
|
%a = alloca i32 ; <i32*> [#uses=1]
|
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
|
%0 = load i32* %b, align 4 ; <i32> [#uses=1]
|
|
%1 = load i32* %b, align 4 ; <i32> [#uses=1]
|
|
%asmtmp = call i32 asm "$0 = foo ($1, $2)", "=&{ax},%0,r,~{dirflag},~{fpsr},~{flags}"(i32 %0, i32 %1) nounwind ; <i32> [#uses=1]
|
|
store i32 %asmtmp, i32* %a
|
|
br label %return
|
|
|
|
return: ; preds = %entry
|
|
ret void
|
|
}
|
|
|
|
define void @t2() nounwind ssp {
|
|
entry:
|
|
; CHECK: t2:
|
|
; CHECK: movl %eax, %ecx
|
|
; CHECK: %ecx = foo (%ecx, %eax)
|
|
%b = alloca i32 ; <i32*> [#uses=2]
|
|
%a = alloca i32 ; <i32*> [#uses=1]
|
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
|
%0 = load i32* %b, align 4 ; <i32> [#uses=1]
|
|
%1 = load i32* %b, align 4 ; <i32> [#uses=1]
|
|
%asmtmp = call i32 asm "$0 = foo ($1, $2)", "=&r,%0,r,~{dirflag},~{fpsr},~{flags}"(i32 %0, i32 %1) nounwind ; <i32> [#uses=1]
|
|
store i32 %asmtmp, i32* %a
|
|
br label %return
|
|
|
|
return: ; preds = %entry
|
|
ret void
|
|
}
|