| OLD | NEW |
| 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// | 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 | 9 |
| 10 #include "llvm/ADT/STLExtras.h" | 10 #include "llvm/ADT/STLExtras.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 // Note: 100 is a bad value index in next line. | 44 // Note: 100 is a bad value index in next line. |
| 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
| 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 47 0, naclbitc::BLK_CODE_EXIT, Terminator, | 47 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 48 0, naclbitc::BLK_CODE_EXIT, Terminator | 48 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 49 }; | 49 }; |
| 50 | 50 |
| 51 // Show bitcode objdump for BitcodeRecords. | 51 // Show bitcode objdump for BitcodeRecords. |
| 52 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 52 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| 53 array_lengthof(BitcodeRecords), Terminator); | 53 array_lengthof(BitcodeRecords), Terminator); |
| 54 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); | 54 EXPECT_FALSE(DumpMunger.runTest("Nonexistent call arg")); |
| 55 EXPECT_EQ( | 55 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " |
| 56 "module { // BlockID = 8\n" | 56 "%p0, i32 @f0);\n" |
| 57 " types { // BlockID = 17\n" | 57 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", |
| 58 " count 3;\n" | 58 DumpMunger.getLinesWithSubstring("66:4")); |
| 59 " @t0 = i32;\n" | |
| 60 " @t1 = void;\n" | |
| 61 " @t2 = void (i32, i32);\n" | |
| 62 " }\n" | |
| 63 " declare external void @f0(i32, i32);\n" | |
| 64 " define external void @f1(i32, i32);\n" | |
| 65 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" | |
| 66 " blocks 1;\n" | |
| 67 " %b0:\n" | |
| 68 " call void @f0(i32 %p0, i32 @f0);\n" | |
| 69 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" | |
| 70 " ret void;\n" | |
| 71 " }\n" | |
| 72 "}\n", | |
| 73 DumpMunger.getTestResults()); | |
| 74 | 59 |
| 75 // Show that we get appropriate error when parsing in Subzero. | 60 // Show that we get appropriate error when parsing in Subzero. |
| 76 IceTest::SubzeroBitcodeMunger Munger( | 61 IceTest::SubzeroBitcodeMunger Munger( |
| 77 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 62 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 78 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | 63 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
| 79 EXPECT_EQ( | 64 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", |
| 80 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", | |
| 81 Munger.getTestResults()); | 65 Munger.getTestResults()); |
| 82 } | 66 } |
| 83 | 67 |
| 84 /// Test how we recognize alignments in alloca instructions. | 68 /// Test how we recognize alignments in alloca instructions. |
| 85 TEST(IceParseInstsTests, AllocaAlignment) { | 69 TEST(IceParseInstsTests, AllocaAlignment) { |
| 86 const uint64_t BitcodeRecords[] = { | 70 const uint64_t BitcodeRecords[] = { |
| 87 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 71 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 88 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 72 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 89 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 73 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| 90 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 74 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 91 3, naclbitc::TYPE_CODE_VOID, Terminator, | 75 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 92 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 76 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
| 93 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 77 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
| 94 0, naclbitc::BLK_CODE_EXIT, Terminator, | 78 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 95 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 79 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 96 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 80 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 97 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 81 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 98 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 82 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
| 99 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 83 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 100 0, naclbitc::BLK_CODE_EXIT, Terminator, | 84 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 101 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 85 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 102 | 86 |
| 103 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 87 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
| 104 | 88 |
| 105 // Show text when alignment is 1. | 89 // Show text when alignment is 1. |
| 106 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 90 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 107 Terminator); | 91 Terminator); |
| 108 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); | 92 EXPECT_TRUE(DumpMunger.runTest("Good alloca alignment 1")); |
| 109 EXPECT_EQ("module { // BlockID = 8\n" | 93 EXPECT_EQ(" 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 " |
| 110 " types { // BlockID = 17\n" | 94 "%p0, align 1;\n", |
| 111 " count 4;\n" | 95 DumpMunger.getLinesWithSubstring("62:4")); |
| 112 " @t0 = i32;\n" | |
| 113 " @t1 = void;\n" | |
| 114 " @t2 = void (i32);\n" | |
| 115 " @t3 = i8;\n" | |
| 116 " }\n" | |
| 117 " define external void @f0(i32);\n" | |
| 118 " function void @f0(i32 %p0) { // BlockID = 12\n" | |
| 119 " blocks 1;\n" | |
| 120 " %b0:\n" | |
| 121 " %v0 = alloca i8, i32 %p0, align 1;\n" | |
| 122 " ret void;\n" | |
| 123 " }\n" | |
| 124 "}\n", | |
| 125 DumpMunger.getTestResults()); | |
| 126 | 96 |
| 127 // Show that we can handle alignment of 1. | 97 // Show that we can handle alignment of 1. |
| 128 IceTest::SubzeroBitcodeMunger Munger( | 98 IceTest::SubzeroBitcodeMunger Munger( |
| 129 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 99 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 130 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | 100 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); |
| 131 | 101 |
| 132 // Show what happens when changing alignment to 0. | 102 // Show what happens when changing alignment to 0. |
| 133 const uint64_t Align0[] = { | 103 const uint64_t Align0[] = { |
| 134 ReplaceIndex, NaClBitcodeMunger::Replace, | 104 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 135 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 105 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
| 136 }; | 106 }; |
| 137 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | 107 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, |
| 138 array_lengthof(Align0))); | 108 array_lengthof(Align0))); |
| 139 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | 109 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, |
| 140 array_lengthof(Align0))); | 110 array_lengthof(Align0))); |
| 141 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 111 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 142 DumpMunger.getLinesWithSubstring("alloca")); | 112 DumpMunger.getLinesWithSubstring("alloca")); |
| 143 | 113 |
| 144 // Show what happens when changing alignment to 2**30. | 114 // Show what happens when changing alignment to 2**30. |
| 145 const uint64_t Align30[] = { | 115 const uint64_t Align30[] = { |
| 146 ReplaceIndex, NaClBitcodeMunger::Replace, | 116 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 147 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 117 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 148 }; | 118 }; |
| 149 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | 119 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, |
| 150 array_lengthof(Align30))); | 120 array_lengthof(Align30))); |
| 151 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", | 121 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", |
| 152 Munger.getTestResults()); | 122 Munger.getTestResults()); |
| 153 | 123 |
| 154 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | 124 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, |
| 155 array_lengthof(Align30))); | 125 array_lengthof(Align30))); |
| 156 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 126 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 157 DumpMunger.getLinesWithSubstring("alloca")); | 127 DumpMunger.getLinesWithSubstring("alloca")); |
| 158 EXPECT_EQ( | 128 EXPECT_EQ( |
| 159 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 129 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 160 DumpMunger.getLinesWithSubstring("Error")); | 130 DumpMunger.getLinesWithSubstring("Error")); |
| 161 | 131 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 187 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 157 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
| 188 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 158 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 189 0, naclbitc::BLK_CODE_EXIT, Terminator, | 159 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 190 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 160 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 191 | 161 |
| 192 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 162 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
| 193 | 163 |
| 194 // Show text when alignment is 1. | 164 // Show text when alignment is 1. |
| 195 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 165 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 196 Terminator); | 166 Terminator); |
| 197 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); | 167 EXPECT_TRUE(DumpMunger.runTest("Good load i32 alignment 1")); |
| 198 EXPECT_EQ("module { // BlockID = 8\n" | 168 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
| 199 " types { // BlockID = 17\n" | 169 "align 1;\n", |
| 200 " count 2;\n" | 170 DumpMunger.getLinesWithSubstring("58:4")); |
| 201 " @t0 = i32;\n" | |
| 202 " @t1 = i32 (i32);\n" | |
| 203 " }\n" | |
| 204 " define external i32 @f0(i32);\n" | |
| 205 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | |
| 206 " blocks 1;\n" | |
| 207 " %b0:\n" | |
| 208 " %v0 = load i32* %p0, align 1;\n" | |
| 209 " ret i32 %v0;\n" | |
| 210 " }\n" | |
| 211 "}\n", | |
| 212 DumpMunger.getTestResults()); | |
| 213 IceTest::SubzeroBitcodeMunger Munger( | 171 IceTest::SubzeroBitcodeMunger Munger( |
| 214 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 172 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 215 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | 173 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); |
| 216 | 174 |
| 217 // Show what happens when changing alignment to 0. | 175 // Show what happens when changing alignment to 0. |
| 218 const uint64_t Align0[] = { | 176 const uint64_t Align0[] = { |
| 219 ReplaceIndex, NaClBitcodeMunger::Replace, | 177 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 220 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 178 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 221 }; | 179 }; |
| 222 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | 180 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, |
| 223 array_lengthof(Align0))); | 181 array_lengthof(Align0))); |
| 224 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | 182 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 225 Munger.getTestResults()); | 183 Munger.getTestResults()); |
| 226 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | 184 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, |
| 227 array_lengthof(Align0))); | 185 array_lengthof(Align0))); |
| 228 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 186 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 229 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 187 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 230 DumpMunger.getLinesWithSubstring("load")); | 188 DumpMunger.getLinesWithSubstring("load")); |
| 231 | 189 |
| 232 // Show what happens when changing alignment to 4. | 190 // Show what happens when changing alignment to 4. |
| 233 const uint64_t Align4[] = { | 191 const uint64_t Align4[] = { |
| 234 ReplaceIndex, NaClBitcodeMunger::Replace, | 192 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 235 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 193 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 236 }; | 194 }; |
| 237 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | 195 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, |
| 238 array_lengthof(Align4))); | 196 array_lengthof(Align4))); |
| 239 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", | 197 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", |
| 240 Munger.getTestResults()); | 198 Munger.getTestResults()); |
| 241 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | 199 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, |
| 242 array_lengthof(Align4))); | 200 array_lengthof(Align4))); |
| 243 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 201 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 244 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 202 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 245 DumpMunger.getLinesWithSubstring("load")); | 203 DumpMunger.getLinesWithSubstring("load")); |
| 246 | 204 |
| 247 // Show what happens when changing alignment to 2**29. | 205 // Show what happens when changing alignment to 2**29. |
| 248 const uint64_t Align29[] = { | 206 const uint64_t Align29[] = { |
| 249 ReplaceIndex, NaClBitcodeMunger::Replace, | 207 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 208 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 251 }; | 209 }; |
| 252 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | 210 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, |
| 253 array_lengthof(Align29))); | 211 array_lengthof(Align29))); |
| 254 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | 212 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 255 Munger.getTestResults()); | 213 Munger.getTestResults()); |
| 256 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | 214 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", |
| 257 Align29, array_lengthof(Align29))); | 215 Align29, array_lengthof(Align29))); |
| 258 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 216 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 259 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 217 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 260 DumpMunger.getLinesWithSubstring("load")); | 218 DumpMunger.getLinesWithSubstring("load")); |
| 261 | 219 |
| 262 // Show what happens when changing alignment to 2**30. | 220 // Show what happens when changing alignment to 2**30. |
| 263 const uint64_t Align30[] = { | 221 const uint64_t Align30[] = { |
| 264 ReplaceIndex, NaClBitcodeMunger::Replace, | 222 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 265 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 223 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 266 }; | 224 }; |
| 267 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | 225 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, |
| 268 array_lengthof(Align30))); | 226 array_lengthof(Align30))); |
| 269 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | 227 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 270 Munger.getTestResults()); | 228 Munger.getTestResults()); |
| 271 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | 229 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", |
| 272 Align30, array_lengthof(Align30))); | 230 Align30, array_lengthof(Align30))); |
| 273 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 231 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 274 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 232 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 275 DumpMunger.getLinesWithSubstring("load")); | 233 DumpMunger.getLinesWithSubstring("load")); |
| 276 } | 234 } |
| 277 | 235 |
| 278 // Test how we recognize alignments in load float instructions. | 236 // Test how we recognize alignments in load float instructions. |
| 279 TEST(IceParseInstsTests, LoadFloatAlignment) { | 237 TEST(IceParseInstsTests, LoadFloatAlignment) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 291 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 249 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
| 292 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 250 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 293 0, naclbitc::BLK_CODE_EXIT, Terminator, | 251 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 294 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 252 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 295 | 253 |
| 296 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | 254 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD |
| 297 | 255 |
| 298 // Show text when alignment is 1. | 256 // Show text when alignment is 1. |
| 299 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 257 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 300 Terminator); | 258 Terminator); |
| 301 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); | 259 EXPECT_TRUE(DumpMunger.runTest("Good load float alignment 1")); |
| 302 EXPECT_EQ("module { // BlockID = 8\n" | 260 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " |
| 303 " types { // BlockID = 17\n" | 261 "%p0, align 1;\n", |
| 304 " count 3;\n" | 262 DumpMunger.getLinesWithSubstring("58:4")); |
| 305 " @t0 = float;\n" | |
| 306 " @t1 = i32;\n" | |
| 307 " @t2 = float (i32);\n" | |
| 308 " }\n" | |
| 309 " define external float @f0(i32);\n" | |
| 310 " function float @f0(i32 %p0) { // BlockID = 12\n" | |
| 311 " blocks 1;\n" | |
| 312 " %b0:\n" | |
| 313 " %v0 = load float* %p0, align 1;\n" | |
| 314 " ret float %v0;\n" | |
| 315 " }\n" | |
| 316 "}\n", | |
| 317 DumpMunger.getTestResults()); | |
| 318 IceTest::SubzeroBitcodeMunger Munger( | 263 IceTest::SubzeroBitcodeMunger Munger( |
| 319 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 264 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 320 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | 265 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); |
| 321 | 266 |
| 322 // Show what happens when changing alignment to 0. | 267 // Show what happens when changing alignment to 0. |
| 323 const uint64_t Align0[] = { | 268 const uint64_t Align0[] = { |
| 324 ReplaceIndex, NaClBitcodeMunger::Replace, | 269 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 325 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 270 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 326 }; | 271 }; |
| 327 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | 272 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, |
| 328 array_lengthof(Align0))); | 273 array_lengthof(Align0))); |
| 329 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | 274 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 330 Munger.getTestResults()); | 275 Munger.getTestResults()); |
| 331 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | 276 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", |
| 332 Align0, array_lengthof(Align0))); | 277 Align0, array_lengthof(Align0))); |
| 333 EXPECT_EQ( | 278 EXPECT_EQ( |
| 334 " %v0 = load float* %p0, align 0;\n" | 279 " %v0 = load float* %p0, align 0;\n" |
| 335 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 280 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 336 DumpMunger.getLinesWithSubstring("load")); | 281 DumpMunger.getLinesWithSubstring("load")); |
| 337 | 282 |
| 338 // Show what happens when changing alignment to 4. | 283 // Show what happens when changing alignment to 4. |
| 339 const uint64_t Align4[] = { | 284 const uint64_t Align4[] = { |
| 340 ReplaceIndex, NaClBitcodeMunger::Replace, | 285 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 341 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 286 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 342 }; | 287 }; |
| 343 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | 288 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, |
| 344 array_lengthof(Align4))); | 289 array_lengthof(Align4))); |
| 345 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | 290 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", |
| 346 Align4, array_lengthof(Align4))); | 291 Align4, array_lengthof(Align4))); |
| 347 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 292 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 348 DumpMunger.getLinesWithSubstring("load")); | 293 DumpMunger.getLinesWithSubstring("load")); |
| 349 | 294 |
| 350 const uint64_t Align29[] = { | 295 const uint64_t Align29[] = { |
| 351 ReplaceIndex, NaClBitcodeMunger::Replace, | 296 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 352 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 297 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 353 }; | 298 }; |
| 354 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | 299 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, |
| 355 array_lengthof(Align29))); | 300 array_lengthof(Align29))); |
| 356 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | 301 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 357 Munger.getTestResults()); | 302 Munger.getTestResults()); |
| 358 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | 303 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", |
| 359 Align29, array_lengthof(Align29))); | 304 Align29, array_lengthof(Align29))); |
| 360 EXPECT_EQ( | 305 EXPECT_EQ( |
| 361 " %v0 = load float* %p0, align 536870912;\n" | 306 " %v0 = load float* %p0, align 536870912;\n" |
| 362 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 307 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 363 DumpMunger.getLinesWithSubstring("load")); | 308 DumpMunger.getLinesWithSubstring("load")); |
| 364 | 309 |
| 365 // Show what happens when changing alignment to 2**30. | 310 // Show what happens when changing alignment to 2**30. |
| 366 const uint64_t Align30[] = { | 311 const uint64_t Align30[] = { |
| 367 ReplaceIndex, NaClBitcodeMunger::Replace, | 312 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 368 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 313 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 369 }; | 314 }; |
| 370 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | 315 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, |
| 371 array_lengthof(Align30))); | 316 array_lengthof(Align30))); |
| 372 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | 317 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 373 Munger.getTestResults()); | 318 Munger.getTestResults()); |
| 374 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | 319 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", |
| 375 Align30, array_lengthof(Align30))); | 320 Align30, array_lengthof(Align30))); |
| 376 EXPECT_EQ( | 321 EXPECT_EQ( |
| 377 " %v0 = load float* %p0, align 0;\n" | 322 " %v0 = load float* %p0, align 0;\n" |
| 378 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 323 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 379 DumpMunger.getLinesWithSubstring("load")); | 324 DumpMunger.getLinesWithSubstring("load")); |
| 380 } | 325 } |
| 381 | 326 |
| 382 // Test how we recognize alignments in store instructions. | 327 // Test how we recognize alignments in store instructions. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 395 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, | 340 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, |
| 396 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 341 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 397 0, naclbitc::BLK_CODE_EXIT, Terminator, | 342 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 398 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 343 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 399 | 344 |
| 400 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE | 345 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
| 401 | 346 |
| 402 // Show text when alignment is 1. | 347 // Show text when alignment is 1. |
| 403 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 348 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 404 Terminator); | 349 Terminator); |
| 405 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); | 350 EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); |
| 406 EXPECT_EQ("module { // BlockID = 8\n" | 351 EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " |
| 407 " types { // BlockID = 17\n" | 352 "float* %p0, \n", |
| 408 " count 3;\n" | 353 DumpMunger.getLinesWithSubstring("62:4")); |
| 409 " @t0 = float;\n" | |
| 410 " @t1 = i32;\n" | |
| 411 " @t2 = float (i32, float);\n" | |
| 412 " }\n" | |
| 413 " define external float @f0(i32, float);\n" | |
| 414 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | |
| 415 " blocks 1;\n" | |
| 416 " %b0:\n" | |
| 417 " store float %p1, float* %p0, align 1;\n" | |
| 418 " ret float %p1;\n" | |
| 419 " }\n" | |
| 420 "}\n", | |
| 421 DumpMunger.getTestResults()); | |
| 422 IceTest::SubzeroBitcodeMunger Munger( | 354 IceTest::SubzeroBitcodeMunger Munger( |
| 423 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 355 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 424 EXPECT_TRUE(Munger.runTest("Good store alignment")); | 356 EXPECT_TRUE(Munger.runTest("Good store alignment")); |
| 425 | 357 |
| 426 // Show what happens when changing alignment to 0. | 358 // Show what happens when changing alignment to 0. |
| 427 const uint64_t Align0[] = { | 359 const uint64_t Align0[] = { |
| 428 ReplaceIndex, NaClBitcodeMunger::Replace, | 360 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 429 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 361 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 430 }; | 362 }; |
| 431 EXPECT_FALSE( | 363 EXPECT_FALSE( |
| 432 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | 364 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); |
| 433 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", | 365 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", |
| 434 Munger.getTestResults()); | 366 Munger.getTestResults()); |
| 435 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | 367 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, |
| 436 array_lengthof(Align0))); | 368 array_lengthof(Align0))); |
| 437 EXPECT_EQ( | 369 EXPECT_EQ( |
| 438 " store float %p1, float* %p0, align 0;\n" | 370 " store float %p1, float* %p0, align 0;\n" |
| 439 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 371 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 440 DumpMunger.getLinesWithSubstring("store")); | 372 DumpMunger.getLinesWithSubstring("store")); |
| 441 | 373 |
| 442 // Show what happens when changing alignment to 4. | 374 // Show what happens when changing alignment to 4. |
| 443 const uint64_t Align4[] = { | 375 const uint64_t Align4[] = { |
| 444 ReplaceIndex, NaClBitcodeMunger::Replace, | 376 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 445 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 377 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 446 }; | 378 }; |
| 447 EXPECT_TRUE( | 379 EXPECT_TRUE( |
| 448 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | 380 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); |
| 449 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, | 381 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, |
| 450 array_lengthof(Align4))); | 382 array_lengthof(Align4))); |
| 451 | 383 |
| 452 // Show what happens when changing alignment to 8. | 384 // Show what happens when changing alignment to 8. |
| 453 const uint64_t Align8[] = { | 385 const uint64_t Align8[] = { |
| 454 ReplaceIndex, NaClBitcodeMunger::Replace, | 386 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 455 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 387 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 456 }; | 388 }; |
| 457 EXPECT_FALSE( | 389 EXPECT_FALSE( |
| 458 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | 390 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); |
| 459 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", | 391 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", |
| 460 Munger.getTestResults()); | 392 Munger.getTestResults()); |
| 461 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | 393 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, |
| 462 array_lengthof(Align8))); | 394 array_lengthof(Align8))); |
| 463 EXPECT_EQ( | 395 EXPECT_EQ( |
| 464 " store float %p1, float* %p0, align 8;\n" | 396 " store float %p1, float* %p0, align 8;\n" |
| 465 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 397 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 466 DumpMunger.getLinesWithSubstring("store")); | 398 DumpMunger.getLinesWithSubstring("store")); |
| 467 | 399 |
| 468 // Show what happens when changing alignment to 2**29. | 400 // Show what happens when changing alignment to 2**29. |
| 469 const uint64_t Align29[] = { | 401 const uint64_t Align29[] = { |
| 470 ReplaceIndex, NaClBitcodeMunger::Replace, | 402 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 471 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 403 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 472 }; | 404 }; |
| 473 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | 405 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, |
| 474 array_lengthof(Align29))); | 406 array_lengthof(Align29))); |
| 475 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", | 407 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", |
| 476 Munger.getTestResults()); | 408 Munger.getTestResults()); |
| 477 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | 409 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, |
| 478 array_lengthof(Align29))); | 410 array_lengthof(Align29))); |
| 479 EXPECT_EQ( | 411 EXPECT_EQ( |
| 480 " store float %p1, float* %p0, align 536870912;\n" | 412 " store float %p1, float* %p0, align 536870912;\n" |
| 481 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 413 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 482 DumpMunger.getLinesWithSubstring("store")); | 414 DumpMunger.getLinesWithSubstring("store")); |
| 483 | 415 |
| 484 const uint64_t Align30[] = { | 416 const uint64_t Align30[] = { |
| 485 ReplaceIndex, NaClBitcodeMunger::Replace, | 417 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 486 // Note: alignment stored as 0 or log2(Alignment)+1. | 418 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 487 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 419 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 488 }; | 420 }; |
| 489 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | 421 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, |
| 490 array_lengthof(Align30))); | 422 array_lengthof(Align30))); |
| 491 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", | 423 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", |
| 492 Munger.getTestResults()); | 424 Munger.getTestResults()); |
| 493 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | 425 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, |
| 494 array_lengthof(Align30))); | 426 array_lengthof(Align30))); |
| 495 EXPECT_EQ( | 427 EXPECT_EQ( |
| 496 " store float %p1, float* %p0, align 0;\n" | 428 " store float %p1, float* %p0, align 0;\n" |
| 497 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 429 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 498 DumpMunger.getLinesWithSubstring("store")); | 430 DumpMunger.getLinesWithSubstring("store")); |
| 499 } | 431 } |
| 500 | 432 |
| 501 } // end of anonymous namespace | 433 } // end of anonymous namespace |
| OLD | NEW |