Skip to content

Commit 6638df1

Browse files
committed
C++: Sync identical files.
1 parent 0b33d26 commit 6638df1

File tree

4 files changed

+228
-48
lines changed

4 files changed

+228
-48
lines changed

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

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159159
tvalueNumber(instr.getObjectAddress()) = objectAddress
160160
}
161161

162+
pragma[nomagic]
163+
private predicate binaryValueNumber0(
164+
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, boolean isLeft,
165+
TValueNumber valueNumber
166+
) {
167+
not instr instanceof PointerArithmeticInstruction and
168+
instr.getEnclosingIRFunction() = irFunc and
169+
instr.getOpcode() = opcode and
170+
(
171+
isLeft = true and
172+
tvalueNumber(instr.getLeft()) = valueNumber
173+
or
174+
isLeft = false and
175+
tvalueNumber(instr.getRight()) = valueNumber
176+
)
177+
}
178+
179+
pragma[assume_small_delta]
162180
private predicate binaryValueNumber(
163181
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber leftOperand,
164182
TValueNumber rightOperand
183+
) {
184+
binaryValueNumber0(instr, irFunc, opcode, true, leftOperand) and
185+
binaryValueNumber0(instr, irFunc, opcode, false, rightOperand)
186+
}
187+
188+
pragma[nomagic]
189+
private predicate pointerArithmeticValueNumber0(
190+
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
191+
boolean isLeft, TValueNumber valueNumber
165192
) {
166193
instr.getEnclosingIRFunction() = irFunc and
167-
not instr instanceof PointerArithmeticInstruction and
168194
instr.getOpcode() = opcode and
169-
tvalueNumber(instr.getLeft()) = leftOperand and
170-
tvalueNumber(instr.getRight()) = rightOperand
195+
instr.getElementSize() = elementSize and
196+
(
197+
isLeft = true and
198+
tvalueNumber(instr.getLeft()) = valueNumber
199+
or
200+
isLeft = false and
201+
tvalueNumber(instr.getRight()) = valueNumber
202+
)
171203
}
172204

205+
pragma[assume_small_delta]
173206
private predicate pointerArithmeticValueNumber(
174207
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
175208
TValueNumber leftOperand, TValueNumber rightOperand
176209
) {
177-
instr.getEnclosingIRFunction() = irFunc and
178-
instr.getOpcode() = opcode and
179-
instr.getElementSize() = elementSize and
180-
tvalueNumber(instr.getLeft()) = leftOperand and
181-
tvalueNumber(instr.getRight()) = rightOperand
210+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, true, leftOperand) and
211+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, false, rightOperand)
182212
}
183213

184214
private predicate unaryValueNumber(
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203233
unique( | | instr.getDerivedClass()) = derivedClass
204234
}
205235

236+
pragma[nomagic]
237+
private predicate loadTotalOverlapValueNumber0(
238+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber,
239+
boolean isAddress
240+
) {
241+
instr.getEnclosingIRFunction() = irFunc and
242+
instr.getResultIRType() = type and
243+
(
244+
isAddress = true and
245+
tvalueNumberOfOperand(instr.getSourceAddressOperand()) = valueNumber
246+
or
247+
isAddress = false and
248+
tvalueNumber(instr.getSourceValueOperand().getAnyDef()) = valueNumber
249+
)
250+
}
251+
252+
pragma[assume_small_delta]
206253
private predicate loadTotalOverlapValueNumber(
207254
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
208255
TValueNumber operand
209256
) {
210-
instr.getEnclosingIRFunction() = irFunc and
211-
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
212-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
213-
instr.getResultIRType() = type
257+
loadTotalOverlapValueNumber0(instr, irFunc, type, operand, true) and
258+
loadTotalOverlapValueNumber0(instr, irFunc, type, memOperand, false)
214259
}
215260

