<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Thanks.<br>
      <br>
      This looks like a lot of code just to replace two lines though,
      should I really prefer this code over the previous one ?<br>
      <br>
      Do you have suggestion to remove the errors when the the
      constructor RegisterMaskPair() is not added ?<br>
      <br>
      Compilation gives<br>
      <br>
      In file included from
      /home/axel/packages/llvm/llvm/include/llvm/PassRegistry.h:20:0,<br>
                       from
      /home/axel/packages/llvm/llvm/include/llvm/PassSupport.h:27,<br>
                       from
      /home/axel/packages/llvm/llvm/include/llvm/Pass.h:387,<br>
                       from
      /home/axel/packages/llvm/llvm/include/llvm/IR/DataLayout.h:27,<br>
                       from
      /home/axel/packages/llvm/llvm/include/llvm/Target/TargetMachine.h:19,<br>
                       from
      /home/axel/packages/llvm/llvm/lib/Target/AMDGPU/AMDGPU.h:14,<br>
                       from
/home/axel/packages/llvm/llvm/lib/Target/AMDGPU/SIMachineScheduler.cpp:15:<br>
      /home/axel/packages/llvm/llvm/include/llvm/ADT/DenseMap.h: Dans
      l'instanciation de « BucketT* llvm::DenseMapBase<DerivedT,
      KeyT, ValueT, KeyInfoT, BucketT>::InsertIntoBucket(BucketT*,
      KeyArg&&, ValueArgs&& ...) [with KeyArg = const
      unsigned int&; ValueArgs = {}; DerivedT =
      llvm::DenseMap<unsigned int, llvm::RegisterMaskPair>; KeyT =
      unsigned int; ValueT = llvm::RegisterMaskPair; KeyInfoT =
      llvm::DenseMapInfo<unsigned int>; BucketT =
      llvm::detail::DenseMapPair<unsigned int,
      llvm::RegisterMaskPair>] » :<br>
/home/axel/packages/llvm/llvm/include/llvm/ADT/DenseMap.h:270:12:  
      requis par « llvm::DenseMapBase<DerivedT, KeyT, ValueT,
      KeyInfoT, BucketT>::value_type&
      llvm::DenseMapBase<DerivedT, KeyT, ValueT, KeyInfoT,
      BucketT>::FindAndConstruct(const KeyT&) [with DerivedT =
      llvm::DenseMap<unsigned int, llvm::RegisterMaskPair>; KeyT =
      unsigned int; ValueT = llvm::RegisterMaskPair; KeyInfoT =
      llvm::DenseMapInfo<unsigned int>; BucketT =
      llvm::detail::DenseMapPair<unsigned int,
      llvm::RegisterMaskPair>; llvm::DenseMapBase<DerivedT, KeyT,
      ValueT, KeyInfoT, BucketT>::value_type =
      llvm::detail::DenseMapPair<unsigned int,
      llvm::RegisterMaskPair>] »<br>
/home/axel/packages/llvm/llvm/include/llvm/ADT/DenseMap.h:274:28:  
      requis par « ValueT& llvm::DenseMapBase<DerivedT, KeyT,
      ValueT, KeyInfoT, BucketT>::operator[](const KeyT&) [with
      DerivedT = llvm::DenseMap<unsigned int,
      llvm::RegisterMaskPair>; KeyT = unsigned int; ValueT =
      llvm::RegisterMaskPair; KeyInfoT = llvm::DenseMapInfo<unsigned
      int>; BucketT = llvm::detail::DenseMapPair<unsigned int,
      llvm::RegisterMaskPair>] »<br>
/home/axel/packages/llvm/llvm/lib/Target/AMDGPU/SIMachineScheduler.cpp:2142:37:  
      requis depuis ici<br>
      /home/axel/packages/llvm/llvm/include/llvm/ADT/DenseMap.h:458:5:
      erreur : no matching function for call to
      « llvm::RegisterMaskPair::RegisterMaskPair() »<br>
           ::new (&TheBucket->getSecond())
      ValueT(std::forward<ValueArgs>(Values)...);<br>
          
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
      In file included from
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/MachineScheduler.h:87:0,<br>
                       from
      /home/axel/packages/llvm/llvm/lib/Target/AMDGPU/SIMachineScheduler.h:20,<br>
                       from
