Skip to content

Commit c18bc07

Browse files
committed
Miscellaneous code cleanups.
Including removal of old implicit args.
1 parent a6c1eff commit c18bc07

21 files changed

+45
-118
lines changed

Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ BIN_DIR = bin
141141
DISTRIB_DIR=distrib
142142
endif
143143

144-
SOURCE_FILES = CodeGen.cpp CodeGen_Internal.cpp CodeGen_X86.cpp CodeGen_GPU_Host.cpp CodeGen_PTX_Dev.cpp CodeGen_OpenCL_Dev.cpp CodeGen_SPIR_Dev.cpp CodeGen_GPU_Dev.cpp CodeGen_Posix.cpp CodeGen_ARM.cpp IR.cpp IRMutator.cpp IRPrinter.cpp IRVisitor.cpp CodeGen_C.cpp Substitute.cpp ModulusRemainder.cpp Bounds.cpp Derivative.cpp OneToOne.cpp Func.cpp Simplify.cpp IREquality.cpp Util.cpp Function.cpp IROperator.cpp Lower.cpp Debug.cpp Parameter.cpp Reduction.cpp RDom.cpp Profiling.cpp Tracing.cpp StorageFlattening.cpp VectorizeLoops.cpp UnrollLoops.cpp BoundsInference.cpp IRMatch.cpp StmtCompiler.cpp integer_division_table.cpp SlidingWindow.cpp StorageFolding.cpp InlineReductions.cpp RemoveTrivialForLoops.cpp Deinterleave.cpp DebugToFile.cpp Type.cpp JITCompiledModule.cpp EarlyFree.cpp UniquifyVariableNames.cpp CSE.cpp Tuple.cpp Lerp.cpp Target.cpp SkipStages.cpp SpecializeClampedRamps.cpp RemoveUndef.cpp FastIntegerDivide.cpp AllocationBoundsInference.cpp Inline.cpp Qualify.cpp UnifyDuplicateLets.cpp CodeGen_PNaCl.cpp
144+
SOURCE_FILES = CodeGen.cpp CodeGen_Internal.cpp CodeGen_X86.cpp CodeGen_GPU_Host.cpp CodeGen_PTX_Dev.cpp CodeGen_OpenCL_Dev.cpp CodeGen_SPIR_Dev.cpp CodeGen_GPU_Dev.cpp CodeGen_Posix.cpp CodeGen_ARM.cpp IR.cpp IRMutator.cpp IRPrinter.cpp IRVisitor.cpp CodeGen_C.cpp Substitute.cpp ModulusRemainder.cpp Bounds.cpp Derivative.cpp OneToOne.cpp Func.cpp Simplify.cpp IREquality.cpp Util.cpp Function.cpp IROperator.cpp Lower.cpp Debug.cpp Parameter.cpp Reduction.cpp RDom.cpp Profiling.cpp Tracing.cpp StorageFlattening.cpp VectorizeLoops.cpp UnrollLoops.cpp BoundsInference.cpp IRMatch.cpp StmtCompiler.cpp IntegerDivisionTable.cpp SlidingWindow.cpp StorageFolding.cpp InlineReductions.cpp RemoveTrivialForLoops.cpp Deinterleave.cpp DebugToFile.cpp Type.cpp JITCompiledModule.cpp EarlyFree.cpp UniquifyVariableNames.cpp CSE.cpp Tuple.cpp Lerp.cpp Target.cpp SkipStages.cpp SpecializeClampedRamps.cpp RemoveUndef.cpp FastIntegerDivide.cpp AllocationBoundsInference.cpp Inline.cpp Qualify.cpp UnifyDuplicateLets.cpp CodeGen_PNaCl.cpp
145145

146146
# The externally-visible header files that go into making Halide.h. Don't include anything here that includes llvm headers.
147-
HEADER_FILES = Util.h Type.h Argument.h Bounds.h BoundsInference.h Buffer.h buffer_t.h CodeGen_C.h CodeGen.h CodeGen_X86.h CodeGen_GPU_Host.h CodeGen_PTX_Dev.h CodeGen_OpenCL_Dev.h CodeGen_SPIR_Dev.h CodeGen_GPU_Dev.h Deinterleave.h Derivative.h OneToOne.h Extern.h Func.h Function.h Image.h InlineReductions.h integer_division_table.h IntrusivePtr.h IREquality.h IR.h IRMatch.h IRMutator.h IROperator.h IRPrinter.h IRVisitor.h JITCompiledModule.h Lambda.h Debug.h Lower.h MainPage.h ModulusRemainder.h Parameter.h Param.h RDom.h Reduction.h RemoveTrivialForLoops.h Schedule.h Scope.h Simplify.h SlidingWindow.h StmtCompiler.h StorageFlattening.h StorageFolding.h Substitute.h Profiling.h Tracing.h UnrollLoops.h Var.h VectorizeLoops.h CodeGen_Posix.h CodeGen_ARM.h DebugToFile.h EarlyFree.h UniquifyVariableNames.h CSE.h Tuple.h Lerp.h Target.h SkipStages.h SpecializeClampedRamps.h RemoveUndef.h FastIntegerDivide.h AllocationBoundsInference.h Inline.h Qualify.h UnifyDuplicateLets.h CodeGen_PNaCl.h
147+
HEADER_FILES = Util.h Type.h Argument.h Bounds.h BoundsInference.h Buffer.h buffer_t.h CodeGen_C.h CodeGen.h CodeGen_X86.h CodeGen_GPU_Host.h CodeGen_PTX_Dev.h CodeGen_OpenCL_Dev.h CodeGen_SPIR_Dev.h CodeGen_GPU_Dev.h Deinterleave.h Derivative.h OneToOne.h Extern.h Func.h Function.h Image.h InlineReductions.h IntegerDivisionTable.h IntrusivePtr.h IREquality.h IR.h IRMatch.h IRMutator.h IROperator.h IRPrinter.h IRVisitor.h JITCompiledModule.h Lambda.h Debug.h Lower.h MainPage.h ModulusRemainder.h Parameter.h Param.h RDom.h Reduction.h RemoveTrivialForLoops.h Schedule.h Scope.h Simplify.h SlidingWindow.h StmtCompiler.h StorageFlattening.h StorageFolding.h Substitute.h Profiling.h Tracing.h UnrollLoops.h Var.h VectorizeLoops.h CodeGen_Posix.h CodeGen_ARM.h DebugToFile.h EarlyFree.h UniquifyVariableNames.h CSE.h Tuple.h Lerp.h Target.h SkipStages.h SpecializeClampedRamps.h RemoveUndef.h FastIntegerDivide.h AllocationBoundsInference.h Inline.h Qualify.h UnifyDuplicateLets.h CodeGen_PNaCl.h
148148

149149
SOURCES = $(SOURCE_FILES:%.cpp=src/%.cpp)
150150
OBJECTS = $(SOURCE_FILES:%.cpp=$(BUILD_DIR)/%.o)
@@ -176,7 +176,7 @@ include/HalideRuntime.h: src/runtime/HalideRuntime.h
176176
mkdir -p include
177177
cp src/runtime/HalideRuntime.h include/
178178

179-
$(BIN_DIR)/build_halide_h: src/build_halide_h.cpp
179+
$(BIN_DIR)/build_halide_h: tools/build_halide_h.cpp
180180
g++ $< -o $@
181181

182182
msvc/initmod.cpp: $(INITIAL_MODULES)
@@ -207,7 +207,7 @@ $(BUILD_DIR)/initmod.%.cpp: $(BIN_DIR)/bitcode2cpp $(BUILD_DIR)/initmod.%.bc
207207
$(BUILD_DIR)/initmod_ptx.%_ll.cpp: $(BIN_DIR)/bitcode2cpp src/runtime/nvidia_libdevice_bitcode/libdevice.%.bc
208208
./$(BIN_DIR)/bitcode2cpp ptx_$(basename $*)_ll < src/runtime/nvidia_libdevice_bitcode/libdevice.$*.bc > $@
209209

210-
$(BIN_DIR)/bitcode2cpp: src/bitcode2cpp.cpp
210+
$(BIN_DIR)/bitcode2cpp: tools/bitcode2cpp.cpp
211211
@-mkdir -p $(BIN_DIR)
212212
$(CXX) $< -o $@
213213

src/AllocationBoundsInference.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef ALLOCATION_BOUNDS_INFERENCE_H
2-
#define ALLOCATION_BOUNDS_INFERENCE_H
1+
#ifndef HALIDE_ALLOCATION_BOUNDS_INFERENCE_H
2+
#define HALIDE_ALLOCATION_BOUNDS_INFERENCE_H
33

44
#include <map>
55
#include <string>

src/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
add_executable(build_halide_h build_halide_h.cpp)
2-
add_executable(bitcode2cpp bitcode2cpp.cpp)
1+
add_executable(build_halide_h ../tools/build_halide_h.cpp)
2+
add_executable(bitcode2cpp ../tools/bitcode2cpp.cpp)
33

44

55
if (MSVC)
@@ -180,7 +180,7 @@ set(HEADER_FILES
180180
Function.h
181181
Image.h
182182
InlineReductions.h
183-
integer_division_table.h
183+
IntegerDivisionTable.h
184184
IntrusivePtr.h
185185
IREquality.h
186186
IR.h
@@ -281,7 +281,7 @@ add_library(Halide ${HALIDE_LIBRARY_TYPE}
281281
BoundsInference.cpp
282282
IRMatch.cpp
283283
StmtCompiler.cpp
284-
integer_division_table.cpp
284+
IntegerDivisionTable.cpp
285285
SlidingWindow.cpp
286286
StorageFolding.cpp
287287
InlineReductions.cpp

src/CodeGen_ARM.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "Var.h"
1111
#include "Param.h"
1212
#include "Simplify.h"
13-
#include "integer_division_table.h"
13+
#include "IntegerDivisionTable.h"
1414
#include "LLVM_Headers.h"
1515

1616
// Native client llvm relies on global flags to control sandboxing on

src/CodeGen_GPU_Host.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "Debug.h"
1111
#include "Var.h"
1212
#include "Param.h"
13-
#include "integer_division_table.h"
13+
#include "IntegerDivisionTable.h"
1414
#include "CodeGen_Internal.h"
1515
#include "Util.h"
1616
#include "Bounds.h"

src/CodeGen_PTX_Dev.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "Var.h"
1010
#include "Param.h"
1111
#include "Target.h"
12-
#include "integer_division_table.h"
12+
#include "IntegerDivisionTable.h"
1313
#include "LLVM_Headers.h"
1414

1515
// This is declared in NVPTX.h, which is not exported. Ugly, but seems better than

src/CodeGen_Posix.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "Util.h"
1010
#include "Var.h"
1111
#include "Param.h"
12-
#include "integer_division_table.h"
12+
#include "IntegerDivisionTable.h"
1313

1414

1515

src/CodeGen_SPIR_Dev.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "Var.h"
1010
#include "Param.h"
1111
#include "Target.h"
12-
#include "integer_division_table.h"
12+
#include "IntegerDivisionTable.h"
1313
#include "LLVM_Headers.h"
1414

1515
namespace Halide {
@@ -65,14 +65,14 @@ void CodeGen_SPIR_Dev::add_kernel(Stmt stmt, std::string name, const std::vector
6565
// Make the initial basic block
6666
entry_block = BasicBlock::Create(*context, "entry", function);
6767
builder->SetInsertPoint(entry_block);
68-
68+
6969
vector<Value *> kernel_arg_address_space = init_kernel_metadata(*context, "kernel_arg_addr_space");
7070
vector<Value *> kernel_arg_access_qual = init_kernel_metadata(*context, "kernel_arg_access_qual");
7171
vector<Value *> kernel_arg_type = init_kernel_metadata(*context, "kernel_arg_type");
7272
vector<Value *> kernel_arg_base_type = init_kernel_metadata(*context, "kernel_arg_base_type");
7373
vector<Value *> kernel_arg_type_qual = init_kernel_metadata(*context, "kernel_arg_type_qual");
7474
vector<Value *> kernel_arg_name = init_kernel_metadata(*context, "kernel_arg_name");
75-
75+
7676
// Put the arguments in the symbol table
7777
{
7878
llvm::Function::arg_iterator arg = function->arg_begin();
@@ -84,7 +84,7 @@ void CodeGen_SPIR_Dev::add_kernel(Stmt stmt, std::string name, const std::vector
8484
// address 'foo.host', so we store the device pointer
8585
// as foo.host in this scope.
8686
sym_push(iter->name + ".host", arg);
87-
87+
8888
kernel_arg_address_space.push_back(ConstantInt::get(i32, 1));
8989
} else {
9090
sym_push(iter->name, arg);
@@ -133,11 +133,11 @@ void CodeGen_SPIR_Dev::add_kernel(Stmt stmt, std::string name, const std::vector
133133
// Add the nvvm annotation that it is a kernel function.
134134
Value *kernel_metadata[] =
135135
{
136-
function,
137-
MDNode::get(*context, kernel_arg_address_space),
138-
MDNode::get(*context, kernel_arg_access_qual),
139-
MDNode::get(*context, kernel_arg_type),
140-
MDNode::get(*context, kernel_arg_type_qual),
136+
function,
137+
MDNode::get(*context, kernel_arg_address_space),
138+
MDNode::get(*context, kernel_arg_access_qual),
139+
MDNode::get(*context, kernel_arg_type),
140+
MDNode::get(*context, kernel_arg_type_qual),
141141
MDNode::get(*context, kernel_arg_name)
142142
};
143143
MDNode *mdNode = MDNode::get(*context, kernel_metadata);
@@ -295,7 +295,7 @@ bool CodeGen_SPIR_Dev::use_soft_float_abi() const {
295295
}
296296

297297
vector<char> CodeGen_SPIR_Dev::compile_to_src() {
298-
298+
299299
optimize_module();
300300

301301
SmallVector<char, 1024> buffer;

src/CodeGen_X86.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "Util.h"
1010
#include "Var.h"
1111
#include "Param.h"
12-
#include "integer_division_table.h"
12+
#include "IntegerDivisionTable.h"
1313
#include "IRPrinter.h"
1414
#include "LLVM_Headers.h"
1515

src/Derivative.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class Monotonic : public IRVisitor {
247247
}
248248

249249
void visit(const Select *op) {
250+
// TODO: This is a bug! What if the condition depends on the var.
250251
op->true_value.accept(this);
251252
MonotonicResult ra = result;
252253
op->false_value.accept(this);

src/FastIntegerDivide.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "FastIntegerDivide.h"
2-
#include "integer_division_table.h"
2+
#include "IntegerDivisionTable.h"
33

44
namespace Halide {
55

src/Func.cpp

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -294,25 +294,6 @@ int Func::add_implicit_vars(vector<Var> &args) const {
294294
iter++;
295295
}
296296
}
297-
#if HALIDE_WARNINGS_FOR_OLD_IMPLICITS
298-
else {
299-
// The placeholder_pos is used in lhs context. This line fakes an _ at the end of
300-
// the provided arguments.
301-
placeholder_pos = args.size();
302-
if ((int)args.size() < dimensions()) {
303-
std::cerr << "Implicit arguments without placeholders are deprecated. Adding " <<
304-
dimensions() - args.size() << " arguments to Func " << name() << std::endl;
305-
306-
int i = 0;
307-
placeholder_pos = args.size();
308-
while ((int)args.size() < dimensions()) {
309-
Internal::debug(2) << "Adding implicit var " << i << " to call to " << name() << "\n";
310-
args.push_back(Var::implicit(i++));
311-
312-
}
313-
}
314-
}
315-
#endif
316297

317298
return placeholder_pos;
318299
}
@@ -336,25 +317,6 @@ int Func::add_implicit_vars(vector<Expr> &args) const {
336317
iter++;
337318
}
338319
}
339-
#if HALIDE_WARNINGS_FOR_OLD_IMPLICITS
340-
else {
341-
// The placeholder_pos is used in lhs context. This line fakes an _ at the end of
342-
// the provided arguments.
343-
placeholder_pos = args.size();
344-
if ((int)args.size() < dimensions()) {
345-
std::cerr << "Implicit arguments without placeholders are deprecated. Adding " <<
346-
dimensions() - args.size() << " arguments to Func " << name() << std::endl;
347-
348-
int i = 0;
349-
placeholder_pos = args.size();
350-
while ((int)args.size() < dimensions()) {
351-
Internal::debug(2) << "Adding implicit var " << i << " to call to " << name() << "\n";
352-
args.push_back(Var::implicit(i++));
353-
354-
}
355-
}
356-
}
357-
#endif
358320

359321
return placeholder_pos;
360322
}
File renamed without changes.

src/integer_division_table.h renamed to src/IntegerDivisionTable.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
#ifndef HALIDE_INTEGER_DIVISION_TABLE_H
2+
#define HALIDE_INTEGER_DIVISION_TABLE_H
3+
14
/** \file
2-
* Tables telling us how to do integer division
3-
* via fixed-point multiplication for various small
4-
* constants. This file is automatically generated
5-
* by find_inverse.c
5+
* Tables telling us how to do integer division via fixed-point
6+
* multiplication for various small constants.
67
*/
78
namespace Halide {
89
namespace Internal {
@@ -25,3 +26,5 @@ extern int64_t table_runtime_s32[256][4];
2526
}
2627
}
2728
}
29+
30+
#endif

src/Param.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,6 @@ class OutputImageParam {
139139
args.push_back(last_arg);
140140
}
141141

142-
#if HALIDE_WARNINGS_FOR_OLD_IMPLICITS
143-
if (!is_placeholder && !(*placeholder_seen) &&
144-
(int)args.size() == total_args &&
145-
(int)args.size() < dims) {
146-
std::cout << "Implicit arguments without placeholders ('_') are deprecated."
147-
<< " Adding " << dims - args.size()
148-
<< " arguments to ImageParam " << name() << '\n';
149-
int i = 0;
150-
while ((int)args.size() < dims) {
151-
args.push_back(Var::implicit(i++));
152-
153-
}
154-
}
155-
#endif
156142

157143
}
158144

src/Qualify.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef QUALIFY_H
2-
#define QUALIFY_H
1+
#ifndef HALIDE_QUALIFY_H
2+
#define HALIDE_QUALIFY_H
33

44
#include "IR.h"
55

src/UniquifyVariableNames.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef UNIQUIFY_VARIABLE_NAMES
2-
#define UNIQUIFY_VARIABLE_NAMES
1+
#ifndef HALIDE_UNIQUIFY_VARIABLE_NAMES
2+
#define HALIDE_UNIQUIFY_VARIABLE_NAMES
33

44
/** \file
55
* Defines the lowering pass that renames all variables to have unique names.

test/correctness/implicit_args.cpp

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,10 @@ int main(int argc, char **argv) {
1818
assert(im2.dimensions() == 2);
1919
assert(im2(4, 6) == 10);
2020
// im2 is a 2d image
21-
22-
#if HALIDE_WARNINGS_FOR_OLD_IMPLICITS
23-
// This syntax is deprecated, should produce a warning. DO NOT USE IN NEW CODE.
24-
Func f_old;
25-
f_old(x) = im1 + im2(x) + im2;
26-
// Equivalent to
27-
// f(x, i, j, k) = im1(i, j, k) + im2(x, i) + im2(i, j);
28-
// f(x, i, j, k) = i*j*k + x+i + i+j;
29-
30-
Image<int> result1_old = f_old.realize(2, 2, 2, 2);
31-
for (int k = 0; k < 2; k++) {
32-
for (int j = 0; j < 2; j++) {
33-
for (int i = 0; i < 2; i++) {
34-
for (int x = 0; x < 2; x++) {
35-
int correct = i*j*k + x+i + i+j;
36-
if (result1_old(x, i, j, k) != correct) {
37-
printf("result1_old(%d, %d, %d, %d) = %d instead of %d\n",
38-
x, i, j, k, result1_old(x, i, j, k), correct);
39-
return -1;
40-
}
41-
}
42-
}
43-
}
44-
}
45-
#endif
4621

4722
Func f;
4823
f(x, _) = im1 + im2(x, _) + im2;
49-
// Equivalent to
24+
// Equivalent to
5025
// f(x, i, j, k) = im1(i, j, k) + im2(x, i) + im2(i, j);
5126
// f(x, i, j, k) = i*j*k + x+i + i+j;
5227

@@ -70,9 +45,9 @@ int main(int argc, char **argv) {
7045
assert(f.dimensions() == 4);
7146

7247
Func g;
73-
g(_) = f(2, 2, _) + im2(Expr(1), _);
48+
g(_) = f(2, 2, _) + im2(Expr(1), _);
7449
f.compute_root();
75-
// Equivalent to
50+
// Equivalent to
7651
// g(i, j) = f(2, 2, i, j) + im2(1, i);
7752
// g(i, j) = 2*i*j + 2+2 + 2+i + 1+i
7853

@@ -83,7 +58,7 @@ int main(int argc, char **argv) {
8358
for (int i = 0; i < 10; i++) {
8459
int correct = 2*i*j + 2+2 + 2+i + 1+i;
8560
if (result2(i, j) != correct) {
86-
printf("result2(%d, %d) = %d instead of %d\n",
61+
printf("result2(%d, %d) = %d instead of %d\n",
8762
i, j, result2(i, j), correct);
8863
return -1;
8964
}
@@ -105,7 +80,7 @@ int main(int argc, char **argv) {
10580
for (int l = 0; l < 10; l++) {
10681
int correct = (i<<24)|(j<<16)|(l<<8)|k;
10782
if (transposed(i, j, k, l) != correct) {
108-
printf("transposed(%d, %d, %d, %d) = %d instead of %d\n",
83+
printf("transposed(%d, %d, %d, %d) = %d instead of %d\n",
10984
i, j, k, l, transposed(i, j, k, l), correct);
11085
return -1;
11186
}
@@ -129,7 +104,7 @@ int main(int argc, char **argv) {
129104
int correct2 = (l<<24)|(k<<16)|(i<<8)|j;
130105
int correct = correct1 + correct2;
131106
if (hairy_transposed(i, j, k, l) != correct) {
132-
printf("hairy_transposed(%d, %d, %d, %d) = %d instead of %d\n",
107+
printf("hairy_transposed(%d, %d, %d, %d) = %d instead of %d\n",
133108
i, j, k, l, hairy_transposed(i, j, k, l), correct);
134109
return -1;
135110
}
@@ -153,7 +128,7 @@ int main(int argc, char **argv) {
153128
int correct2 = (l<<24)|(l<<16)|(i<<8)|j;
154129
int correct = correct1 + correct2;
155130
if (hairy_transposed2(i, j, k, l) != correct) {
156-
printf("hairy_transposed2(%d, %d, %d, %d) = %d instead of %d\n",
131+
printf("hairy_transposed2(%d, %d, %d, %d) = %d instead of %d\n",
157132
i, j, k, l, hairy_transposed2(i, j, k, l), correct);
158133
return -1;
159134
}
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)