Skip to content

Commit 7abd289

Browse files
author
Robert Marsh
committed
C++: reinclude IRType in total load value numbers
1 parent b4ff121 commit 7abd289

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ newtype TValueNumber =
3737
) {
3838
inheritanceConversionValueNumber(_, irFunc, opcode, baseClass, derivedClass, operand)
3939
} or
40-
TLoadTotalOverlapValueNumber(IRFunction irFunc, TValueNumber memOperand, TValueNumber operand) {
41-
loadTotalOverlapValueNumber(_, irFunc, memOperand, operand)
40+
TLoadTotalOverlapValueNumber(IRFunction irFunc, IRType type, TValueNumber memOperand, TValueNumber operand) {
41+
loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand)
4242
} or
4343
TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) }
4444

@@ -206,12 +206,13 @@ private predicate inheritanceConversionValueNumber(
206206
}
207207

208208
private predicate loadTotalOverlapValueNumber(
209-
LoadTotalOverlapInstruction instr, IRFunction irFunc, TValueNumber memOperand,
209+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
210210
TValueNumber operand
211211
) {
212212
instr.getEnclosingIRFunction() = irFunc and
213213
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
214-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand
214+
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
215+
instr.getResultIRType() = type
215216
}
216217

217218
/**
@@ -306,9 +307,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
306307
TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand)
307308
)
308309
or
309-
exists(TValueNumber memOperand, TValueNumber operand |
310-
loadTotalOverlapValueNumber(instr, irFunc, memOperand, operand) and
311-
result = TLoadTotalOverlapValueNumber(irFunc, memOperand, operand)
310+
exists(IRType type, TValueNumber memOperand, TValueNumber operand |
311+
loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and
312+
result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand)
312313
)
313314
or
314315
// The value number of a copy is just the value number of its source value.

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ newtype TValueNumber =
3737
) {
3838
inheritanceConversionValueNumber(_, irFunc, opcode, baseClass, derivedClass, operand)
3939
} or
40-
TLoadTotalOverlapValueNumber(IRFunction irFunc, TValueNumber memOperand, TValueNumber operand) {
41-
loadTotalOverlapValueNumber(_, irFunc, memOperand, operand)
40+
TLoadTotalOverlapValueNumber(IRFunction irFunc, IRType type, TValueNumber memOperand, TValueNumber operand) {
41+
loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand)
4242
} or
4343
TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) }
4444

@@ -206,12 +206,13 @@ private predicate inheritanceConversionValueNumber(
206206
}
207207

208208
private predicate loadTotalOverlapValueNumber(
209-
LoadTotalOverlapInstruction instr, IRFunction irFunc, TValueNumber memOperand,
209+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
210210
TValueNumber operand
211211
) {
212212
instr.getEnclosingIRFunction() = irFunc and
213213
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
214-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand
214+
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
215+
instr.getResultIRType() = type
215216
}
216217

217218
/**
@@ -306,9 +307,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
306307
TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand)
307308
)
308309
or
309-
exists(TValueNumber memOperand, TValueNumber operand |
310-
loadTotalOverlapValueNumber(instr, irFunc, memOperand, operand) and
311-
result = TLoadTotalOverlapValueNumber(irFunc, memOperand, operand)
310+
exists(IRType type, TValueNumber memOperand, TValueNumber operand |
311+
loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and
312+
result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand)
312313
)
313314
or
314315
// The value number of a copy is just the value number of its source value.

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ newtype TValueNumber =
3737
) {
3838
inheritanceConversionValueNumber(_, irFunc, opcode, baseClass, derivedClass, operand)
3939
} or
40-
TLoadTotalOverlapValueNumber(IRFunction irFunc, TValueNumber memOperand, TValueNumber operand) {
41-
loadTotalOverlapValueNumber(_, irFunc, memOperand, operand)
40+
TLoadTotalOverlapValueNumber(IRFunction irFunc, IRType type, TValueNumber memOperand, TValueNumber operand) {
41+
loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand)
4242
} or
4343
TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) }
4444

@@ -206,12 +206,13 @@ private predicate inheritanceConversionValueNumber(
206206
}
207207

208208
private predicate loadTotalOverlapValueNumber(
209-
LoadTotalOverlapInstruction instr, IRFunction irFunc, TValueNumber memOperand,
209+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
210210
TValueNumber operand
211211
) {
212212
instr.getEnclosingIRFunction() = irFunc and
213213
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
214-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand
214+
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
215+
instr.getResultIRType() = type
215216
}
216217

217218
/**
@@ -306,9 +307,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
306307
TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand)
307308
)
308309
or
309-
exists(TValueNumber memOperand, TValueNumber operand |
310-
loadTotalOverlapValueNumber(instr, irFunc, memOperand, operand) and
311-
result = TLoadTotalOverlapValueNumber(irFunc, memOperand, operand)
310+
exists(IRType type, TValueNumber memOperand, TValueNumber operand |
311+
loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and
312+
result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand)
312313
)
313314
or
314315
// The value number of a copy is just the value number of its source value.

0 commit comments

Comments
 (0)