C ++:gcc优化中的可能错误

时间:2019-01-21 20:58:15

标签: c++ templates gcc optimization

我有gcc8.2.1

在以下代码中,我希望编译器不会在方法mfence中的两个CheckAndPrint()指令之间生成任何代码。

的确,如果我调用PrintGood<false>()方法并且没有代码生成,它将很好地完成工作。但是,如果我不评论PrintBad<false>()甚至是简单的return,编译器都会为if表达式if (t.j > 0)生成代码。

在所有三种情况下,都没有理由生成任何代码,尤其是对于昂贵的分支。

下面的代码编译为:

g++ -std=c++11 -Ofast optimization_problem.cc -o optimization_problem

试图直接与gcc bugzilla联系,但在该处创建帐户时遇到问题。

编译器在一种情况下设法优化代码,而在另两种情况下却无法优化代码是否有充分的理由?

#include <iostream>
#include <string>

struct Data {
  int i;
  int j;
};

template <typename Dummy>
class Test {
 public:
  template <typename T>
  void CheckAndPrint(const T &t);

 protected:
  template <bool print, typename T>
  inline void PrintGood(const std::string &prefix, const T &t);

  template <bool print, typename T>
  inline void PrintBad(const std::string &prefix, const std::string  &postfix, const T &t);
};

template <typename Dummy>
template <typename T>
inline void Test<Dummy>::CheckAndPrint(const T &t) {
  asm volatile ("mfence" ::: "memory");
  if (t.j > 0) {
    //return;
    //PrintBad<false>("<", ">", t);
    PrintGood<false>("<", t);
  }
  asm volatile ("mfence" ::: "memory");
}

template <typename Dummy>
template <bool print, typename T>
inline void Test<Dummy>::PrintGood(const std::string &prefix, const T &t) {
  if (print)
    std::cout << prefix << t.i << t.j << std::endl;
}

template <typename Dummy>
template <bool print, typename T>
inline void Test<Dummy>::PrintBad(const std::string &prefix, const std::string &postfix, const T &t) {
  if (print)
    std::cout << prefix << t.i << t.j << postfix << std::endl;
}

int main() {
  Data data;
  std::cin >> data.i;
  std::cin >> data.j;

  Test<int> t;
  t.CheckAndPrint(data);

  return 0;
}

0 个答案:

没有答案