Skip to content

Commit 04c5f1c

Browse files
committed
C++: Perf fix for value numbering
1 parent 2439690 commit 04c5f1c

File tree

1 file changed

+25
-27
lines changed

1 file changed

+25
-27
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@ newtype TValueNumber =
99
initializeParameterValueNumber(_, irFunc, var)
1010
} or
1111
TInitializeThisValueNumber(IRFunction irFunc) { initializeThisValueNumber(_, irFunc) } or
12-
TConstantValueNumber(IRFunction irFunc, IRType type, string value) {
13-
constantValueNumber(_, irFunc, type, value)
14-
} or
12+
TConstantValueNumber(IRFunction irFunc, string value) { constantValueNumber(_, irFunc, value) } or
1513
TStringConstantValueNumber(IRFunction irFunc, IRType type, string value) {
1614
stringConstantValueNumber(_, irFunc, type, value)
1715
} or
1816
TFieldAddressValueNumber(IRFunction irFunc, Field field, TValueNumber objectAddress) {
1917
fieldAddressValueNumber(_, irFunc, field, objectAddress)
2018
} or
2119
TBinaryValueNumber(
22-
IRFunction irFunc, Opcode opcode, TValueNumber leftOperand,
23-
TValueNumber rightOperand
20+
IRFunction irFunc, Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand
2421
) {
2522
binaryValueNumber(_, irFunc, opcode, leftOperand, rightOperand)
2623
} or
@@ -38,9 +35,7 @@ newtype TValueNumber =
3835
) {
3936
inheritanceConversionValueNumber(_, irFunc, opcode, baseClass, derivedClass, operand)
4037
} or
41-
TLoadTotalOverlapValueNumber(
42-
IRFunction irFunc, TValueNumber memOperand, TValueNumber operand
43-
) {
38+
TLoadTotalOverlapValueNumber(IRFunction irFunc, TValueNumber memOperand, TValueNumber operand) {
4439
loadTotalOverlapValueNumber(_, irFunc, memOperand, operand)
4540
} or
4641
TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) }
@@ -102,15 +97,24 @@ private predicate numberableInstruction(Instruction instr) {
10297
predicate multipleValueNumbers(Instruction instr, int n) {
10398
n > 1 and
10499
(
105-
n = strictcount(IRFunction irFunc, Language::AST ast | variableAddressValueNumber(instr, irFunc, ast))
100+
n =
101+
strictcount(IRFunction irFunc, Language::AST ast |
102+
variableAddressValueNumber(instr, irFunc, ast)
103+
)
106104
or
107-
n = strictcount(IRFunction irFunc, Language::AST var | initializeParameterValueNumber(instr, irFunc, var))
105+
n =
106+
strictcount(IRFunction irFunc, Language::AST var |
107+
initializeParameterValueNumber(instr, irFunc, var)
108+
)
108109
or
109110
n = strictcount(IRFunction irFunc | initializeThisValueNumber(instr, irFunc))
110111
or
111-
n = strictcount(IRFunction irFunc, IRType type, string value | constantValueNumber(instr, irFunc, type, value))
112+
n = strictcount(IRFunction irFunc, string value | constantValueNumber(instr, irFunc, value))
112113
or
113-
n = strictcount(IRFunction irFunc, IRType type, string value | stringConstantValueNumber(instr, irFunc, type, value))
114+
n =
115+
strictcount(IRFunction irFunc, IRType type, string value |
116+
stringConstantValueNumber(instr, irFunc, type, value)
117+
)
114118
)
115119
}
116120

@@ -139,11 +143,8 @@ private predicate initializeThisValueNumber(InitializeThisInstruction instr, IRF
139143
instr.getEnclosingIRFunction() = irFunc
140144
}
141145

142-
private predicate constantValueNumber(
143-
ConstantInstruction instr, IRFunction irFunc, IRType type, string value
144-
) {
146+
predicate constantValueNumber(ConstantInstruction instr, IRFunction irFunc, string value) {
145147
instr.getEnclosingIRFunction() = irFunc and
146-
instr.getResultIRType() = type and
147148
instr.getValue() = value
148149
}
149150

@@ -161,6 +162,7 @@ private predicate fieldAddressValueNumber(
161162
) {
162163
instr.getEnclosingIRFunction() = irFunc and
163164
instr.getField() = field and
165+
strictcount(instr.getField()) = 1 and
164166
tvalueNumber(instr.getObjectAddress()) = objectAddress
165167
}
166168

@@ -176,8 +178,8 @@ private predicate binaryValueNumber(
176178
}
177179

178180
private predicate pointerArithmeticValueNumber(
179-
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode,
180-
int elementSize, TValueNumber leftOperand, TValueNumber rightOperand
181+
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
182+
TValueNumber leftOperand, TValueNumber rightOperand
181183
) {
182184
instr.getEnclosingIRFunction() = irFunc and
183185
instr.getOpcode() = opcode and
@@ -267,9 +269,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
267269
initializeThisValueNumber(instr, irFunc) and
268270
result = TInitializeThisValueNumber(irFunc)
269271
or
270-
exists(IRType type, string value |
271-
constantValueNumber(instr, irFunc, type, value) and
272-
result = TConstantValueNumber(irFunc, type, value)
272+
exists(string value |
273+
constantValueNumber(instr, irFunc, value) and
274+
result = TConstantValueNumber(irFunc, value)
273275
)
274276
or
275277
exists(IRType type, string value |
@@ -299,12 +301,8 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
299301
result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand)
300302
)
301303
or
302-
exists(
303-
Opcode opcode, int elementSize, TValueNumber leftOperand,
304-
TValueNumber rightOperand
305-
|
306-
pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand,
307-
rightOperand) and
304+
exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand |
305+
pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and
308306
result =
309307
TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand)
310308
)

0 commit comments

Comments
 (0)