[all-commits] [llvm/llvm-project] 463ea2: [InstCombine] Fold comparison of integers by parts
Nikita Popov via All-commits
all-commits at lists.llvm.org
Mon May 10 13:23:23 PDT 2021
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 463ea28e96c78f484d9ea44912d9bc70ff084c86
https://github.com/llvm/llvm-project/commit/463ea28e96c78f484d9ea44912d9bc70ff084c86
Author: Nikita Popov <nikita.ppv at gmail.com>
Date: 2021-05-10 (Mon, 10 May 2021)
Changed paths:
M llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
M llvm/test/Transforms/InstCombine/eq-of-parts.ll
Log Message:
-----------
[InstCombine] Fold comparison of integers by parts
Let's say you represent (i32, i32) as an i64 from which the parts
are extracted with lshr/trunc. Then, if you compare two tuples by
parts you get something like A[0] == B[0] && A[1] == B[1], just
that the part extraction happens by lshr/trunc and not a narrow
load or similar.
The fold implemented here reduces such equality comparisons by
converting them into a comparison on a larger part of the integer
(which might be the whole integer). It handles both the "and of eq"
and the conjugated "or of ne" case.
I'm being conservative with one-use for now, though this could be
relaxed if profitable (the base pattern converts 11 instructions
into 5 instructions, but there's quite a few variations on how it
can play out).
Differential Revision: https://reviews.llvm.org/D101232
More information about the All-commits
mailing list