From 523fc9c1ceabb4b0ced148c3a83def6b72ece64f Mon Sep 17 00:00:00 2001 From: Jonas Jensen Date: Tue, 9 Jul 2019 15:29:30 +0200 Subject: [PATCH] C++ IR: make `isInCycle` fast Without this `pragma[noopt]`, `isInCycle` gets compiled into RA that unpacks every tuple of the fast TC: 0 ~0% {2} r1 = SELECT #Operand::getNonPhiOperandDef#3#ffPlus ON FIELDS #Operand::getNonPhiOperandDef#3#ffPlus.<0>=#Operand::getNonPhiOperandDef#3#ffPlus.<1> 0 ~0% {1} r2 = SCAN r1 OUTPUT FIELDS {r1.<0>} return r2 With this change, it just becomes one lookup in the fast TC data structure per instruction. --- .../semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll | 2 ++ cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll | 2 ++ .../semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll | 2 ++ 3 files changed, 6 insertions(+) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll index 1f20a2c1677..8cebecae678 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll @@ -35,7 +35,9 @@ private Instruction getNonPhiOperandDef(Instruction instr) { * analyses that assume a cycle-free graph of non-phi operands. Therefore it's * better to remove these operands than to leave cycles in the operand graph. */ +pragma[noopt] private predicate isInCycle(Instruction instr) { + instr instanceof Instruction and getNonPhiOperandDef+(instr) = instr } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll index 1f20a2c1677..8cebecae678 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll @@ -35,7 +35,9 @@ private Instruction getNonPhiOperandDef(Instruction instr) { * analyses that assume a cycle-free graph of non-phi operands. Therefore it's * better to remove these operands than to leave cycles in the operand graph. */ +pragma[noopt] private predicate isInCycle(Instruction instr) { + instr instanceof Instruction and getNonPhiOperandDef+(instr) = instr } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll index 1f20a2c1677..8cebecae678 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll @@ -35,7 +35,9 @@ private Instruction getNonPhiOperandDef(Instruction instr) { * analyses that assume a cycle-free graph of non-phi operands. Therefore it's * better to remove these operands than to leave cycles in the operand graph. */ +pragma[noopt] private predicate isInCycle(Instruction instr) { + instr instanceof Instruction and getNonPhiOperandDef+(instr) = instr }