changeset 46b6043bd32c in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=46b6043bd32c
description:
        cpu: Work around gcc 4.9 issues with Num_OpClasses

        This patch fixes a recent issue with gcc 4.9 (and possibly more) being
        convinced that indices outside the array bounds are used when
        initialising the FUPool members.

diffstat:

 src/cpu/minor/execute.cc |   2 +-
 src/cpu/o3/fu_pool.cc    |   6 +--
 src/cpu/o3/fu_pool.hh    |   5 ++-
 src/cpu/op_class.hh      |  69 +++++++++++++++++++++++------------------------
 4 files changed, 40 insertions(+), 42 deletions(-)

diffs (130 lines):

diff -r c6189a9b8cd7 -r 46b6043bd32c src/cpu/minor/execute.cc
--- a/src/cpu/minor/execute.cc  Tue May 05 03:22:17 2015 -0400
+++ b/src/cpu/minor/execute.cc  Tue May 05 03:22:19 2015 -0400
@@ -150,7 +150,7 @@
     }
 
     /** Check that there is a functional unit for all operation classes */
-    for (int op_class = No_OpClass + 1; op_class < Num_OpClass; op_class++) {
+    for (int op_class = No_OpClass + 1; op_class < Num_OpClasses; op_class++) {
         bool found_fu = false;
         unsigned int fu_index = 0;
 
diff -r c6189a9b8cd7 -r 46b6043bd32c src/cpu/o3/fu_pool.cc
--- a/src/cpu/o3/fu_pool.cc     Tue May 05 03:22:17 2015 -0400
+++ b/src/cpu/o3/fu_pool.cc     Tue May 05 03:22:19 2015 -0400
@@ -87,10 +87,8 @@
 
     funcUnits.clear();
 
-    for (int i = 0; i < Num_OpClasses; ++i) {
-        maxOpLatencies[i] = Cycles(0);
-        pipelined[i] = true;
-    }
+    maxOpLatencies.fill(Cycles(0));
+    pipelined.fill(true);
 
     //
     //  Iterate through the list of FUDescData structures
diff -r c6189a9b8cd7 -r 46b6043bd32c src/cpu/o3/fu_pool.hh
--- a/src/cpu/o3/fu_pool.hh     Tue May 05 03:22:17 2015 -0400
+++ b/src/cpu/o3/fu_pool.hh     Tue May 05 03:22:19 2015 -0400
@@ -43,6 +43,7 @@
 #ifndef __CPU_O3_FU_POOL_HH__
 #define __CPU_O3_FU_POOL_HH__
 
+#include <array>
 #include <bitset>
 #include <list>
 #include <string>
@@ -71,9 +72,9 @@
 {
   private:
     /** Maximum op execution latencies, per op class. */
-    Cycles maxOpLatencies[Num_OpClasses];
+    std::array<Cycles, Num_OpClasses> maxOpLatencies;
     /** Whether op is pipelined or not. */
-    bool pipelined[Num_OpClasses];
+    std::array<bool, Num_OpClasses> pipelined;
 
     /** Bitvector listing capabilities of this FU pool. */
     std::bitset<Num_OpClasses> capabilityList;
diff -r c6189a9b8cd7 -r 46b6043bd32c src/cpu/op_class.hh
--- a/src/cpu/op_class.hh       Tue May 05 03:22:17 2015 -0400
+++ b/src/cpu/op_class.hh       Tue May 05 03:22:19 2015 -0400
@@ -51,41 +51,40 @@
  */
 using Enums::OpClass;
 using Enums::No_OpClass;
-using Enums::Num_OpClass;
 
-const OpClass IntAluOp = Enums::IntAlu;
-const OpClass IntMultOp = Enums::IntMult;
-const OpClass IntDivOp = Enums::IntDiv;
-const OpClass FloatAddOp = Enums::FloatAdd;
-const OpClass FloatCmpOp = Enums::FloatCmp;
-const OpClass FloatCvtOp = Enums::FloatCvt;
-const OpClass FloatMultOp = Enums::FloatMult;
-const OpClass FloatDivOp = Enums::FloatDiv;
-const OpClass FloatSqrtOp = Enums::FloatSqrt;
-const OpClass SimdAddOp = Enums::SimdAdd;
-const OpClass SimdAddAccOp = Enums::SimdAddAcc;
-const OpClass SimdAluOp = Enums::SimdAlu;
-const OpClass SimdCmpOp = Enums::SimdCmp;
-const OpClass SimdCvtOp = Enums::SimdCvt;
-const OpClass SimdMiscOp = Enums::SimdMisc;
-const OpClass SimdMultOp = Enums::SimdMult;
-const OpClass SimdMultAccOp = Enums::SimdMultAcc;
-const OpClass SimdShiftOp = Enums::SimdShift;
-const OpClass SimdShiftAccOp = Enums::SimdShiftAcc;
-const OpClass SimdSqrtOp = Enums::SimdSqrt;
-const OpClass SimdFloatAddOp = Enums::SimdFloatAdd;
-const OpClass SimdFloatAluOp = Enums::SimdFloatAlu;
-const OpClass SimdFloatCmpOp = Enums::SimdFloatCmp;
-const OpClass SimdFloatCvtOp = Enums::SimdFloatCvt;
-const OpClass SimdFloatDivOp = Enums::SimdFloatDiv;
-const OpClass SimdFloatMiscOp = Enums::SimdFloatMisc;
-const OpClass SimdFloatMultOp = Enums::SimdFloatMult;
-const OpClass SimdFloatMultAccOp = Enums::SimdFloatMultAcc;
-const OpClass SimdFloatSqrtOp = Enums::SimdFloatSqrt;
-const OpClass MemReadOp = Enums::MemRead;
-const OpClass MemWriteOp = Enums::MemWrite;
-const OpClass IprAccessOp = Enums::IprAccess;
-const OpClass InstPrefetchOp = Enums::InstPrefetch;
-const OpClass Num_OpClasses = Num_OpClass;
+static const OpClass IntAluOp = Enums::IntAlu;
+static const OpClass IntMultOp = Enums::IntMult;
+static const OpClass IntDivOp = Enums::IntDiv;
+static const OpClass FloatAddOp = Enums::FloatAdd;
+static const OpClass FloatCmpOp = Enums::FloatCmp;
+static const OpClass FloatCvtOp = Enums::FloatCvt;
+static const OpClass FloatMultOp = Enums::FloatMult;
+static const OpClass FloatDivOp = Enums::FloatDiv;
+static const OpClass FloatSqrtOp = Enums::FloatSqrt;
+static const OpClass SimdAddOp = Enums::SimdAdd;
+static const OpClass SimdAddAccOp = Enums::SimdAddAcc;
+static const OpClass SimdAluOp = Enums::SimdAlu;
+static const OpClass SimdCmpOp = Enums::SimdCmp;
+static const OpClass SimdCvtOp = Enums::SimdCvt;
+static const OpClass SimdMiscOp = Enums::SimdMisc;
+static const OpClass SimdMultOp = Enums::SimdMult;
+static const OpClass SimdMultAccOp = Enums::SimdMultAcc;
+static const OpClass SimdShiftOp = Enums::SimdShift;
+static const OpClass SimdShiftAccOp = Enums::SimdShiftAcc;
+static const OpClass SimdSqrtOp = Enums::SimdSqrt;
+static const OpClass SimdFloatAddOp = Enums::SimdFloatAdd;
+static const OpClass SimdFloatAluOp = Enums::SimdFloatAlu;
+static const OpClass SimdFloatCmpOp = Enums::SimdFloatCmp;
+static const OpClass SimdFloatCvtOp = Enums::SimdFloatCvt;
+static const OpClass SimdFloatDivOp = Enums::SimdFloatDiv;
+static const OpClass SimdFloatMiscOp = Enums::SimdFloatMisc;
+static const OpClass SimdFloatMultOp = Enums::SimdFloatMult;
+static const OpClass SimdFloatMultAccOp = Enums::SimdFloatMultAcc;
+static const OpClass SimdFloatSqrtOp = Enums::SimdFloatSqrt;
+static const OpClass MemReadOp = Enums::MemRead;
+static const OpClass MemWriteOp = Enums::MemWrite;
+static const OpClass IprAccessOp = Enums::IprAccess;
+static const OpClass InstPrefetchOp = Enums::InstPrefetch;
+static const OpClass Num_OpClasses = Enums::Num_OpClass;
 
 #endif // __CPU__OP_CLASS_HH__
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to