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

[CIR] Lower certain cir.cmp3way operations to LLVM intrinsics #556

Merged
merged 3 commits into from
Apr 23, 2024

Conversation

Lancern
Copy link
Member

@Lancern Lancern commented Apr 20, 2024

LLVM recently added two families of intrinsics named llvm.scmp.* and llvm.ucmp.* that generate potentially better code for three-way comparison operations. This PR lowers certain cir.cmp3way operations to these intrinsics.

Not all cir.cmp3way operations can be lowered to these intrinsics. The qualifying conditions are: 1) the comparison is between two integers, and 2) the comparison produces a strong ordering. cir.cmp3way operations that are not qualified are not affected by this PR.

Qualifying cir.cmp3way operations may still need some canonicalization work before lowering. The "canonicalized" form of a qualifying three-way comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR converts those non-canonicalized but qualifying cir.cmp3way operations to their canonical forms in the LLVM lowering prepare pass.

This PR addresses #514 .

…insics

LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way comparison
operations. This patch lowers certain `cir.cmp3way` operations to these
intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers, and 2) the
comparison produces a strong order. `cir.cmp3way` operations that are not
qualified are not affected by this patch.

Qualifying `cir.cmp3way` operations may still need some canonicalization work
before lowering. The "canonicalized" form of a qualifying three-way comparison
operation yields -1 for lt, 0 for eq, and 1 for gt. This patch converts those
non-canonicalized but qualifying `cir.cmp3way` operations to their canonical
forms in the LLVM lowering prepare pass.
Copy link
Member

@bcardosolopes bcardosolopes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, pending few nits

@bcardosolopes bcardosolopes merged commit d4bd56e into llvm:main Apr 23, 2024
6 checks passed
@Lancern Lancern deleted the llvm-cmp3way-intrinsic branch April 24, 2024 01:21
bcardosolopes pushed a commit that referenced this pull request Apr 25, 2024
…icOp` (#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](#556 (comment))
in #556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
lanza pushed a commit that referenced this pull request Apr 29, 2024
LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses #514 .
lanza pushed a commit that referenced this pull request Apr 29, 2024
…icOp` (#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](#556 (comment))
in #556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
lanza pushed a commit that referenced this pull request Apr 29, 2024
LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses #514 .
lanza pushed a commit that referenced this pull request Apr 29, 2024
…icOp` (#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](#556 (comment))
in #556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
lanza pushed a commit that referenced this pull request Apr 29, 2024
LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses #514 .
lanza pushed a commit that referenced this pull request Apr 29, 2024
…icOp` (#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](#556 (comment))
in #556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
pysuxing pushed a commit to pysuxing/llvm-project that referenced this pull request Jul 17, 2024
…icOp` (llvm#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](llvm/clangir#556 (comment))
in llvm#556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
bruteforceboy pushed a commit to bruteforceboy/clangir that referenced this pull request Oct 2, 2024
…#556)

LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses llvm#514 .
Hugobros3 pushed a commit to shady-gang/clangir that referenced this pull request Oct 2, 2024
…#556)

LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses llvm#514 .
Hugobros3 pushed a commit to shady-gang/clangir that referenced this pull request Oct 2, 2024
…icOp` (llvm#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](llvm#556 (comment))
in llvm#556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
keryell pushed a commit to keryell/clangir that referenced this pull request Oct 19, 2024
…#556)

LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses llvm#514 .
keryell pushed a commit to keryell/clangir that referenced this pull request Oct 19, 2024
…icOp` (llvm#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](llvm#556 (comment))
in llvm#556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
lanza pushed a commit that referenced this pull request Nov 5, 2024
LLVM recently added two families of intrinsics named `llvm.scmp.*` and
`llvm.ucmp.*` that generate potentially better code for three-way
comparison operations. This PR lowers certain `cir.cmp3way` operations
to these intrinsics.

Not all `cir.cmp3way` operations can be lowered to these intrinsics. The
qualifying conditions are: 1) the comparison is between two integers,
and 2) the comparison produces a strong ordering. `cir.cmp3way`
operations that are not qualified are not affected by this PR.

Qualifying `cir.cmp3way` operations may still need some canonicalization
work before lowering. The "canonicalized" form of a qualifying three-way
comparison operation yields -1 for lt, 0 for eq, and 1 for gt. This PR
converts those non-canonicalized but qualifying `cir.cmp3way` operations
to their canonical forms in the LLVM lowering prepare pass.

This PR addresses #514 .
lanza pushed a commit that referenced this pull request Nov 5, 2024
…icOp` (#564)

This PR does not introduce any functional changes. It cleans up code in
`LowerToLLVM.cpp` and creates all LLVM intrinsic calls through the
unified `createCallLLVMIntrinsicOp` function, as suggested by [this
comment](#556 (comment))
in #556 .

Some LLVM intrinsics already have specialized LLVMIR operations. CIR
operations that depend on these intrinsics are lowered to those
specialized operations rather than `llvm.call_intrinsic` operation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants