[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