Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MachineLICM register pressure calculation incorrect #23517

Open
llvmbot opened this issue Apr 7, 2015 · 0 comments
Open

MachineLICM register pressure calculation incorrect #23517

llvmbot opened this issue Apr 7, 2015 · 0 comments
Labels
bugzilla Issues migrated from bugzilla llvm:codegen

Comments

@llvmbot
Copy link
Collaborator

llvmbot commented Apr 7, 2015

Bugzilla Link 23143
Version trunk
OS All
Reporter LLVM Bugzilla Contributor
CC @hfinkel,@qcolombet

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*)

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla llvm:codegen
Projects
None yet
Development

No branches or pull requests

1 participant