mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
ed18a3e6b2
This option has been disabled for a while, and it is going away so I can clean up the coalescer code. The tests that required physreg joining to be enabled were almost all of the form "tiny function with interference between arguments and return value". Such functions are usually inlined in the real world. The problem exposed by phys_subreg_coalesce-3.ll is real, but fairly rare. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157027 91177308-0d34-0410-b5e6-96231b3b80d8
45 lines
2.0 KiB
LLVM
45 lines
2.0 KiB
LLVM
; RUN: llc < %s -mtriple=i386-apple-darwin | FileCheck %s
|
|
; XFAIL: *
|
|
; rdar://5571034
|
|
|
|
; This requires physreg joining, %vreg13 is live everywhere:
|
|
; 304L %CL<def> = COPY %vreg13:sub_8bit; GR32_ABCD:%vreg13
|
|
; 320L %vreg15<def> = COPY %vreg19; GR32:%vreg15 GR32_NOSP:%vreg19
|
|
; 336L %vreg15<def> = SAR32rCL %vreg15, %EFLAGS<imp-def,dead>, %CL<imp-use,kill>; GR32:%vreg15
|
|
;
|
|
; This test is XFAIL until the register allocator understands trivial physreg
|
|
; interference. <rdar://9802098>
|
|
|
|
define void @foo(i32* nocapture %quadrant, i32* nocapture %ptr, i32 %bbSize, i32 %bbStart, i32 %shifts) nounwind ssp {
|
|
; CHECK: foo:
|
|
entry:
|
|
%j.03 = add i32 %bbSize, -1 ; <i32> [#uses=2]
|
|
%0 = icmp sgt i32 %j.03, -1 ; <i1> [#uses=1]
|
|
br i1 %0, label %bb.nph, label %return
|
|
|
|
bb.nph: ; preds = %entry
|
|
%tmp9 = add i32 %bbStart, %bbSize ; <i32> [#uses=1]
|
|
%tmp10 = add i32 %tmp9, -1 ; <i32> [#uses=1]
|
|
br label %bb
|
|
|
|
bb: ; preds = %bb, %bb.nph
|
|
; CHECK: %bb
|
|
; CHECK-NOT: movb {{.*}}l, %cl
|
|
; CHECK: sarl %cl
|
|
%indvar = phi i32 [ 0, %bb.nph ], [ %indvar.next, %bb ] ; <i32> [#uses=3]
|
|
%j.06 = sub i32 %j.03, %indvar ; <i32> [#uses=1]
|
|
%tmp11 = sub i32 %tmp10, %indvar ; <i32> [#uses=1]
|
|
%scevgep = getelementptr i32* %ptr, i32 %tmp11 ; <i32*> [#uses=1]
|
|
%1 = load i32* %scevgep, align 4 ; <i32> [#uses=1]
|
|
%2 = ashr i32 %j.06, %shifts ; <i32> [#uses=1]
|
|
%3 = and i32 %2, 65535 ; <i32> [#uses=1]
|
|
%4 = getelementptr inbounds i32* %quadrant, i32 %1 ; <i32*> [#uses=1]
|
|
store i32 %3, i32* %4, align 4
|
|
%indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2]
|
|
%exitcond = icmp eq i32 %indvar.next, %bbSize ; <i1> [#uses=1]
|
|
br i1 %exitcond, label %return, label %bb
|
|
|
|
return: ; preds = %bb, %entry
|
|
ret void
|
|
}
|