You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The new test test/CodeGen/X86/licm-regpressure.ll shows this behavior (currently marked as XFAIL). MachineLICM assumes that it is hoisting all of the GEPs out of the loop under in a low pressure situation, when indeed there is register pressure.
The cause here is that the RegLimit (for the RegClass GR64) is 12, but each instruction is assumed to have a cost of only 1.
The problem seems to be that MachineLICM isn't considering the regmasks, i.e. the registers clobbered by the call.
Extended Description
The new test test/CodeGen/X86/licm-regpressure.ll shows this behavior (currently marked as XFAIL). MachineLICM assumes that it is hoisting all of the GEPs out of the loop under in a low pressure situation, when indeed there is register pressure.
The cause here is that the RegLimit (for the RegClass GR64) is 12, but each instruction is assumed to have a cost of only 1.
The problem seems to be that MachineLICM isn't considering the regmasks, i.e. the registers clobbered by the call.
IR leading to the bad behavior:
%struct.A = type { i32, i32, i32, i32, i32, i32, i32 }
define void @test(i1 %b, %struct.A* %a) nounwind {
entry:
br label %loop-header
loop-header:
br label %loop-body
loop-body:
%0 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 0
%1 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 1
%2 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 2
%3 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 3
%4 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 4
%5 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 5
%6 = getelementptr inbounds %struct.A, %struct.A* %a, i64 0, i32 6
call void @assign(i32* %0)
call void @assign(i32* %1)
call void @assign(i32* %2)
call void @assign(i32* %3)
call void @assign(i32* %4)
call void @assign(i32* %5)
call void @assign(i32* %6)
br i1 %b, label %loop-body, label %loop-exit
loop-exit:
ret void
}
declare void @assign(i32*)
The text was updated successfully, but these errors were encountered: