Skip to content

Commit 6a2a029

Browse files
authored
Merge pull request #14244 from MathiasVP/remove-unnecessary-size_t-cast
C++: Remove unnecessary `size_t` cast from allocations
2 parents 998237e + 0e9f5f6 commit 6a2a029

File tree

6 files changed

+335
-3
lines changed

6 files changed

+335
-3
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,8 +1906,10 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
19061906
final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
19071907
resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) and
19081908
(
1909+
this.extentNeedsConversion() and
19091910
// Convert the extent to `size_t`, because the AST doesn't do this already.
1910-
tag = AllocationExtentConvertTag() and opcode instanceof Opcode::Convert
1911+
tag = AllocationExtentConvertTag() and
1912+
opcode instanceof Opcode::Convert
19111913
or
19121914
tag = AllocationElementSizeTag() and opcode instanceof Opcode::Constant
19131915
or
@@ -1918,6 +1920,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
19181920
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
19191921
kind instanceof GotoEdge and
19201922
(
1923+
this.extentNeedsConversion() and
19211924
tag = AllocationExtentConvertTag() and
19221925
result = this.getInstruction(AllocationElementSizeTag())
19231926
or
@@ -1933,7 +1936,9 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
19331936

19341937
final override Instruction getChildSuccessor(TranslatedElement child) {
19351938
child = this.getExtent() and
1936-
result = this.getInstruction(AllocationExtentConvertTag())
1939+
if this.extentNeedsConversion()
1940+
then result = this.getInstruction(AllocationExtentConvertTag())
1941+
else result = this.getInstruction(AllocationElementSizeTag())
19371942
}
19381943

19391944
final override string getInstructionConstantValue(InstructionTag tag) {
@@ -1945,18 +1950,32 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
19451950
tag = AllocationSizeTag() and
19461951
(
19471952
operandTag instanceof LeftOperandTag and
1948-
result = this.getInstruction(AllocationExtentConvertTag())
1953+
(
1954+
if this.extentNeedsConversion()
1955+
then result = this.getInstruction(AllocationExtentConvertTag())
1956+
else result = this.getExtent().getResult()
1957+
)
19491958
or
19501959
operandTag instanceof RightOperandTag and
19511960
result = this.getInstruction(AllocationElementSizeTag())
19521961
)
19531962
or
1963+
this.extentNeedsConversion() and
19541964
tag = AllocationExtentConvertTag() and
19551965
operandTag instanceof UnaryOperandTag and
19561966
result = this.getExtent().getResult()
19571967
}
19581968

19591969
TranslatedExpr getExtent() { result = getTranslatedExpr(expr.getExtent().getFullyConverted()) }
1970+
1971+
/**
1972+
* Holds if the result of `expr.getExtent()` does not have the same type as
1973+
* the allocator's size parameter.
1974+
*/
1975+
private predicate extentNeedsConversion() {
1976+
expr.getExtent().getFullyConverted().getUnspecifiedType() !=
1977+
expr.getAllocator().getParameter(0).getUnspecifiedType()
1978+
}
19601979
}
19611980

19621981
/**

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15846,6 +15846,95 @@ ir.cpp:
1584615846
# 2095| getExpr(): [VariableAccess] x
1584715847
# 2095| Type = [IntType] int
1584815848
# 2095| ValueCategory = prvalue(load)
15849+
# 2098| [TopLevelFunction] void newArrayCorrectType(size_t)
15850+
# 2098| <params>:
15851+
# 2098| getParameter(0): [Parameter] n
15852+
# 2098| Type = [CTypedefType,Size_t] size_t
15853+
# 2098| getEntryPoint(): [BlockStmt] { ... }
15854+
# 2099| getStmt(0): [ExprStmt] ExprStmt
15855+
# 2099| getExpr(): [NewArrayExpr] new[]
15856+
# 2099| Type = [IntPointerType] int *
15857+
# 2099| ValueCategory = prvalue
15858+
# 2099| getExtent(): [VariableAccess] n
15859+
# 2099| Type = [CTypedefType,Size_t] size_t
15860+
# 2099| ValueCategory = prvalue(load)
15861+
# 2100| getStmt(1): [ExprStmt] ExprStmt
15862+
# 2100| getExpr(): [NewArrayExpr] new[]
15863+
# 2100| Type = [IntPointerType] int *
15864+
# 2100| ValueCategory = prvalue
15865+
# 2100| getAllocatorCall(): [FunctionCall] call to operator new[]
15866+
# 2100| Type = [VoidPointerType] void *
15867+
# 2100| ValueCategory = prvalue
15868+
# 2100| getArgument(0): [ErrorExpr] <error expr>
15869+
# 2100| Type = [LongType] unsigned long
15870+
# 2100| ValueCategory = prvalue
15871+
# 2100| getArgument(1): [Literal] 1.0
15872+
# 2100| Type = [FloatType] float
15873+
# 2100| Value = [Literal] 1.0
15874+
# 2100| ValueCategory = prvalue
15875+
# 2100| getExtent(): [VariableAccess] n
15876+
# 2100| Type = [CTypedefType,Size_t] size_t
15877+
# 2100| ValueCategory = prvalue(load)
15878+
# 2101| getStmt(2): [ExprStmt] ExprStmt
15879+
# 2101| getExpr(): [NewArrayExpr] new[]
15880+
# 2101| Type = [PointerType] String *
15881+
# 2101| ValueCategory = prvalue
15882+
# 2101| getInitializer(): [ArrayAggregateLiteral] {...}
15883+
# 2101| Type = [ArrayType] String[]
15884+
# 2101| ValueCategory = prvalue
15885+
# 2101| getAnElementExpr(0): [ConstructorCall] call to String
15886+
# 2101| Type = [VoidType] void
15887+
# 2101| ValueCategory = prvalue
15888+
# 2101| getExtent(): [VariableAccess] n
15889+
# 2101| Type = [CTypedefType,Size_t] size_t
15890+
# 2101| ValueCategory = prvalue(load)
15891+
# 2102| getStmt(3): [ExprStmt] ExprStmt
15892+
# 2102| getExpr(): [NewArrayExpr] new[]
15893+
# 2102| Type = [PointerType] Overaligned *
15894+
# 2102| ValueCategory = prvalue
15895+
# 2102| getExtent(): [VariableAccess] n
15896+
# 2102| Type = [CTypedefType,Size_t] size_t
15897+
# 2102| ValueCategory = prvalue(load)
15898+
# 2102| getAlignmentArgument(): [Literal] 128
15899+
# 2102| Type = [ScopedEnum] align_val_t
15900+
# 2102| Value = [Literal] 128
15901+
# 2102| ValueCategory = prvalue
15902+
# 2103| getStmt(4): [ExprStmt] ExprStmt
15903+
# 2103| getExpr(): [NewArrayExpr] new[]
15904+
# 2103| Type = [PointerType] DefaultCtorWithDefaultParam *
15905+
# 2103| ValueCategory = prvalue
15906+
# 2103| getInitializer(): [ArrayAggregateLiteral] {...}
15907+
# 2103| Type = [ArrayType] DefaultCtorWithDefaultParam[]
15908+
# 2103| ValueCategory = prvalue
15909+
# 2103| getAnElementExpr(0): [ConstructorCall] call to DefaultCtorWithDefaultParam
15910+
# 2103| Type = [VoidType] void
15911+
# 2103| ValueCategory = prvalue
15912+
# 2103| getExtent(): [VariableAccess] n
15913+
# 2103| Type = [CTypedefType,Size_t] size_t
15914+
# 2103| ValueCategory = prvalue(load)
15915+
# 2104| getStmt(5): [ExprStmt] ExprStmt
15916+
# 2104| getExpr(): [NewArrayExpr] new[]
15917+
# 2104| Type = [IntPointerType] int *
15918+
# 2104| ValueCategory = prvalue
15919+
# 2104| getInitializer(): [ArrayAggregateLiteral] {...}
15920+
# 2104| Type = [ArrayType] int[3]
15921+
# 2104| ValueCategory = prvalue
15922+
# 2104| getAnElementExpr(0): [Literal] 0
15923+
# 2104| Type = [IntType] int
15924+
# 2104| Value = [Literal] 0
15925+
# 2104| ValueCategory = prvalue
15926+
# 2104| getAnElementExpr(1): [Literal] 1
15927+
# 2104| Type = [IntType] int
15928+
# 2104| Value = [Literal] 1
15929+
# 2104| ValueCategory = prvalue
15930+
# 2104| getAnElementExpr(2): [Literal] 2
15931+
# 2104| Type = [IntType] int
15932+
# 2104| Value = [Literal] 2
15933+
# 2104| ValueCategory = prvalue
15934+
# 2104| getExtent(): [VariableAccess] n
15935+
# 2104| Type = [CTypedefType,Size_t] size_t
15936+
# 2104| ValueCategory = prvalue(load)
15937+
# 2105| getStmt(6): [ReturnStmt] return ...
1584915938
perf-regression.cpp:
1585015939
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
1585115940
# 4| <params>:

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12215,6 +12215,81 @@ ir.cpp:
1221512215
# 2090| v2090_8(void) = AliasedUse : ~m2094_4
1221612216
# 2090| v2090_9(void) = ExitFunction :
1221712217

12218+
# 2098| void newArrayCorrectType(size_t)
12219+
# 2098| Block 0
12220+
# 2098| v2098_1(void) = EnterFunction :
12221+
# 2098| m2098_2(unknown) = AliasedDefinition :
12222+
# 2098| m2098_3(unknown) = InitializeNonLocal :
12223+
# 2098| m2098_4(unknown) = Chi : total:m2098_2, partial:m2098_3
12224+
# 2098| r2098_5(glval<unsigned long>) = VariableAddress[n] :
12225+
# 2098| m2098_6(unsigned long) = InitializeParameter[n] : &:r2098_5
12226+
# 2099| r2099_1(glval<unknown>) = FunctionAddress[operator new[]] :
12227+
# 2099| r2099_2(glval<unsigned long>) = VariableAddress[n] :
12228+
# 2099| r2099_3(unsigned long) = Load[n] : &:r2099_2, m2098_6
12229+
# 2099| r2099_4(unsigned long) = Constant[4] :
12230+
# 2099| r2099_5(unsigned long) = Mul : r2099_3, r2099_4
12231+
# 2099| r2099_6(void *) = Call[operator new[]] : func:r2099_1, 0:r2099_5
12232+
# 2099| m2099_7(unknown) = ^CallSideEffect : ~m2098_4
12233+
# 2099| m2099_8(unknown) = Chi : total:m2098_4, partial:m2099_7
12234+
# 2099| m2099_9(unknown) = ^InitializeDynamicAllocation : &:r2099_6
12235+
# 2099| r2099_10(int *) = Convert : r2099_6
12236+
# 2100| r2100_1(glval<unknown>) = FunctionAddress[operator new[]] :
12237+
# 2100| r2100_2(glval<unsigned long>) = VariableAddress[n] :
12238+
# 2100| r2100_3(unsigned long) = Load[n] : &:r2100_2, m2098_6
12239+
# 2100| r2100_4(unsigned long) = Constant[4] :
12240+
# 2100| r2100_5(unsigned long) = Mul : r2100_3, r2100_4
12241+
# 2100| r2100_6(float) = Constant[1.0] :
12242+
# 2100| r2100_7(void *) = Call[operator new[]] : func:r2100_1, 0:r2100_5, 1:r2100_6
12243+
# 2100| m2100_8(unknown) = ^CallSideEffect : ~m2099_8
12244+
# 2100| m2100_9(unknown) = Chi : total:m2099_8, partial:m2100_8
12245+
# 2100| m2100_10(unknown) = ^InitializeDynamicAllocation : &:r2100_7
12246+
# 2100| r2100_11(int *) = Convert : r2100_7
12247+
# 2101| r2101_1(glval<unknown>) = FunctionAddress[operator new[]] :
12248+
# 2101| r2101_2(glval<unsigned long>) = VariableAddress[n] :
12249+
# 2101| r2101_3(unsigned long) = Load[n] : &:r2101_2, m2098_6
12250+
# 2101| r2101_4(unsigned long) = Constant[8] :
12251+
# 2101| r2101_5(unsigned long) = Mul : r2101_3, r2101_4
12252+
# 2101| r2101_6(void *) = Call[operator new[]] : func:r2101_1, 0:r2101_5
12253+
# 2101| m2101_7(unknown) = ^CallSideEffect : ~m2100_9
12254+
# 2101| m2101_8(unknown) = Chi : total:m2100_9, partial:m2101_7
12255+
# 2101| m2101_9(unknown) = ^InitializeDynamicAllocation : &:r2101_6
12256+
# 2101| r2101_10(String *) = Convert : r2101_6
12257+
# 2102| r2102_1(glval<unknown>) = FunctionAddress[operator new[]] :
12258+
# 2102| r2102_2(glval<unsigned long>) = VariableAddress[n] :
12259+
# 2102| r2102_3(unsigned long) = Load[n] : &:r2102_2, m2098_6
12260+
# 2102| r2102_4(unsigned long) = Constant[256] :
12261+
# 2102| r2102_5(unsigned long) = Mul : r2102_3, r2102_4
12262+
# 2102| r2102_6(align_val_t) = Constant[128] :
12263+
# 2102| r2102_7(void *) = Call[operator new[]] : func:r2102_1, 0:r2102_5, 1:r2102_6
12264+
# 2102| m2102_8(unknown) = ^CallSideEffect : ~m2101_8
12265+
# 2102| m2102_9(unknown) = Chi : total:m2101_8, partial:m2102_8
12266+
# 2102| m2102_10(unknown) = ^InitializeDynamicAllocation : &:r2102_7
12267+
# 2102| r2102_11(Overaligned *) = Convert : r2102_7
12268+
# 2103| r2103_1(glval<unknown>) = FunctionAddress[operator new[]] :
12269+
# 2103| r2103_2(glval<unsigned long>) = VariableAddress[n] :
12270+
# 2103| r2103_3(unsigned long) = Load[n] : &:r2103_2, m2098_6
12271+
# 2103| r2103_4(unsigned long) = Constant[1] :
12272+
# 2103| r2103_5(unsigned long) = Mul : r2103_3, r2103_4
12273+
# 2103| r2103_6(void *) = Call[operator new[]] : func:r2103_1, 0:r2103_5
12274+
# 2103| m2103_7(unknown) = ^CallSideEffect : ~m2102_9
12275+
# 2103| m2103_8(unknown) = Chi : total:m2102_9, partial:m2103_7
12276+
# 2103| m2103_9(unknown) = ^InitializeDynamicAllocation : &:r2103_6
12277+
# 2103| r2103_10(DefaultCtorWithDefaultParam *) = Convert : r2103_6
12278+
# 2104| r2104_1(glval<unknown>) = FunctionAddress[operator new[]] :
12279+
# 2104| r2104_2(glval<unsigned long>) = VariableAddress[n] :
12280+
# 2104| r2104_3(unsigned long) = Load[n] : &:r2104_2, m2098_6
12281+
# 2104| r2104_4(unsigned long) = Constant[4] :
12282+
# 2104| r2104_5(unsigned long) = Mul : r2104_3, r2104_4
12283+
# 2104| r2104_6(void *) = Call[operator new[]] : func:r2104_1, 0:r2104_5
12284+
# 2104| m2104_7(unknown) = ^CallSideEffect : ~m2103_8
12285+
# 2104| m2104_8(unknown) = Chi : total:m2103_8, partial:m2104_7
12286+
# 2104| m2104_9(unknown) = ^InitializeDynamicAllocation : &:r2104_6
12287+
# 2104| r2104_10(int *) = Convert : r2104_6
12288+
# 2105| v2105_1(void) = NoOp :
12289+
# 2098| v2098_7(void) = ReturnVoid :
12290+
# 2098| v2098_8(void) = AliasedUse : ~m2104_8
12291+
# 2098| v2098_9(void) = ExitFunction :
12292+
1221812293
perf-regression.cpp:
1221912294
# 6| void Big::Big()
1222012295
# 6| Block 0

cpp/ql/test/library-tests/ir/ir/ir.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,4 +2095,13 @@ int TransNonExit() {
20952095
return x;
20962096
}
20972097

2098+
void newArrayCorrectType(size_t n) {
2099+
new int[n]; // No constructor
2100+
new(1.0f) int[n]; // Placement new, no constructor
2101+
new String[n]; // Constructor
2102+
new Overaligned[n]; // Aligned new
2103+
new DefaultCtorWithDefaultParam[n];
2104+
new int[n] { 0, 1, 2 };
2105+
}
2106+
20982107
// semmle-extractor-options: -std=c++17 --clang

cpp/ql/test/library-tests/ir/ir/operand_locations.expected

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9896,6 +9896,78 @@
98969896
| ir.cpp:2095:12:2095:12 | Address | &:r2095_2 |
98979897
| ir.cpp:2095:12:2095:12 | Load | m2091_8 |
98989898
| ir.cpp:2095:12:2095:12 | StoreValue | r2095_3 |
9899+
| ir.cpp:2098:6:2098:24 | ChiPartial | partial:m2098_3 |
9900+
| ir.cpp:2098:6:2098:24 | ChiTotal | total:m2098_2 |
9901+
| ir.cpp:2098:6:2098:24 | SideEffect | ~m2104_8 |
9902+
| ir.cpp:2098:33:2098:33 | Address | &:r2098_5 |
9903+
| ir.cpp:2099:3:2099:12 | Address | &:r2099_6 |
9904+
| ir.cpp:2099:3:2099:12 | Arg(0) | 0:r2099_5 |
9905+
| ir.cpp:2099:3:2099:12 | CallTarget | func:r2099_1 |
9906+
| ir.cpp:2099:3:2099:12 | ChiPartial | partial:m2099_7 |
9907+
| ir.cpp:2099:3:2099:12 | ChiTotal | total:m2098_4 |
9908+
| ir.cpp:2099:3:2099:12 | Right | r2099_4 |
9909+
| ir.cpp:2099:3:2099:12 | SideEffect | ~m2098_4 |
9910+
| ir.cpp:2099:3:2099:12 | Unary | r2099_6 |
9911+
| ir.cpp:2099:11:2099:11 | Address | &:r2099_2 |
9912+
| ir.cpp:2099:11:2099:11 | Left | r2099_3 |
9913+
| ir.cpp:2099:11:2099:11 | Load | m2098_6 |
9914+
| ir.cpp:2100:3:2100:18 | Address | &:r2100_7 |
9915+
| ir.cpp:2100:3:2100:18 | Arg(0) | 0:r2100_5 |
9916+
| ir.cpp:2100:3:2100:18 | CallTarget | func:r2100_1 |
9917+
| ir.cpp:2100:3:2100:18 | ChiPartial | partial:m2100_8 |
9918+
| ir.cpp:2100:3:2100:18 | ChiTotal | total:m2099_8 |
9919+
| ir.cpp:2100:3:2100:18 | Right | r2100_4 |
9920+
| ir.cpp:2100:3:2100:18 | SideEffect | ~m2099_8 |
9921+
| ir.cpp:2100:3:2100:18 | Unary | r2100_7 |
9922+
| ir.cpp:2100:7:2100:10 | Arg(1) | 1:r2100_6 |
9923+
| ir.cpp:2100:17:2100:17 | Address | &:r2100_2 |
9924+
| ir.cpp:2100:17:2100:17 | Left | r2100_3 |
9925+
| ir.cpp:2100:17:2100:17 | Load | m2098_6 |
9926+
| ir.cpp:2101:3:2101:15 | Address | &:r2101_6 |
9927+
| ir.cpp:2101:3:2101:15 | Arg(0) | 0:r2101_5 |
9928+
| ir.cpp:2101:3:2101:15 | CallTarget | func:r2101_1 |
9929+
| ir.cpp:2101:3:2101:15 | ChiPartial | partial:m2101_7 |
9930+
| ir.cpp:2101:3:2101:15 | ChiTotal | total:m2100_9 |
9931+
| ir.cpp:2101:3:2101:15 | Right | r2101_4 |
9932+
| ir.cpp:2101:3:2101:15 | SideEffect | ~m2100_9 |
9933+
| ir.cpp:2101:3:2101:15 | Unary | r2101_6 |
9934+
| ir.cpp:2101:14:2101:14 | Address | &:r2101_2 |
9935+
| ir.cpp:2101:14:2101:14 | Left | r2101_3 |
9936+
| ir.cpp:2101:14:2101:14 | Load | m2098_6 |
9937+
| ir.cpp:2102:3:2102:20 | Address | &:r2102_7 |
9938+
| ir.cpp:2102:3:2102:20 | Arg(0) | 0:r2102_5 |
9939+
| ir.cpp:2102:3:2102:20 | CallTarget | func:r2102_1 |
9940+
| ir.cpp:2102:3:2102:20 | ChiPartial | partial:m2102_8 |
9941+
| ir.cpp:2102:3:2102:20 | ChiTotal | total:m2101_8 |
9942+
| ir.cpp:2102:3:2102:20 | Right | r2102_4 |
9943+
| ir.cpp:2102:3:2102:20 | SideEffect | ~m2101_8 |
9944+
| ir.cpp:2102:3:2102:20 | Unary | r2102_7 |
9945+
| ir.cpp:2102:19:2102:19 | Address | &:r2102_2 |
9946+
| ir.cpp:2102:19:2102:19 | Left | r2102_3 |
9947+
| ir.cpp:2102:19:2102:19 | Load | m2098_6 |
9948+
| ir.cpp:2102:21:2102:21 | Arg(1) | 1:r2102_6 |
9949+
| ir.cpp:2103:3:2103:36 | Address | &:r2103_6 |
9950+
| ir.cpp:2103:3:2103:36 | Arg(0) | 0:r2103_5 |
9951+
| ir.cpp:2103:3:2103:36 | CallTarget | func:r2103_1 |
9952+
| ir.cpp:2103:3:2103:36 | ChiPartial | partial:m2103_7 |
9953+
| ir.cpp:2103:3:2103:36 | ChiTotal | total:m2102_9 |
9954+
| ir.cpp:2103:3:2103:36 | Right | r2103_4 |
9955+
| ir.cpp:2103:3:2103:36 | SideEffect | ~m2102_9 |
9956+
| ir.cpp:2103:3:2103:36 | Unary | r2103_6 |
9957+
| ir.cpp:2103:35:2103:35 | Address | &:r2103_2 |
9958+
| ir.cpp:2103:35:2103:35 | Left | r2103_3 |
9959+
| ir.cpp:2103:35:2103:35 | Load | m2098_6 |
9960+
| ir.cpp:2104:3:2104:24 | Address | &:r2104_6 |
9961+
| ir.cpp:2104:3:2104:24 | Arg(0) | 0:r2104_5 |
9962+
| ir.cpp:2104:3:2104:24 | CallTarget | func:r2104_1 |
9963+
| ir.cpp:2104:3:2104:24 | ChiPartial | partial:m2104_7 |
9964+
| ir.cpp:2104:3:2104:24 | ChiTotal | total:m2103_8 |
9965+
| ir.cpp:2104:3:2104:24 | Right | r2104_4 |
9966+
| ir.cpp:2104:3:2104:24 | SideEffect | ~m2103_8 |
9967+
| ir.cpp:2104:3:2104:24 | Unary | r2104_6 |
9968+
| ir.cpp:2104:11:2104:11 | Address | &:r2104_2 |
9969+
| ir.cpp:2104:11:2104:11 | Left | r2104_3 |
9970+
| ir.cpp:2104:11:2104:11 | Load | m2098_6 |
98999971
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
99009972
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
99019973
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

0 commit comments

Comments
 (0)