From 021e6e05d3d966d2291434fec1ec5d6db5633963 Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Mon, 17 Oct 2022 11:25:56 -0700 Subject: [PATCH] [instsimplify] Move (extelt (inselt Vec, Value, Index), Index) -> Value from InstCombine As requested in https://reviews.llvm.org/D135625#3858141 Differential Revision: https://reviews.llvm.org/D136099 --- llvm/lib/Analysis/InstructionSimplify.cpp | 8 ++++++++ llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp | 5 ----- .../{InstCombine => InstSimplify}/vector-inseltextelt.ll | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) rename llvm/test/Transforms/{InstCombine => InstSimplify}/vector-inseltextelt.ll (93%) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index fe7b63c..acfac8c 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4857,6 +4857,14 @@ static Value *simplifyExtractElementInst(Value *Vec, Value *Idx, if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue())) return Elt; } else { + // extractelt x, (insertelt y, elt, n), n -> elt + // If the possibly-variable indices are trivially known to be equal + // (because they are the same operand) then use the value that was + // inserted directly. + auto *IE = dyn_cast(Vec); + if (IE && IE->getOperand(2) == Idx) + return IE->getOperand(1); + // The index is not relevant if our vector is a splat. if (Value *Splat = getSplatValue(Vec)) return Splat; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 9bb12cb..40acc24 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -474,11 +474,6 @@ Instruction *InstCombinerImpl::visitExtractElementInst(ExtractElementInst &EI) { if (auto *I = dyn_cast(SrcVec)) { if (auto *IE = dyn_cast(I)) { - // If the possibly-variable indices are trivially known to be equal - // (because they are the same operand) then use the value that was - // inserted directly. - if (IE->getOperand(2) == Index) - return replaceInstUsesWith(EI, IE->getOperand(1)); // instsimplify already handled the case where the indices are constants // and equal by value, if both are constants, they must not be the same // value, extract from the pre-inserted value instead. diff --git a/llvm/test/Transforms/InstCombine/vector-inseltextelt.ll b/llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll similarity index 93% rename from llvm/test/Transforms/InstCombine/vector-inseltextelt.ll rename to llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll index b0a6a4e..f716296 100644 --- a/llvm/test/Transforms/InstCombine/vector-inseltextelt.ll +++ b/llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; RUN: opt < %s -passes=instsimplify -S | FileCheck %s ; extracting a just-inserted element should yield the original value define float @constant_index(<4 x float> %x, float %val) { -- 2.7.4