[llvm] Revert "[Hexagon] Passes for widening vector operations and shuffle o… (PR #171647)

via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 10 09:33:48 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-hexagon

Author: Brian Cain (androm3da)

<details>
<summary>Changes</summary>

…pt (#<!-- -->169559)"

This reverts commit 4da31b6f579925e17314ad2de2826dc171cd95f4.

---

Patch is 208.34 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/171647.diff


36 Files Affected:

- (modified) llvm/include/llvm/IR/IntrinsicsHexagon.td (+1-79) 
- (modified) llvm/include/llvm/IR/IntrinsicsHexagonDep.td (+14) 
- (modified) llvm/lib/Target/Hexagon/CMakeLists.txt (-3) 
- (modified) llvm/lib/Target/Hexagon/Hexagon.h (-4) 
- (modified) llvm/lib/Target/Hexagon/HexagonGenPredicate.cpp (+2-1) 
- (removed) llvm/lib/Target/Hexagon/HexagonGenWideningVecFloatInstr.cpp (-565) 
- (modified) llvm/lib/Target/Hexagon/HexagonISelLowering.h (-1) 
- (modified) llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp (+1-111) 
- (modified) llvm/lib/Target/Hexagon/HexagonIntrinsics.td (-114) 
- (modified) llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp (+1-1) 
- (removed) llvm/lib/Target/Hexagon/HexagonOptShuffleVector.cpp (-713) 
- (modified) llvm/lib/Target/Hexagon/HexagonPatternsHVX.td (-12) 
- (modified) llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp (-17) 
- (modified) llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp (+13-13) 
- (modified) llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCELFStreamer.cpp (-5) 
- (modified) llvm/test/CodeGen/Hexagon/autohvx/isel-vpackew.ll (+15-11) 
- (modified) llvm/test/CodeGen/Hexagon/autohvx/widen-setcc.ll (+3-1) 
- (removed) llvm/test/CodeGen/Hexagon/bug54537-vavg.ll (-20) 
- (removed) llvm/test/CodeGen/Hexagon/extend-multiply-for-output-fpext.ll (-16) 
- (removed) llvm/test/CodeGen/Hexagon/no_widening_of_bf16_vecmul.ll (-60) 
- (removed) llvm/test/CodeGen/Hexagon/shortvec-vasrsat.ll (-68) 
- (removed) llvm/test/CodeGen/Hexagon/shortvec-vavg.ll (-20) 
- (removed) llvm/test/CodeGen/Hexagon/shortvec-vmpy.ll (-27) 
- (removed) llvm/test/CodeGen/Hexagon/vadd-const.ll (-114) 
- (removed) llvm/test/CodeGen/Hexagon/vasr-sat.ll (-66) 
- (removed) llvm/test/CodeGen/Hexagon/vavg.ll (-33) 
- (removed) llvm/test/CodeGen/Hexagon/vec-shuff-invalid-operand.ll (-30) 
- (removed) llvm/test/CodeGen/Hexagon/vec-shuff-multi-uses.ll (-290) 
- (removed) llvm/test/CodeGen/Hexagon/vec-shuff2.ll (-106) 
- (removed) llvm/test/CodeGen/Hexagon/vmpa.ll (-64) 
- (removed) llvm/test/CodeGen/Hexagon/vmpy-const.ll (-273) 
- (removed) llvm/test/CodeGen/Hexagon/vmpy-qfp-const.ll (-71) 
- (removed) llvm/test/CodeGen/Hexagon/vsub-const.ll (-112) 
- (removed) llvm/test/CodeGen/Hexagon/widening-float-vec.ll (-15) 
- (removed) llvm/test/CodeGen/Hexagon/widening-vec.ll (-96) 
- (removed) llvm/test/CodeGen/Hexagon/widening-vec2.ll (-23) 


``````````diff
diff --git a/llvm/include/llvm/IR/IntrinsicsHexagon.td b/llvm/include/llvm/IR/IntrinsicsHexagon.td
index 2c945d2399b25..20ba51ade35a7 100644
--- a/llvm/include/llvm/IR/IntrinsicsHexagon.td
+++ b/llvm/include/llvm/IR/IntrinsicsHexagon.td
@@ -14,7 +14,7 @@
 //
 // All Hexagon intrinsics start with "llvm.hexagon.".
 let TargetPrefix = "hexagon" in {
-  /// Hexagon_Intrinsic - Base class for majority of Hexagon intrinsics.
+  /// Hexagon_Intrinsic - Base class for the majority of Hexagon intrinsics.
   class Hexagon_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
                               list<LLVMType> param_types,
                               list<IntrinsicProperty> properties>
@@ -435,84 +435,6 @@ def int_hexagon_V6_vmaskedstorenq_128B: Hexagon_custom_vms_Intrinsic_128B;
 def int_hexagon_V6_vmaskedstorentq_128B: Hexagon_custom_vms_Intrinsic_128B;
 def int_hexagon_V6_vmaskedstorentnq_128B: Hexagon_custom_vms_Intrinsic_128B;
 
-// Carryo
-// The script can't autogenerate clang builtins for vaddcarryo/vsubarryo,
-// and they are marked in HexagonIset.py as not having intrinsics at all.
-// The script could generate intrinsics, but instead of doing intrinsics
-// without builtins, just put the intrinsics here.
-
-// tag : V6_vaddcarryo
-class Hexagon_custom_v16i32v64i1_v16i32v16i32_Intrinsic<
-      list<IntrinsicProperty> intr_properties = [IntrNoMem]>
-  : Hexagon_NonGCC_Intrinsic<
-       [llvm_v16i32_ty,llvm_v64i1_ty], [llvm_v16i32_ty,llvm_v16i32_ty],
-       intr_properties>;
-
-// tag : V6_vaddcarryo
-class Hexagon_custom_v32i32v128i1_v32i32v32i32_Intrinsic_128B<
-      list<IntrinsicProperty> intr_properties = [IntrNoMem]>
-  : Hexagon_NonGCC_Intrinsic<
-       [llvm_v32i32_ty,llvm_v128i1_ty], [llvm_v32i32_ty,llvm_v32i32_ty],
-       intr_properties>;
-
-// Pseudo intrinsics for widening vector isntructions that
-// get replaced with the real Hexagon instructions during
-// instruction lowering.
-class Hexagon_widenvec_Intrinsic
-  : Hexagon_NonGCC_Intrinsic<
-       [llvm_anyvector_ty],
-       [LLVMTruncatedType<0>, LLVMTruncatedType<0>],
-       [IntrNoMem]>;
-
-class Hexagon_non_widenvec_Intrinsic
-  : Hexagon_NonGCC_Intrinsic<
-       [llvm_anyvector_ty],
-       [LLVMMatchType<0>, LLVMMatchType<0>],
-       [IntrNoMem]>;
-
-// Widening vector add
-def int_hexagon_vadd_su: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vadd_uu: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vadd_ss: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vadd_us: Hexagon_widenvec_Intrinsic;
-
-
-// Widening vector subtract
-def int_hexagon_vsub_su: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vsub_uu: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vsub_ss: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vsub_us: Hexagon_widenvec_Intrinsic;
-
-// Widening vector multiply
-def int_hexagon_vmpy_su: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vmpy_uu: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vmpy_ss: Hexagon_widenvec_Intrinsic;
-def int_hexagon_vmpy_us: Hexagon_widenvec_Intrinsic;
-
-def int_hexagon_vavgu: Hexagon_non_widenvec_Intrinsic;
-def int_hexagon_vavgs: Hexagon_non_widenvec_Intrinsic;
-
-class Hexagon_vasr_Intrinsic
-  : Hexagon_NonGCC_Intrinsic<
-       [LLVMSubdivide2VectorType<0>],
-       [llvm_anyvector_ty, LLVMMatchType<0>, llvm_i32_ty],
-       [IntrNoMem]>;
-
-def int_hexagon_vasrsat_su: Hexagon_vasr_Intrinsic;
-def int_hexagon_vasrsat_uu: Hexagon_vasr_Intrinsic;
-def int_hexagon_vasrsat_ss: Hexagon_vasr_Intrinsic;
-
-class Hexagon_widen_vec_scalar_Intrinsic
-  : Hexagon_NonGCC_Intrinsic<
-       [llvm_anyvector_ty],
-       [LLVMTruncatedType<0>, llvm_i32_ty],
-       [IntrNoMem]>;
-
-// Widening vector scalar multiply
-def int_hexagon_vmpy_ub_b: Hexagon_widen_vec_scalar_Intrinsic;
-def int_hexagon_vmpy_ub_ub: Hexagon_widen_vec_scalar_Intrinsic;
-def int_hexagon_vmpy_uh_uh: Hexagon_widen_vec_scalar_Intrinsic;
-def int_hexagon_vmpy_h_h: Hexagon_widen_vec_scalar_Intrinsic;
 
 // Intrinsic for instrumentation based profiling using a custom handler. The
 // name of the handler is passed as the first operand to the intrinsic. The
diff --git a/llvm/include/llvm/IR/IntrinsicsHexagonDep.td b/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
index 2a673603e4e03..dde4132791f06 100644
--- a/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
+++ b/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
@@ -491,6 +491,20 @@ class Hexagon_custom_v32i32v128i1_v32i32v32i32v128i1_Intrinsic_128B<
        [llvm_v32i32_ty,llvm_v128i1_ty], [llvm_v32i32_ty,llvm_v32i32_ty,llvm_v128i1_ty],
        intr_properties>;
 
+// tag : V6_vaddcarryo
+class Hexagon_custom_v16i32v64i1_v16i32v16i32_Intrinsic<
+      list<IntrinsicProperty> intr_properties = [IntrNoMem]>
+  : Hexagon_NonGCC_Intrinsic<
+       [llvm_v16i32_ty,llvm_v64i1_ty], [llvm_v16i32_ty,llvm_v16i32_ty],
+       intr_properties>;
+
+// tag : V6_vaddcarryo
+class Hexagon_custom_v32i32v128i1_v32i32v32i32_Intrinsic_128B<
+      list<IntrinsicProperty> intr_properties = [IntrNoMem]>
+  : Hexagon_NonGCC_Intrinsic<
+       [llvm_v32i32_ty,llvm_v128i1_ty], [llvm_v32i32_ty,llvm_v32i32_ty],
+       intr_properties>;
+
 // tag : V6_vaddcarrysat
 class Hexagon_v16i32_v16i32v16i32v64i1_Intrinsic<string GCCIntSuffix,
       list<IntrinsicProperty> intr_properties = [IntrNoMem]>
diff --git a/llvm/lib/Target/Hexagon/CMakeLists.txt b/llvm/lib/Target/Hexagon/CMakeLists.txt
index eddab5a235dab..1a5f09642ea66 100644
--- a/llvm/lib/Target/Hexagon/CMakeLists.txt
+++ b/llvm/lib/Target/Hexagon/CMakeLists.txt
@@ -37,8 +37,6 @@ add_llvm_target(HexagonCodeGen
   HexagonGenMemAbsolute.cpp
   HexagonGenMux.cpp
   HexagonGenPredicate.cpp
-  HexagonGenWideningVecFloatInstr.cpp
-  HexagonGenWideningVecInstr.cpp
   HexagonHardwareLoops.cpp
   HexagonHazardRecognizer.cpp
   HexagonInstrInfo.cpp
@@ -55,7 +53,6 @@ add_llvm_target(HexagonCodeGen
   HexagonNewValueJump.cpp
   HexagonOptAddrMode.cpp
   HexagonOptimizeSZextends.cpp
-  HexagonOptShuffleVector.cpp
   HexagonPeephole.cpp
   HexagonQFPOptimizer.cpp
   HexagonRDFOpt.cpp
diff --git a/llvm/lib/Target/Hexagon/Hexagon.h b/llvm/lib/Target/Hexagon/Hexagon.h
index b98369d1b3e30..422ab20891b94 100644
--- a/llvm/lib/Target/Hexagon/Hexagon.h
+++ b/llvm/lib/Target/Hexagon/Hexagon.h
@@ -92,9 +92,6 @@ FunctionPass *createHexagonGenInsert();
 FunctionPass *createHexagonGenMemAbsolute();
 FunctionPass *createHexagonGenMux();
 FunctionPass *createHexagonGenPredicate();
-FunctionPass *
-createHexagonGenWideningVecFloatInstr(const HexagonTargetMachine &);
-FunctionPass *createHexagonGenWideningVecInstr(const HexagonTargetMachine &);
 FunctionPass *createHexagonHardwareLoops();
 FunctionPass *createHexagonISelDag(HexagonTargetMachine &TM,
                                    CodeGenOptLevel OptLevel);
@@ -105,7 +102,6 @@ FunctionPass *createHexagonMergeActivateWeight();
 FunctionPass *createHexagonNewValueJump();
 FunctionPass *createHexagonOptAddrMode();
 FunctionPass *createHexagonOptimizeSZextends();
-FunctionPass *createHexagonOptShuffleVector(const HexagonTargetMachine &);
 FunctionPass *createHexagonPacketizer(bool Minimal);
 FunctionPass *createHexagonPeephole();
 FunctionPass *createHexagonRDFOpt();
diff --git a/llvm/lib/Target/Hexagon/HexagonGenPredicate.cpp b/llvm/lib/Target/Hexagon/HexagonGenPredicate.cpp
index 412d58743df94..5344ed8446efc 100644
--- a/llvm/lib/Target/Hexagon/HexagonGenPredicate.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonGenPredicate.cpp
@@ -51,7 +51,8 @@ struct PrintRegister {
 };
 
 [[maybe_unused]] raw_ostream &operator<<(raw_ostream &OS,
-                                         const PrintRegister &PR) {
+                                         const PrintRegister &PR);
+raw_ostream &operator<<(raw_ostream &OS, const PrintRegister &PR) {
   return OS << printReg(PR.Reg.Reg, &PR.TRI, PR.Reg.SubReg);
 }
 
diff --git a/llvm/lib/Target/Hexagon/HexagonGenWideningVecFloatInstr.cpp b/llvm/lib/Target/Hexagon/HexagonGenWideningVecFloatInstr.cpp
deleted file mode 100644
index 7271f1f839d69..0000000000000
--- a/llvm/lib/Target/Hexagon/HexagonGenWideningVecFloatInstr.cpp
+++ /dev/null
@@ -1,565 +0,0 @@
-//===------------------- HexagonGenWideningVecFloatInstr.cpp --------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Replace widening vector float operations with hexagon intrinsics.
-//
-//===----------------------------------------------------------------------===//
-//
-// Brief overview of working of GenWideningVecFloatInstr pass.
-// This version of pass is replica of already existing pass(which will replace
-// widen vector integer operations with it's respective intrinsics). In this
-// pass we will generate hexagon intrinsics for widen vector float instructions.
-//
-// Example1(64 vector-width widening):
-// %wide.load = load <64 x half>, <64 x half>* %0, align 2
-// %wide.load53 = load <64 x half>, <64 x half>* %2, align 2
-// %1 = fpext <64 x half> %wide.load to <64 x float>
-// %3 = fpext <64 x half> %wide.load53 to <64 x float>
-// %4 = fmul <64 x float> %1, %3
-//
-// If we run this pass on the above example, it will first find fmul
-// instruction, and then it will check whether the operands of fmul instruction
-// (%1 and %3) belongs to either of these categories [%1 ->fpext, %3 ->fpext]
-// or [%1 ->fpext, %3 ->constant_vector] or [%1 ->constant_vector, %3 ->fpext].
-// If it sees such pattern, then this pass will replace such pattern with
-// appropriate hexagon intrinsics.
-//
-// After replacement:
-// %wide.load = load <64 x half>, <64 x half>* %0, align 2
-// %wide.load53 = load <64 x half>, <64 x half>* %2, align 2
-// %3 = bitcast <64 x half> %wide.load to <32 x i32>
-// %4 = bitcast <64 x half> %wide.load53 to <32 x i32>
-// %5 = call <64 x i32> @llvm.hexagon.V6.vmpy.qf32.hf.128B(%3, %4)
-// %6 = shufflevector <64 x i32> %5, <64 x i32> poison, <64 x i32> ShuffMask1
-// %7 = call <32 x i32> @llvm.hexagon.V6.hi.128B(<64 x i32> %6)
-// %8 = call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %6)
-// %9 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %7)
-// %10 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %8)
-// %11 = bitcast <32 x i32> %9 to <32 x float>
-// %12 = bitcast <32 x i32> %10 to <32 x float>
-// %13 = shufflevector <32 x float> %12, <32 x float> %11, <64 x i32> ShuffMask2
-//
-//
-//
-// Example2(128 vector-width widening):
-// %0 = bitcast half* %a to <128 x half>*
-// %wide.load = load <128 x half>, <128 x half>* %0, align 2
-// %1 = fpext <128 x half> %wide.load to <128 x float>
-// %2 = bitcast half* %b to <128 x half>*
-// %wide.load2 = load <128 x half>, <128 x half>* %2, align 2
-// %3 = fpext <128 x half> %wide.load2 to <128 x float>
-// %4 = fmul <128 x float> %1, %3
-//
-// After replacement:
-// %0 = bitcast half* %a to <128 x half>*
-// %wide.load = load <128 x half>, <128 x half>* %0, align 2
-// %1 = bitcast half* %b to <128 x half>*
-// %wide.load2 = load <128 x half>, <128 x half>* %1, align 2
-// %2 = bitcast <128 x half> %wide.load to <64 x i32>
-// %3 = call <32 x i32> @llvm.hexagon.V6.hi.128B(<64 x i32> %2)
-// %4 = call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %2)
-// %5 = bitcast <128 x half> %wide.load2 to <64 x i32>
-// %6 = call <32 x i32> @llvm.hexagon.V6.hi.128B(<64 x i32> %5)
-// %7 = call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %5)
-// %8 = call <64 x i32> @llvm.hexagon.V6.vmpy.qf32.hf.128B(%3, %6)
-// %9 = shufflevector <64 x i32> %8, <64 x i32> poison, <64 x i32> Mask1
-// %10 = call <32 x i32> @llvm.hexagon.V6.hi.128B(<64 x i32> %9)
-// %11 = call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %9)
-// %12 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %10)
-// %13 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %11)
-// %14 = bitcast <32 x i32> %12 to <32 x float>
-// %15 = bitcast <32 x i32> %13 to <32 x float>
-// %16 = shufflevector <32 x float> %15, <32 x float> %14, <64 x i32> Mask2
-// %17 = call <64 x i32> @llvm.hexagon.V6.vmpy.qf32.hf.128B(%4, %7)
-// %18 = shufflevector <64 x i32> %17, <64 x i32> poison, <64 x i32> Mask1
-// %19 = call <32 x i32> @llvm.hexagon.V6.hi.128B(<64 x i32> %18)
-// %20 = call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %18)
-// %21 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %19)
-// %22 = call <32 x i32> @llvm.hexagon.V6.vconv.sf.qf32.128B(<32 x i32> %20)
-// %23 = bitcast <32 x i32> %21 to <32 x float>
-// %24 = bitcast <32 x i32> %22 to <32 x float>
-// %25 = shufflevector <32 x float> %24, <32 x float> %23, <64 x i32> Mask2
-// %26 = shufflevector <64 x float> %25, <64 x float> %16, <128 x i32> Mask3
-//
-//
-//===----------------------------------------------------------------------===//
-#include "HexagonTargetMachine.h"
-#include "llvm/ADT/APInt.h"
-#include "llvm/IR/BasicBlock.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/Instruction.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/IntrinsicsHexagon.h"
-#include "llvm/IR/PatternMatch.h"
-#include "llvm/IR/Type.h"
-#include "llvm/IR/Value.h"
-#include "llvm/InitializePasses.h"
-#include "llvm/Pass.h"
-#include <algorithm>
-#include <utility>
-
-using namespace llvm;
-
-namespace llvm {
-void initializeHexagonGenWideningVecFloatInstrPass(PassRegistry &);
-FunctionPass *
-createHexagonGenWideningVecFloatInstr(const HexagonTargetMachine &);
-} // end namespace llvm
-
-namespace {
-
-class HexagonGenWideningVecFloatInstr : public FunctionPass {
-public:
-  static char ID;
-
-  HexagonGenWideningVecFloatInstr() : FunctionPass(ID) {
-    initializeHexagonGenWideningVecFloatInstrPass(
-        *PassRegistry::getPassRegistry());
-  }
-
-  HexagonGenWideningVecFloatInstr(const HexagonTargetMachine *TM)
-      : FunctionPass(ID), TM(TM) {
-    initializeHexagonGenWideningVecFloatInstrPass(
-        *PassRegistry::getPassRegistry());
-  }
-
-  StringRef getPassName() const override {
-    return "Hexagon generate widening vector float instructions";
-  }
-
-  bool runOnFunction(Function &F) override;
-
-  void getAnalysisUsage(AnalysisUsage &AU) const override {
-    FunctionPass::getAnalysisUsage(AU);
-  }
-
-private:
-  Module *M = nullptr;
-  const HexagonTargetMachine *TM = nullptr;
-  const HexagonSubtarget *HST = nullptr;
-  unsigned HwVLen;
-  unsigned NumHalfEltsInFullVec;
-
-  struct OPInfo {
-    Value *OP;
-    Value *ExtInOP;
-    unsigned ExtInSize;
-  };
-
-  bool visitBlock(BasicBlock *B);
-  bool processInstruction(Instruction *Inst);
-  bool replaceWithIntrinsic(Instruction *Inst, OPInfo &OP1Info,
-                            OPInfo &OP2Info);
-
-  bool getOperandInfo(Value *V, OPInfo &OPI);
-  bool isExtendedConstant(Constant *C);
-  unsigned getElementSizeInBits(Value *V);
-  Type *getElementTy(unsigned size, IRBuilder<> &IRB);
-
-  Value *adjustExtensionForOp(OPInfo &OPI, IRBuilder<> &IRB,
-                              unsigned NewEltsize, unsigned NumElts);
-
-  std::pair<Value *, Value *> opSplit(Value *OP, Instruction *Inst);
-
-  Value *createIntrinsic(Intrinsic::ID IntId, Instruction *Inst, Value *NewOP1,
-                         Value *NewOP2, FixedVectorType *ResType,
-                         unsigned NumElts, bool BitCastOp);
-};
-
-} // end anonymous namespace
-
-char HexagonGenWideningVecFloatInstr::ID = 0;
-
-INITIALIZE_PASS_BEGIN(HexagonGenWideningVecFloatInstr, "widening-vec-float",
-                      "Hexagon generate "
-                      "widening vector float instructions",
-                      false, false)
-INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
-INITIALIZE_PASS_END(HexagonGenWideningVecFloatInstr, "widening-vec-float",
-                    "Hexagon generate "
-                    "widening vector float instructions",
-                    false, false)
-
-bool HexagonGenWideningVecFloatInstr::isExtendedConstant(Constant *C) {
-  if (Value *SplatV = C->getSplatValue()) {
-    if (auto *CFP = dyn_cast<ConstantFP>(SplatV)) {
-      bool Ignored;
-      APFloat APF = CFP->getValueAPF();
-      APFloat::opStatus sts = APF.convert(
-          APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
-      if (sts == APFloat::opStatus::opOK || sts == APFloat::opStatus::opInexact)
-        return true;
-    }
-    return false;
-  }
-  unsigned NumElts = cast<FixedVectorType>(C->getType())->getNumElements();
-  for (unsigned i = 0, e = NumElts; i != e; ++i) {
-    if (auto *CFP = dyn_cast<ConstantFP>(C->getAggregateElement(i))) {
-      bool Ignored;
-      APFloat APF = CFP->getValueAPF();
-      APFloat::opStatus sts = APF.convert(
-          APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
-      if (sts != APFloat::opStatus::opOK && sts != APFloat::opStatus::opInexact)
-        return false;
-      continue;
-    }
-    return false;
-  }
-  return true;
-}
-
-unsigned HexagonGenWideningVecFloatInstr::getElementSizeInBits(Value *V) {
-  Type *ValTy = V->getType();
-  Type *EltTy = ValTy;
-  if (dyn_cast<Constant>(V)) {
-    unsigned EltSize =
-        cast<VectorType>(EltTy)->getElementType()->getPrimitiveSizeInBits();
-    unsigned ReducedSize = EltSize / 2;
-
-    return ReducedSize;
-  }
-
-  if (ValTy->isVectorTy())
-    EltTy = cast<VectorType>(ValTy)->getElementType();
-  return EltTy->getPrimitiveSizeInBits();
-}
-
-bool HexagonGenWideningVecFloatInstr::getOperandInfo(Value *V, OPInfo &OPI) {
-  using namespace PatternMatch;
-  OPI.OP = V;
-  Value *ExtV = nullptr;
-  Constant *C = nullptr;
-
-  if (match(V, (m_FPExt(m_Value(ExtV)))) ||
-      match(V,
-            m_Shuffle(m_InsertElt(m_Poison(), m_FPExt(m_Value(ExtV)), m_Zero()),
-                      m_Poison(), m_ZeroMask()))) {
-
-    if (auto *ExtVType = dyn_cast<VectorType>(ExtV->getType())) {
-      // Matches the first branch.
-      if (ExtVType->getElementType()->isBFloatTy())
-        // do not confuse bf16 with ieee-fp16.
-        return false;
-    } else {
-      // Matches the second branch (insert element branch)
-      if (ExtV->getType()->isBFloatTy())
-        return false;
-    }
-
-    OPI.ExtInOP = ExtV;
-    OPI.ExtInSize = getElementSizeInBits(OPI.ExtInOP);
-    return true;
-  }
-
-  if (match(V, m_Constant(C))) {
-    if (!isExtendedConstant(C))
-      return false;
-    OPI.ExtInOP = C;
-    OPI.ExtInSize = getElementSizeInBits(OPI.ExtInOP);
-    return true;
-  }
-
-  return false;
-}
-
-Type *HexagonGenWideningVecFloatInstr::getElementTy(unsigned size,
-                                                    IRBuilder<> &IRB) {
-  switch (size) {
-  case 16:
-    return IRB.getHalfTy();
-  case 32:
-    return IRB.getFloatTy();
-  default:
-    llvm_unreachable("Unhandled Element size");
-  }
-}
-
-Value *HexagonGenWideningVecFloatInstr::adjustExtensionForOp(
-    OPInfo &OPI, IRBuilder<> &IRB, unsigned NewExtSize, unsigned NumElts) {
-  Value *V = OPI.ExtInOP;
-  unsigned EltSize = getElementSizeInBits(OPI.ExtInOP);
-  assert(NewExtSize >= EltSize);
-  Type *EltType = getElementTy(NewExtSize, IRB);
-  auto *NewOpTy = FixedVectorType::get(EltType, NumElts);
-
-  if (auto *C = dyn_cast<Constant>(V))
-    return IRB.CreateFPTrunc(C, NewOpTy);
-
-  if (V->getType()->isVectorTy())
-    if (NewExtSize == EltSize)
-      return V;
-
-  return nullptr;
-}
-
-std::pair<Value *, Value *>
-HexagonGenWideningVecFloatInstr::opSplit(Value *OP, Instruction *Inst) {
-  Type *InstTy = Inst->getType();
-  unsigned NumElts = cast<FixedVectorType>(InstTy)->getNumElements();
-  IRBuilder<> IRB(Inst);
-  Intrinsic::ID IntHi = Intrinsic::hexagon_V6_hi_128B;
-  Intrinsic::ID IntLo = Intrinsic::hexagon_V6_lo_128B;
-  Function *ExtFHi = Intrinsic::getOrInsertDeclaration(M, IntHi);
-  Function *ExtFLo = Intrinsic::getOrInsertDeclaration(M, IntLo);
-  if (NumElts == 128) {
-    auto *InType = FixedVectorType::get(IRB.getInt32Ty(), 64);
-    OP = IRB.CreateBitCast(OP, InType);
-  }
-  Value *OP1Hi = IRB.CreateCall(ExtFHi, {OP});
-  Value *OP1Lo = IRB.CreateCall(ExtFLo, {OP});
-  return std::pair<Value *, Value *>(OP1Hi, OP1Lo);
-}
-
-Value *HexagonGenWideningVecFloatInstr::createIntrinsic(
-    Intrinsic::ID IntId, Instruction *Inst, Value *NewOP1, Value *NewOP2,
-    FixedVectorType *ResType, unsigned NumElts, bool BitC...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/171647


More information about the llvm-commits mailing list