Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 1 | // Copyright 2020 The Tint Authors. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
Ben Clayton | d368f2c | 2023-08-01 00:37:35 +0000 | [diff] [blame] | 15 | #include "src/tint/lang/spirv/writer/ast_printer/helper_test.h" |
Ben Clayton | b0ea368 | 2023-08-15 15:35:01 +0000 | [diff] [blame] | 16 | #include "src/tint/lang/spirv/writer/common/spv_dump_test.h" |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 17 | |
dan sinclair | ce6dffe | 2023-08-14 21:01:40 +0000 | [diff] [blame] | 18 | using namespace tint::core::number_suffixes; // NOLINT |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 19 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 20 | namespace tint::spirv::writer { |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 21 | namespace { |
| 22 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 23 | using SpirvASTPrinterTest = TestHelper; |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 24 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 25 | TEST_F(SpirvASTPrinterTest, Loop_Empty) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 26 | // loop { |
| 27 | // break; |
| 28 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 29 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 30 | auto* loop = Loop(Block(Break()), Block()); |
| 31 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 32 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 33 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 34 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 35 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 36 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 37 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 38 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 39 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 40 | %1 = OpLabel |
| 41 | OpLoopMerge %2 %3 None |
| 42 | OpBranch %4 |
| 43 | %4 = OpLabel |
| 44 | OpBranch %2 |
| 45 | %3 = OpLabel |
| 46 | OpBranch %1 |
| 47 | %2 = OpLabel |
| 48 | )"); |
| 49 | } |
| 50 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 51 | TEST_F(SpirvASTPrinterTest, Loop_WithoutContinuing) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 52 | // loop { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 53 | // v = 2i; |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 54 | // break; |
| 55 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 56 | |
Ben Clayton | cd52f38 | 2023-08-07 13:11:08 +0000 | [diff] [blame] | 57 | auto* var = GlobalVar("v", ty.i32(), core::AddressSpace::kPrivate); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 58 | auto* body = Block(Assign("v", 2_i), // |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 59 | Break()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 60 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 61 | auto* loop = Loop(body, Block()); |
| 62 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 63 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 64 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 65 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 66 | b.PushFunctionForTesting(); |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 67 | ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.Diagnostics(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 68 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 69 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 70 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%3 = OpTypeInt 32 1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 71 | %2 = OpTypePointer Private %3 |
| 72 | %4 = OpConstantNull %3 |
| 73 | %1 = OpVariable %2 Private %4 |
| 74 | %9 = OpConstant %3 2 |
| 75 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 76 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 77 | R"(OpBranch %5 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 78 | %5 = OpLabel |
| 79 | OpLoopMerge %6 %7 None |
| 80 | OpBranch %8 |
| 81 | %8 = OpLabel |
| 82 | OpStore %1 %9 |
| 83 | OpBranch %6 |
| 84 | %7 = OpLabel |
| 85 | OpBranch %5 |
| 86 | %6 = OpLabel |
| 87 | )"); |
| 88 | } |
| 89 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 90 | TEST_F(SpirvASTPrinterTest, Loop_WithContinuing) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 91 | // loop { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 92 | // a = 2i; |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 93 | // break; |
| 94 | // continuing { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 95 | // a = 3i; |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 96 | // } |
| 97 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 98 | |
Ben Clayton | cd52f38 | 2023-08-07 13:11:08 +0000 | [diff] [blame] | 99 | auto* var = GlobalVar("v", ty.i32(), core::AddressSpace::kPrivate); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 100 | auto* body = Block(Assign("v", 2_i), // |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 101 | Break()); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 102 | auto* continuing = Block(Assign("v", 3_i)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 103 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 104 | auto* loop = Loop(body, continuing); |
| 105 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 106 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 107 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 108 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 109 | b.PushFunctionForTesting(); |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 110 | ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.Diagnostics(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 111 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 112 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 113 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%3 = OpTypeInt 32 1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 114 | %2 = OpTypePointer Private %3 |
| 115 | %4 = OpConstantNull %3 |
| 116 | %1 = OpVariable %2 Private %4 |
| 117 | %9 = OpConstant %3 2 |
| 118 | %10 = OpConstant %3 3 |
| 119 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 120 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 121 | R"(OpBranch %5 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 122 | %5 = OpLabel |
| 123 | OpLoopMerge %6 %7 None |
| 124 | OpBranch %8 |
| 125 | %8 = OpLabel |
| 126 | OpStore %1 %9 |
| 127 | OpBranch %6 |
| 128 | %7 = OpLabel |
| 129 | OpStore %1 %10 |
| 130 | OpBranch %5 |
| 131 | %6 = OpLabel |
| 132 | )"); |
| 133 | } |
| 134 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 135 | TEST_F(SpirvASTPrinterTest, Loop_WithBodyVariableAccessInContinuing) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 136 | // loop { |
| 137 | // var a : i32; |
| 138 | // break; |
| 139 | // continuing { |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 140 | // a = 3i; |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 141 | // } |
| 142 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 143 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 144 | auto* body = Block(Decl(Var("a", ty.i32())), // |
| 145 | Break()); |
Ben Clayton | 0ce9ab0 | 2022-05-05 20:23:40 +0000 | [diff] [blame] | 146 | auto* continuing = Block(Assign("a", 3_i)); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 147 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 148 | auto* loop = Loop(body, continuing); |
| 149 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 150 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 151 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 152 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 153 | b.PushFunctionForTesting(); |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 154 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 155 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 156 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%7 = OpTypeInt 32 1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 157 | %6 = OpTypePointer Function %7 |
| 158 | %8 = OpConstantNull %7 |
| 159 | %9 = OpConstant %7 3 |
| 160 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 161 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 162 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 163 | %1 = OpLabel |
| 164 | OpLoopMerge %2 %3 None |
| 165 | OpBranch %4 |
| 166 | %4 = OpLabel |
| 167 | OpBranch %2 |
| 168 | %3 = OpLabel |
| 169 | OpStore %5 %9 |
| 170 | OpBranch %1 |
| 171 | %2 = OpLabel |
| 172 | )"); |
| 173 | } |
| 174 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 175 | TEST_F(SpirvASTPrinterTest, Loop_WithContinue) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 176 | // loop { |
| 177 | // if (false) { break; } |
| 178 | // continue; |
| 179 | // } |
| 180 | auto* body = Block(If(false, Block(Break())), // |
| 181 | Continue()); |
| 182 | auto* loop = Loop(body, Block()); |
| 183 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 184 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 185 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 186 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 187 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 188 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 189 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 190 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 191 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 192 | %1 = OpLabel |
| 193 | OpLoopMerge %2 %3 None |
| 194 | OpBranch %4 |
| 195 | %4 = OpLabel |
| 196 | OpSelectionMerge %7 None |
| 197 | OpBranchConditional %6 %8 %7 |
| 198 | %8 = OpLabel |
| 199 | OpBranch %2 |
| 200 | %7 = OpLabel |
| 201 | OpBranch %3 |
| 202 | %3 = OpLabel |
| 203 | OpBranch %1 |
| 204 | %2 = OpLabel |
| 205 | )"); |
| 206 | } |
| 207 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 208 | TEST_F(SpirvASTPrinterTest, Loop_WithBreak) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 209 | // loop { |
| 210 | // break; |
| 211 | // } |
| 212 | auto* body = Block(create<ast::BreakStatement>()); |
| 213 | auto* loop = Loop(body, Block()); |
| 214 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 215 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 216 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 217 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 218 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 219 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 220 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 221 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 222 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 223 | %1 = OpLabel |
| 224 | OpLoopMerge %2 %3 None |
| 225 | OpBranch %4 |
| 226 | %4 = OpLabel |
| 227 | OpBranch %2 |
| 228 | %3 = OpLabel |
| 229 | OpBranch %1 |
| 230 | %2 = OpLabel |
| 231 | )"); |
| 232 | } |
| 233 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 234 | TEST_F(SpirvASTPrinterTest, Loop_WithContinuing_BreakIf) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 235 | // loop { |
| 236 | // continuing { |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 237 | // break if (true); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 238 | // } |
| 239 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 240 | |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 241 | auto* continuing = Block(BreakIf(true)); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 242 | auto* loop = Loop(Block(), continuing); |
| 243 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 244 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 245 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 246 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 247 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 248 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 249 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 250 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%5 = OpTypeBool |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 251 | %6 = OpConstantTrue %5 |
| 252 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 253 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 254 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 255 | %1 = OpLabel |
| 256 | OpLoopMerge %2 %3 None |
| 257 | OpBranch %4 |
| 258 | %4 = OpLabel |
| 259 | OpBranch %3 |
| 260 | %3 = OpLabel |
| 261 | OpBranchConditional %6 %2 %1 |
| 262 | %2 = OpLabel |
| 263 | )"); |
| 264 | } |
| 265 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 266 | TEST_F(SpirvASTPrinterTest, Loop_WithContinuing_BreakUnless) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 267 | // loop { |
| 268 | // continuing { |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 269 | // break if (false); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 270 | // } |
| 271 | // } |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 272 | auto* continuing = Block(BreakIf(false)); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 273 | auto* loop = Loop(Block(), continuing); |
| 274 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 275 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 276 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 277 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 278 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 279 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 280 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 281 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%5 = OpTypeBool |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 282 | %6 = OpConstantNull %5 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 283 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 284 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 285 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 286 | %1 = OpLabel |
| 287 | OpLoopMerge %2 %3 None |
| 288 | OpBranch %4 |
| 289 | %4 = OpLabel |
| 290 | OpBranch %3 |
| 291 | %3 = OpLabel |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 292 | OpBranchConditional %6 %2 %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 293 | %2 = OpLabel |
| 294 | )"); |
| 295 | } |
| 296 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 297 | TEST_F(SpirvASTPrinterTest, Loop_WithContinuing_BreakIf_ConditionIsVar) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 298 | // loop { |
| 299 | // continuing { |
| 300 | // var cond = true; |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 301 | // break if (cond); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 302 | // } |
| 303 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 304 | |
Ben Clayton | 58794ae | 2022-08-19 17:28:53 +0000 | [diff] [blame] | 305 | auto* cond_var = Decl(Var("cond", Expr(true))); |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 306 | auto* continuing = Block(cond_var, BreakIf("cond")); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 307 | auto* loop = Loop(Block(), continuing); |
| 308 | WrapInFunction(loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 309 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 310 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 311 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 312 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 313 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 314 | EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 315 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%5 = OpTypeBool |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 316 | %6 = OpConstantTrue %5 |
| 317 | %8 = OpTypePointer Function %5 |
| 318 | %9 = OpConstantNull %5 |
| 319 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 320 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 321 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 322 | %1 = OpLabel |
| 323 | OpLoopMerge %2 %3 None |
| 324 | OpBranch %4 |
| 325 | %4 = OpLabel |
| 326 | OpBranch %3 |
| 327 | %3 = OpLabel |
| 328 | OpStore %7 %6 |
| 329 | %10 = OpLoad %5 %7 |
| 330 | OpBranchConditional %10 %2 %1 |
| 331 | %2 = OpLabel |
| 332 | )"); |
| 333 | } |
| 334 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 335 | TEST_F(SpirvASTPrinterTest, Loop_WithContinuing_BreakIf_Nested) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 336 | // Make sure the right backedge and break target are used. |
| 337 | // loop { |
| 338 | // continuing { |
| 339 | // loop { |
| 340 | // continuing { |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 341 | // break if (true); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 342 | // } |
| 343 | // } |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 344 | // break if (true); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 345 | // } |
| 346 | // } |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 347 | |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 348 | auto* inner_continuing = Block(BreakIf(true)); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 349 | auto* inner_loop = Loop(Block(), inner_continuing); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 350 | |
dan sinclair | b8b0c21 | 2022-10-20 22:45:50 +0000 | [diff] [blame] | 351 | auto* outer_continuing = Block(inner_loop, BreakIf(true)); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 352 | auto* outer_loop = Loop(Block(), outer_continuing); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 353 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 354 | WrapInFunction(outer_loop); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 355 | |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 356 | Builder& b = Build(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 357 | |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 358 | b.PushFunctionForTesting(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 359 | |
James Price | 057b7f3 | 2023-05-03 23:25:01 +0000 | [diff] [blame] | 360 | EXPECT_TRUE(b.GenerateLoopStatement(outer_loop)) << b.Diagnostics(); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 361 | EXPECT_EQ(DumpInstructions(b.Module().Types()), R"(%9 = OpTypeBool |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 362 | %10 = OpConstantTrue %9 |
| 363 | )"); |
James Price | f885a90 | 2023-05-03 22:54:15 +0000 | [diff] [blame] | 364 | EXPECT_EQ(DumpInstructions(b.CurrentFunction().instructions()), |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 365 | R"(OpBranch %1 |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 366 | %1 = OpLabel |
| 367 | OpLoopMerge %2 %3 None |
| 368 | OpBranch %4 |
| 369 | %4 = OpLabel |
| 370 | OpBranch %3 |
| 371 | %3 = OpLabel |
| 372 | OpBranch %5 |
| 373 | %5 = OpLabel |
| 374 | OpLoopMerge %6 %7 None |
| 375 | OpBranch %8 |
| 376 | %8 = OpLabel |
| 377 | OpBranch %7 |
| 378 | %7 = OpLabel |
| 379 | OpBranchConditional %10 %6 %5 |
| 380 | %6 = OpLabel |
| 381 | OpBranchConditional %10 %2 %1 |
| 382 | %2 = OpLabel |
| 383 | )"); |
| 384 | } |
| 385 | |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 386 | } // namespace |
dan sinclair | 2dddb19 | 2023-07-26 20:31:48 +0000 | [diff] [blame] | 387 | } // namespace tint::spirv::writer |