216261
/**

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

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159159
tvalueNumber(instr.getObjectAddress()) = objectAddress
160160
}
161161

162+
pragma[nomagic]
163+
private predicate binaryValueNumber0(
164+
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, boolean isLeft,
165+
TValueNumber valueNumber
166+
) {
167+
not instr instanceof PointerArithmeticInstruction and
168+
instr.getEnclosingIRFunction() = irFunc and
169+
instr.getOpcode() = opcode and
170+
(
171+
isLeft = true and
172+
tvalueNumber(instr.getLeft()) = valueNumber
173+
or
174+
isLeft = false and
175+
tvalueNumber(instr.getRight()) = valueNumber
176+
)
177+
}
178+
179+
pragma[assume_small_delta]
162180
private predicate binaryValueNumber(
163181
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber leftOperand,
164182
TValueNumber rightOperand
183+
) {
184+
binaryValueNumber0(instr, irFunc, opcode, true, leftOperand) and
185+
binaryValueNumber0(instr, irFunc, opcode, false, rightOperand)
186+
}
187+
188+
pragma[nomagic]
189+
private predicate pointerArithmeticValueNumber0(
190+
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
191+
boolean isLeft, TValueNumber valueNumber
165192
) {
166193
instr.getEnclosingIRFunction() = irFunc and
167-
not instr instanceof PointerArithmeticInstruction and
168194
instr.getOpcode() = opcode and
169-
tvalueNumber(instr.getLeft()) = leftOperand and
170-
tvalueNumber(instr.getRight()) = rightOperand
195+
instr.getElementSize() = elementSize and
196+
(
197+
isLeft = true and
198+
tvalueNumber(instr.getLeft()) = valueNumber
199+
or
200+
isLeft = false and
201+
tvalueNumber(instr.getRight()) = valueNumber
202+
)
171203
}
172204

205+
pragma[assume_small_delta]
173206
private predicate pointerArithmeticValueNumber(
174207
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
175208
TValueNumber leftOperand, TValueNumber rightOperand
176209
) {
177-
instr.getEnclosingIRFunction() = irFunc and
178-
instr.getOpcode() = opcode and
179-
instr.getElementSize() = elementSize and
180-
tvalueNumber(instr.getLeft()) = leftOperand and
181-
tvalueNumber(instr.getRight()) = rightOperand
210+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, true, leftOperand) and
211+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, false, rightOperand)
182212
}
183213

184214
private predicate unaryValueNumber(
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203233
unique( | | instr.getDerivedClass()) = derivedClass
204234
}
205235

236+
pragma[nomagic]
237+
private predicate loadTotalOverlapValueNumber0(
238+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber,
239+
boolean isAddress
240+
) {
241+
instr.getEnclosingIRFunction() = irFunc and
242+
instr.getResultIRType() = type and
243+
(
244+
isAddress = true and
245+
tvalueNumberOfOperand(instr.getSourceAddressOperand()) = valueNumber
246+
or
247+
isAddress = false and
248+
tvalueNumber(instr.getSourceValueOperand().getAnyDef()) = valueNumber
249+
)
250+
}
251+
252+
pragma[assume_small_delta]
206253
private predicate loadTotalOverlapValueNumber(
207254
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
208255
TValueNumber operand
209256
) {
210-
instr.getEnclosingIRFunction() = irFunc and
211-
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
212-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
213-
instr.getResultIRType() = type
257+
loadTotalOverlapValueNumber0(instr, irFunc, type, operand, true) and
258+
loadTotalOverlapValueNumber0(instr, irFunc, type, memOperand, false)
214259
}
215260

216261
/**

csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159159
tvalueNumber(instr.getObjectAddress()) = objectAddress
160160
}
161161

162+
pragma[nomagic]
163+
private predicate binaryValueNumber0(
164+
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, boolean isLeft,
165+
TValueNumber valueNumber
166+
) {
167+
not instr instanceof PointerArithmeticInstruction and
168+
instr.getEnclosingIRFunction() = irFunc and
169+
instr.getOpcode() = opcode and
170+
(
171+
isLeft = true and
172+
tvalueNumber(instr.getLeft()) = valueNumber
173+
or
174+
isLeft = false and
175+
tvalueNumber(instr.getRight()) = valueNumber
176+
)
177+
}
178+
179+
pragma[assume_small_delta]
162180
private predicate binaryValueNumber(
163181
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber leftOperand,
164182
TValueNumber rightOperand
183+
) {
184+
binaryValueNumber0(instr, irFunc, opcode, true, leftOperand) and
185+
binaryValueNumber0(instr, irFunc, opcode, false, rightOperand)
186+
}
187+
188+
pragma[nomagic]
189+
private predicate pointerArithmeticValueNumber0(
190+
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
191+
boolean isLeft, TValueNumber valueNumber
165192
) {
166193
instr.getEnclosingIRFunction() = irFunc and
167-
not instr instanceof PointerArithmeticInstruction and
168194
instr.getOpcode() = opcode and
169-
tvalueNumber(instr.getLeft()) = leftOperand and
170-
tvalueNumber(instr.getRight()) = rightOperand
195+
instr.getElementSize() = elementSize and
196+
(
197+
isLeft = true and
198+
tvalueNumber(instr.getLeft()) = valueNumber
199+
or
200+
isLeft = false and
201+
tvalueNumber(instr.getRight()) = valueNumber
202+
)
171203
}
172204

205+
pragma[assume_small_delta]
173206
private predicate pointerArithmeticValueNumber(
174207
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
175208
TValueNumber leftOperand, TValueNumber rightOperand
176209
) {
177-
instr.getEnclosingIRFunction() = irFunc and
178-
instr.getOpcode() = opcode and
179-
instr.getElementSize() = elementSize and
180-
tvalueNumber(instr.getLeft()) = leftOperand and
181-
tvalueNumber(instr.getRight()) = rightOperand
210+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, true, leftOperand) and
211+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, false, rightOperand)
182212
}
183213

184214
private predicate unaryValueNumber(
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203233
unique( | | instr.getDerivedClass()) = derivedClass
204234
}
205235

236+
pragma[nomagic]
237+
private predicate loadTotalOverlapValueNumber0(
238+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber,
239+
boolean isAddress
240+
) {
241+
instr.getEnclosingIRFunction() = irFunc and
242+
instr.getResultIRType() = type and
243+
(
244+
isAddress = true and
245+
tvalueNumberOfOperand(instr.getSourceAddressOperand()) = valueNumber
246+
or
247+
isAddress = false and
248+
tvalueNumber(instr.getSourceValueOperand().getAnyDef()) = valueNumber
249+
)
250+
}
251+
252+
pragma[assume_small_delta]
206253
private predicate loadTotalOverlapValueNumber(
207254
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
208255
TValueNumber operand
209256
) {
210-
instr.getEnclosingIRFunction() = irFunc and
211-
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
212-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
213-
instr.getResultIRType() = type
257+
loadTotalOverlapValueNumber0(instr, irFunc, type, operand, true) and
258+
loadTotalOverlapValueNumber0(instr, irFunc, type, memOperand, false)
214259
}
215260

216261
/**

csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159159
tvalueNumber(instr.getObjectAddress()) = objectAddress
160160
}
161161

162+
pragma[nomagic]
163+
private predicate binaryValueNumber0(
164+
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, boolean isLeft,
165+
TValueNumber valueNumber
166+
) {
167+
not instr instanceof PointerArithmeticInstruction and
168+
instr.getEnclosingIRFunction() = irFunc and
169+
instr.getOpcode() = opcode and
170+
(
171+
isLeft = true and
172+
tvalueNumber(instr.getLeft()) = valueNumber
173+
or
174+
isLeft = false and
175+
tvalueNumber(instr.getRight()) = valueNumber
176+
)
177+
}
178+
179+
pragma[assume_small_delta]
162180
private predicate binaryValueNumber(
163181
BinaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber leftOperand,
164182
TValueNumber rightOperand
183+
) {
184+
binaryValueNumber0(instr, irFunc, opcode, true, leftOperand) and
185+
binaryValueNumber0(instr, irFunc, opcode, false, rightOperand)
186+
}
187+
188+
pragma[nomagic]
189+
private predicate pointerArithmeticValueNumber0(
190+
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
191+
boolean isLeft, TValueNumber valueNumber
165192
) {
166193
instr.getEnclosingIRFunction() = irFunc and
167-
not instr instanceof PointerArithmeticInstruction and
168194
instr.getOpcode() = opcode and
169-
tvalueNumber(instr.getLeft()) = leftOperand and
170-
tvalueNumber(instr.getRight()) = rightOperand
195+
instr.getElementSize() = elementSize and
196+
(
197+
isLeft = true and
198+
tvalueNumber(instr.getLeft()) = valueNumber
199+
or
200+
isLeft = false and
201+
tvalueNumber(instr.getRight()) = valueNumber
202+
)
171203
}
172204

205+
pragma[assume_small_delta]
173206
private predicate pointerArithmeticValueNumber(
174207
PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize,
175208
TValueNumber leftOperand, TValueNumber rightOperand
176209
) {
177-
instr.getEnclosingIRFunction() = irFunc and
178-
instr.getOpcode() = opcode and
179-
instr.getElementSize() = elementSize and
180-
tvalueNumber(instr.getLeft()) = leftOperand and
181-
tvalueNumber(instr.getRight()) = rightOperand
210+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, true, leftOperand) and
211+
pointerArithmeticValueNumber0(instr, irFunc, opcode, elementSize, false, rightOperand)
182212
}
183213

184214
private predicate unaryValueNumber(
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203233
unique( | | instr.getDerivedClass()) = derivedClass
204234
}
205235

236+
pragma[nomagic]
237+
private predicate loadTotalOverlapValueNumber0(
238+
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber,
239+
boolean isAddress
240+
) {
241+
instr.getEnclosingIRFunction() = irFunc and
242+
instr.getResultIRType() = type and
243+
(
244+
isAddress = true and
245+
tvalueNumberOfOperand(instr.getSourceAddressOperand()) = valueNumber
246+
or
247+
isAddress = false and
248+
tvalueNumber(instr.getSourceValueOperand().getAnyDef()) = valueNumber
249+
)
250+
}
251+
252+
pragma[assume_small_delta]
206253
private predicate loadTotalOverlapValueNumber(
207254
LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber memOperand,
208255
TValueNumber operand
209256
) {
210-
instr.getEnclosingIRFunction() = irFunc and
211-
tvalueNumber(instr.getAnOperand().(MemoryOperand).getAnyDef()) = memOperand and
212-
tvalueNumberOfOperand(instr.getAnOperand().(AddressOperand)) = operand and
213-
instr.getResultIRType() = type
257+
loadTotalOverlapValueNumber0(instr, irFunc, type, operand, true) and
258+
loadTotalOverlapValueNumber0(instr, irFunc, type, memOperand, false)
214259
}
215260

216261
/**

0 commit comments

Comments
 (0)