/home/axel/packages/llvm/llvm/lib/Target/AMDGPU/SIMachineScheduler.cpp:17:<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:42:3:
      note : candidate:
      llvm::RegisterMaskPair::RegisterMaskPair(unsigned int,
      llvm::LaneBitmask)<br>
         RegisterMaskPair(unsigned RegUnit, LaneBitmask LaneMask)<br>
         ^~~~~~~~~~~~~~~~<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:42:3:
      note :   candidate expects 2 arguments, 0 provided<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:38:8:
      note : candidate: constexpr
      llvm::RegisterMaskPair::RegisterMaskPair(const
      llvm::RegisterMaskPair&)<br>
       struct RegisterMaskPair {<br>
              ^~~~~~~~~~~~~~~~<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:38:8:
      note :   candidate expects 1 argument, 0 provided<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:38:8:
      note : candidate: constexpr
llvm::RegisterMaskPair::RegisterMaskPair(llvm::RegisterMaskPair&&)<br>
/home/axel/packages/llvm/llvm/include/llvm/CodeGen/RegisterPressure.h:38:8:
      note :   candidate expects 1 argument, 0 provided<br>
      <br>
      On 19/03/2017 23:43, Daniel Berlin wrote:<br>
    </div>
    <blockquote
cite="mid:CAF4BwTXR96U6-O2RbtQKLqjNgnSiZ2ar+koJTvJqmdsySJLnjg@mail.gmail.com"
      type="cite">
      <div dir="ltr"><br>
        <div class="gmail_extra"><br>
          <div class="gmail_quote">On Sun, Mar 19, 2017 at 3:28 PM, Axel
            Davy <span dir="ltr"><<a moz-do-not-send="true"
                href="mailto:axel.davy@ens.fr" target="_blank">axel.davy@ens.fr</a>></span>
            wrote:<br>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">
              <div bgcolor="#FFFFFF">
                <div class="gmail-m_6555702049878739804moz-cite-prefix">I'm
                  not familiar with std::transform, but it looks like
                  one element in the source<br>
                  can only give one element in the destination, whereas
                  here you can have one element<br>
                  decomposing into several ones.</div>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>std::transform does not require the input == the output
              type.</div>
            <div><br>
            </div>
            <div>It only requires that assignment of the output iterator
              takes the type</div>
            <div><br>
            </div>
            <div>Thus, the following should work:<br>
              <br>
            </div>
            <div>std::transform(Regs.begin(), Regs.end(),
              vector_inserter(Result), [&] (const RegisterMaskPair
              &RegPair)</div>
            <div>{<br>
              <blockquote class="gmail_quote" style="margin:0px 0px 0px
                0.8ex;border-left:1px solid
                rgb(204,204,204);padding-left:1ex">return
                getPairsForReg(RegPair.RegUnit,  RegPair.LaneMask)</blockquote>
            </div>
            <div>});</div>
            <div><br>
            </div>
            <div>
              <div>
                <div><br>
                </div>
              </div>
            </div>
            <div>Where vector_inserter is defined as:<br>
              <div>class vector__inserter</div>
              <div>    : public
                std::iterator<std::output_iterator_tag, void, void,
                void, void> {</div>
              <div>private:</div>
              <div>  SmallVectorImpl<RegisterMaskPair>
                &Result;<br>
                <br>
              </div>
              <div>public:</div>
              <div>  explicit
                op_inserter(SmallVectorImpl<RegisterMaskPair>
                &Result) : Result(Result) {}<br>
              </div>
              <div><br>
              </div>
              <div>  op_inserter &operator=(const
                SmallVectorImpl<RegisterMaskPair> &Val) {</div>
              <div>    Result.insert(Result.end(), Val.begin(),
                Val.end())</div>
              <div>    return *this;</div>
              <div>  }</div>
              <div>  vector_inserter &operator*() { return *this; }</div>
              <div>  vector_inserter &operator++() { return *this; }</div>
              <div>  vector_inserter &operator++(int) { return
                *this; }</div>
              <div>};</div>
            </div>
            <div><br>
            </div>
            <div><br>
            </div>
            <div><br>
            </div>
            <div><br>
            </div>
            <div><br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>