C++: No CopyValue for immediately discarded exprs

Expressions like the `e` in `e;` or `e, e2`, whose result is immediately
discarded, should not get a synthetic `CopyValue`. This removes a lot of
redundancy from the IR.

To prevent these expressions from being confused with the expressions
from which they get their result, the predicate
`getInstructionConvertedResultExpression` now suppresses results for
expressions that don't produce their own result. This should fix the
mapping between expressions and IR data-flow nodes.
This commit is contained in:
Jonas Jensen
2019-10-23 11:50:58 +02:00
parent cbbe9b4718
commit 7a6ec83572
9 changed files with 1094 additions and 1303 deletions

View File

@@ -49,20 +49,23 @@ private module Cached {
Expr getInstructionConvertedResultExpression(Instruction instruction) {
exists(TranslatedExpr translatedExpr |
translatedExpr = getTranslatedExpr(result) and
instruction = translatedExpr.getResult()
instruction = translatedExpr.getResult() and
// Only associate `instruction` with this expression if the translated
// expression actually produced the instruction; not if it merely
// forwarded the result of another translated expression.
instruction = translatedExpr.getInstruction(_)
)
}
cached
Expr getInstructionUnconvertedResultExpression(Instruction instruction) {
exists(Expr converted, TranslatedExpr translatedExpr |
exists(Expr converted |
result = converted.(Conversion).getExpr+()
or
result = converted
|
not result instanceof Conversion and
translatedExpr = getTranslatedExpr(converted) and
instruction = translatedExpr.getResult()
converted = getInstructionConvertedResultExpression(instruction)
)
}

View File

@@ -2547,27 +2547,45 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr {
// This should ideally be a dispatch predicate on TranslatedNonConstantExpr,
// but it doesn't look monotonic to QL.
predicate exprNeedsCopyIfNotLoaded(Expr expr) {
expr instanceof AssignExpr
or
expr instanceof AssignOperation and
not expr.isPRValueCategory() // is C++
or
expr instanceof PrefixCrementOperation and
not expr.isPRValueCategory() // is C++
or
expr instanceof PointerDereferenceExpr
or
expr instanceof AddressOfExpr
or
expr instanceof BuiltInOperationBuiltInAddressOf
or
// No case for ParenthesisExpr to avoid getting too many instructions
expr instanceof ReferenceDereferenceExpr
or
expr instanceof ReferenceToExpr
or
expr instanceof CommaExpr
or
expr instanceof ConditionDeclExpr
// TODO: simplify TranslatedStmtExpr too
(
expr instanceof AssignExpr
or
expr instanceof AssignOperation and
not expr.isPRValueCategory() // is C++
or
expr instanceof PrefixCrementOperation and
not expr.isPRValueCategory() // is C++
or
expr instanceof PointerDereferenceExpr
or
expr instanceof AddressOfExpr
or
expr instanceof BuiltInOperationBuiltInAddressOf
or
// No case for ParenthesisExpr to avoid getting too many instructions
expr instanceof ReferenceDereferenceExpr
or
expr instanceof ReferenceToExpr
or
expr instanceof CommaExpr
or
expr instanceof ConditionDeclExpr
// TODO: simplify TranslatedStmtExpr too
) and
not exprImmediatelyDiscarded(expr)
}
/**
* Holds if `expr` is immediately discarded. Such expressions do not need a
* `CopyValue` because it's unlikely that anyone is interested in their value.
*/
private predicate exprImmediatelyDiscarded(Expr expr) {
exists(ExprStmt s |
s = expr.getParent() and
not exists(StmtExpr se | s = se.getStmt().(Block).getLastStmt())
)
or
exists(CommaExpr c | c.getLeftOperand() = expr)
or
exists(ForStmt for | for.getUpdate() = expr)
}

View File

@@ -1,24 +1,14 @@
| escape.cpp:108:5:108:11 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:109:5:109:13 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:110:5:110:19 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:111:5:111:21 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:111:18:111:21 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:114:5:114:8 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:115:5:115:29 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:115:19:115:28 | PointerAdd[4] | no_+0:0 | no_+0:0 |
| escape.cpp:115:20:115:23 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:116:5:116:29 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:116:19:116:28 | PointerSub[4] | no_+0:0 | no_+0:0 |
| escape.cpp:116:20:116:23 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:117:5:117:27 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:117:19:117:26 | PointerAdd[4] | no_+0:0 | no_+0:0 |
| escape.cpp:117:23:117:26 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:118:9:118:12 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:120:12:120:15 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:123:14:123:17 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:124:9:124:12 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:124:15:124:18 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:124:21:124:24 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:127:9:127:12 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:129:12:129:15 | CopyValue | no_+0:0 | no_+0:0 |
| escape.cpp:134:5:134:18 | Convert | no_Array+0:0 | no_Array+0:0 |
@@ -27,38 +17,31 @@
| escape.cpp:135:5:135:15 | PointerAdd[4] | no_Array+20:0 | no_Array+20:0 |
| escape.cpp:136:5:136:15 | PointerAdd[4] | no_Array+20:0 | no_Array+20:0 |
| escape.cpp:136:7:136:14 | Convert | no_Array+0:0 | no_Array+0:0 |
| escape.cpp:137:5:137:27 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:137:17:137:24 | Convert | no_Array+0:0 | no_Array+0:0 |
| escape.cpp:137:17:137:27 | PointerAdd[4] | no_Array+20:0 | no_Array+20:0 |
| escape.cpp:138:5:138:27 | CopyValue | no_result+0:0 | no_result+0:0 |
| escape.cpp:138:17:138:27 | PointerAdd[4] | no_Array+20:0 | no_Array+20:0 |
| escape.cpp:138:19:138:26 | Convert | no_Array+0:0 | no_Array+0:0 |
| escape.cpp:140:21:140:32 | FieldAddress[x] | no_Point+0:0 | no_Point+0:0 |
| escape.cpp:140:21:140:32 | FieldAddress[y] | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:140:21:140:32 | FieldAddress[z] | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:141:27:141:27 | FieldAddress[x] | no_Point+0:0 | no_Point+0:0 |
| escape.cpp:142:5:142:21 | CopyValue | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:142:14:142:14 | FieldAddress[y] | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:143:19:143:27 | CopyValue | no_Point+0:0 | no_Point+0:0 |
| escape.cpp:143:31:143:31 | FieldAddress[y] | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:144:5:144:25 | CopyValue | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:144:6:144:14 | CopyValue | no_Point+0:0 | no_Point+0:0 |
| escape.cpp:144:18:144:18 | FieldAddress[y] | no_Point+4:0 | no_Point+4:0 |
| escape.cpp:145:20:145:30 | CopyValue | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:145:30:145:30 | FieldAddress[z] | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:146:5:146:18 | CopyValue | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:146:5:146:25 | CopyValue | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:146:7:146:17 | CopyValue | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:146:17:146:17 | FieldAddress[z] | no_Point+8:0 | no_Point+8:0 |
| escape.cpp:149:5:149:14 | ConvertToBase[Derived : Intermediate1] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:149:5:149:14 | ConvertToBase[Intermediate1 : Base] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:149:5:149:20 | CopyValue | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:149:16:149:16 | FieldAddress[b] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:150:18:150:27 | ConvertToBase[Derived : Intermediate1] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:150:18:150:27 | ConvertToBase[Intermediate1 : Base] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:150:29:150:29 | FieldAddress[b] | no_Derived+0:0 | no_Derived+0:0 |
| escape.cpp:151:5:151:14 | ConvertToBase[Derived : Intermediate2] | no_Derived+12:0 | no_Derived+12:0 |
| escape.cpp:151:5:151:21 | CopyValue | no_Derived+16:0 | no_Derived+16:0 |
| escape.cpp:151:16:151:17 | FieldAddress[i2] | no_Derived+16:0 | no_Derived+16:0 |
| escape.cpp:152:19:152:28 | ConvertToBase[Derived : Intermediate2] | no_Derived+12:0 | no_Derived+12:0 |
| escape.cpp:152:30:152:31 | FieldAddress[i2] | no_Derived+16:0 | no_Derived+16:0 |
@@ -97,9 +80,7 @@
| escape.cpp:217:14:217:16 | CopyValue | c2+0:0 | c2+0:0 |
| escape.cpp:221:8:221:19 | Call | none | c3+0:0 |
| escape.cpp:225:17:225:28 | Call | none | c4+0:0 |
| escape.cpp:247:2:247:27 | CopyValue | no_condTemp+0:0 | no_condTemp+0:0 |
| escape.cpp:247:2:247:27 | Store | condEscape1+0:0 | condEscape1+0:0 |
| escape.cpp:247:16:247:27 | CopyValue | condEscape1+0:0 | condEscape1+0:0 |
| escape.cpp:249:9:249:34 | CopyValue | no_condTemp+0:0 | no_condTemp+0:0 |
| escape.cpp:249:9:249:34 | Store | condEscape2+0:0 | condEscape2+0:0 |
| escape.cpp:249:23:249:34 | CopyValue | condEscape2+0:0 | condEscape2+0:0 |

File diff suppressed because it is too large Load Diff

View File

@@ -214,7 +214,6 @@ ssa.cpp:
# 70| r1_6(glval<char>) = CopyValue : r1_2
# 70| m1_7(char) = Store : &:r1_6, r1_0
# 70| m1_8(unknown) = Chi : total:m3_0, partial:m1_7
# 70| r1_9(glval<char>) = CopyValue : r1_6
#-----| Goto (back edge) -> Block 3
# 71| Block 2
@@ -264,23 +263,20 @@ ssa.cpp:
# 80| r1_0(int) = Constant[3] :
# 80| r1_1(glval<int>) = VariableAddress[x] :
# 80| m1_2(int) = Store : &:r1_1, r1_0
# 80| r1_3(glval<int>) = CopyValue : r1_1
# 81| r1_4(int) = Constant[4] :
# 81| r1_5(glval<int>) = VariableAddress[y] :
# 81| m1_6(int) = Store : &:r1_5, r1_4
# 81| r1_7(glval<int>) = CopyValue : r1_5
# 81| r1_3(int) = Constant[4] :
# 81| r1_4(glval<int>) = VariableAddress[y] :
# 81| m1_5(int) = Store : &:r1_4, r1_3
#-----| Goto -> Block 3
# 84| Block 2
# 84| r2_0(int) = Constant[5] :
# 84| r2_1(glval<int>) = VariableAddress[x] :
# 84| m2_2(int) = Store : &:r2_1, r2_0
# 84| r2_3(glval<int>) = CopyValue : r2_1
#-----| Goto -> Block 3
# 86| Block 3
# 86| m3_0(int) = Phi : from 1:m1_2, from 2:m2_2
# 86| m3_1(int) = Phi : from 1:m1_6, from 2:m0_10
# 86| m3_1(int) = Phi : from 1:m1_5, from 2:m0_10
# 86| r3_2(glval<int>) = VariableAddress[x_merge] :
# 86| r3_3(glval<int>) = VariableAddress[x] :
# 86| r3_4(int) = Load : &:r3_3, m3_0
@@ -501,7 +497,6 @@ ssa.cpp:
# 125| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 125| m1_4(int) = Store : &:r1_3, r1_1
# 125| m1_5(Point) = Chi : total:m0_18, partial:m1_4
# 125| r1_6(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 128| Block 2
@@ -511,7 +506,6 @@ ssa.cpp:
# 128| r2_3(glval<int>) = FieldAddress[x] : r2_2
# 128| m2_4(int) = Store : &:r2_3, r2_1
# 128| m2_5(Point) = Chi : total:m0_18, partial:m2_4
# 128| r2_6(glval<int>) = CopyValue : r2_3
#-----| Goto -> Block 3
# 130| Block 3
@@ -565,7 +559,6 @@ ssa.cpp:
# 137| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 137| m1_4(int) = Store : &:r1_3, r1_1
# 137| m1_5(Point) = Chi : total:m0_18, partial:m1_4
# 137| r1_6(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 140| Block 2
@@ -573,7 +566,6 @@ ssa.cpp:
# 140| r2_1(Point) = Load : &:r2_0, m0_6
# 140| r2_2(glval<Point>) = VariableAddress[a] :
# 140| m2_3(Point) = Store : &:r2_2, r2_1
# 140| r2_4(glval<Point>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 142| Block 3
@@ -623,7 +615,6 @@ ssa.cpp:
# 148| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 148| m1_4(int) = Store : &:r1_3, r1_1
# 148| m1_5(Point) = Chi : total:m0_18, partial:m1_4
# 148| r1_6(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 151| Block 2
@@ -631,7 +622,6 @@ ssa.cpp:
# 151| r2_1(Point) = Load : &:r2_0, m0_6
# 151| r2_2(glval<Point>) = VariableAddress[a] :
# 151| m2_3(Point) = Store : &:r2_2, r2_1
# 151| r2_4(glval<Point>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 153| Block 3
@@ -680,7 +670,6 @@ ssa.cpp:
# 159| r1_4(glval<int>) = FieldAddress[x] : r1_3
# 159| m1_5(int) = Store : &:r1_4, r1_1
# 159| m1_6(Rect) = Chi : total:m0_18, partial:m1_5
# 159| r1_7(glval<int>) = CopyValue : r1_4
#-----| Goto -> Block 3
# 162| Block 2
@@ -688,7 +677,6 @@ ssa.cpp:
# 162| r2_1(Rect) = Load : &:r2_0, m0_6
# 162| r2_2(glval<Rect>) = VariableAddress[a] :
# 162| m2_3(Rect) = Store : &:r2_2, r2_1
# 162| r2_4(glval<Rect>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 164| Block 3
@@ -723,22 +711,19 @@ ssa.cpp:
# 174| r0_15(glval<Wrapper>) = VariableAddress[w] :
# 174| r0_16(glval<int>) = FieldAddress[f] : r0_15
# 174| m0_17(int) = Store : &:r0_16, r0_14
# 174| r0_18(glval<int>) = CopyValue : r0_16
# 175| r0_19(glval<Wrapper>) = VariableAddress[w] :
# 175| r0_20(glval<int>) = FieldAddress[f] : r0_19
# 175| r0_21(int) = Load : &:r0_20, m0_17
# 175| r0_22(glval<int>) = VariableAddress[a] :
# 175| m0_23(int) = Store : &:r0_22, r0_21
# 175| r0_24(glval<int>) = CopyValue : r0_22
# 176| r0_25(glval<Wrapper>) = VariableAddress[w] :
# 176| r0_26(Wrapper) = Load : &:r0_25, ~m0_17
# 176| r0_27(glval<Wrapper>) = VariableAddress[x] :
# 176| m0_28(Wrapper) = Store : &:r0_27, r0_26
# 176| r0_29(glval<Wrapper>) = CopyValue : r0_27
# 177| v0_30(void) = NoOp :
# 171| v0_31(void) = ReturnVoid :
# 171| v0_32(void) = UnmodeledUse : mu*
# 171| v0_33(void) = ExitFunction :
# 175| r0_18(glval<Wrapper>) = VariableAddress[w] :
# 175| r0_19(glval<int>) = FieldAddress[f] : r0_18
# 175| r0_20(int) = Load : &:r0_19, m0_17
# 175| r0_21(glval<int>) = VariableAddress[a] :
# 175| m0_22(int) = Store : &:r0_21, r0_20
# 176| r0_23(glval<Wrapper>) = VariableAddress[w] :
# 176| r0_24(Wrapper) = Load : &:r0_23, ~m0_17
# 176| r0_25(glval<Wrapper>) = VariableAddress[x] :
# 176| m0_26(Wrapper) = Store : &:r0_25, r0_24
# 177| v0_27(void) = NoOp :
# 171| v0_28(void) = ReturnVoid :
# 171| v0_29(void) = UnmodeledUse : mu*
# 171| v0_30(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -819,24 +804,22 @@ ssa.cpp:
# 200| r0_27(int) = Load : &:r0_26, m0_19
# 200| r0_28(int) = Add : r0_27, r0_24
# 200| m0_29(int) = Store : &:r0_26, r0_28
# 200| r0_30(glval<int>) = CopyValue : r0_26
# 201| r0_31(glval<unknown>) = FunctionAddress[abs] :
# 201| r0_32(glval<int>) = VariableAddress[x] :
# 201| r0_33(int) = Load : &:r0_32, m0_8
# 201| r0_34(int) = Call : func:r0_31, 0:r0_33
# 201| r0_35(glval<int>) = VariableAddress[ret] :
# 201| r0_36(int) = Load : &:r0_35, m0_29
# 201| r0_37(int) = Add : r0_36, r0_34
# 201| m0_38(int) = Store : &:r0_35, r0_37
# 201| r0_39(glval<int>) = CopyValue : r0_35
# 202| r0_40(glval<int>) = VariableAddress[#return] :
# 202| r0_41(glval<int>) = VariableAddress[ret] :
# 202| r0_42(int) = Load : &:r0_41, m0_38
# 202| m0_43(int) = Store : &:r0_40, r0_42
# 198| r0_44(glval<int>) = VariableAddress[#return] :
# 198| v0_45(void) = ReturnValue : &:r0_44, m0_43
# 198| v0_46(void) = UnmodeledUse : mu*
# 198| v0_47(void) = ExitFunction :
# 201| r0_30(glval<unknown>) = FunctionAddress[abs] :
# 201| r0_31(glval<int>) = VariableAddress[x] :
# 201| r0_32(int) = Load : &:r0_31, m0_8
# 201| r0_33(int) = Call : func:r0_30, 0:r0_32
# 201| r0_34(glval<int>) = VariableAddress[ret] :
# 201| r0_35(int) = Load : &:r0_34, m0_29
# 201| r0_36(int) = Add : r0_35, r0_33
# 201| m0_37(int) = Store : &:r0_34, r0_36
# 202| r0_38(glval<int>) = VariableAddress[#return] :
# 202| r0_39(glval<int>) = VariableAddress[ret] :
# 202| r0_40(int) = Load : &:r0_39, m0_37
# 202| m0_41(int) = Store : &:r0_38, r0_40
# 198| r0_42(glval<int>) = VariableAddress[#return] :
# 198| v0_43(void) = ReturnValue : &:r0_42, m0_41
# 198| v0_44(void) = UnmodeledUse : mu*
# 198| v0_45(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0

View File

@@ -216,7 +216,6 @@ ssa.cpp:
# 70| m1_5(char *) = Store : &:r1_1, r1_4
# 70| r1_6(glval<char>) = CopyValue : r1_2
# 70| mu1_7(char) = Store : &:r1_6, r1_0
# 70| r1_8(glval<char>) = CopyValue : r1_6
#-----| Goto (back edge) -> Block 3
# 71| Block 2
@@ -265,23 +264,20 @@ ssa.cpp:
# 80| r1_0(int) = Constant[3] :
# 80| r1_1(glval<int>) = VariableAddress[x] :
# 80| m1_2(int) = Store : &:r1_1, r1_0
# 80| r1_3(glval<int>) = CopyValue : r1_1
# 81| r1_4(int) = Constant[4] :
# 81| r1_5(glval<int>) = VariableAddress[y] :
# 81| m1_6(int) = Store : &:r1_5, r1_4
# 81| r1_7(glval<int>) = CopyValue : r1_5
# 81| r1_3(int) = Constant[4] :
# 81| r1_4(glval<int>) = VariableAddress[y] :
# 81| m1_5(int) = Store : &:r1_4, r1_3
#-----| Goto -> Block 3
# 84| Block 2
# 84| r2_0(int) = Constant[5] :
# 84| r2_1(glval<int>) = VariableAddress[x] :
# 84| m2_2(int) = Store : &:r2_1, r2_0
# 84| r2_3(glval<int>) = CopyValue : r2_1
#-----| Goto -> Block 3
# 86| Block 3
# 86| m3_0(int) = Phi : from 1:m1_2, from 2:m2_2
# 86| m3_1(int) = Phi : from 1:m1_6, from 2:m0_10
# 86| m3_1(int) = Phi : from 1:m1_5, from 2:m0_10
# 86| r3_2(glval<int>) = VariableAddress[x_merge] :
# 86| r3_3(glval<int>) = VariableAddress[x] :
# 86| r3_4(int) = Load : &:r3_3, m3_0
@@ -486,7 +482,6 @@ ssa.cpp:
# 125| r1_2(glval<Point>) = VariableAddress[a] :
# 125| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 125| mu1_4(int) = Store : &:r1_3, r1_1
# 125| r1_5(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 128| Block 2
@@ -495,7 +490,6 @@ ssa.cpp:
# 128| r2_2(glval<Point>) = VariableAddress[a] :
# 128| r2_3(glval<int>) = FieldAddress[x] : r2_2
# 128| mu2_4(int) = Store : &:r2_3, r2_1
# 128| r2_5(glval<int>) = CopyValue : r2_3
#-----| Goto -> Block 3
# 130| Block 3
@@ -544,7 +538,6 @@ ssa.cpp:
# 137| r1_2(glval<Point>) = VariableAddress[a] :
# 137| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 137| mu1_4(int) = Store : &:r1_3, r1_1
# 137| r1_5(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 140| Block 2
@@ -552,7 +545,6 @@ ssa.cpp:
# 140| r2_1(Point) = Load : &:r2_0, m0_6
# 140| r2_2(glval<Point>) = VariableAddress[a] :
# 140| mu2_3(Point) = Store : &:r2_2, r2_1
# 140| r2_4(glval<Point>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 142| Block 3
@@ -597,7 +589,6 @@ ssa.cpp:
# 148| r1_2(glval<Point>) = VariableAddress[a] :
# 148| r1_3(glval<int>) = FieldAddress[x] : r1_2
# 148| mu1_4(int) = Store : &:r1_3, r1_1
# 148| r1_5(glval<int>) = CopyValue : r1_3
#-----| Goto -> Block 3
# 151| Block 2
@@ -605,7 +596,6 @@ ssa.cpp:
# 151| r2_1(Point) = Load : &:r2_0, m0_6
# 151| r2_2(glval<Point>) = VariableAddress[a] :
# 151| mu2_3(Point) = Store : &:r2_2, r2_1
# 151| r2_4(glval<Point>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 153| Block 3
@@ -650,7 +640,6 @@ ssa.cpp:
# 159| r1_3(glval<Point>) = FieldAddress[topLeft] : r1_2
# 159| r1_4(glval<int>) = FieldAddress[x] : r1_3
# 159| mu1_5(int) = Store : &:r1_4, r1_1
# 159| r1_6(glval<int>) = CopyValue : r1_4
#-----| Goto -> Block 3
# 162| Block 2
@@ -658,7 +647,6 @@ ssa.cpp:
# 162| r2_1(Rect) = Load : &:r2_0, m0_6
# 162| r2_2(glval<Rect>) = VariableAddress[a] :
# 162| mu2_3(Rect) = Store : &:r2_2, r2_1
# 162| r2_4(glval<Rect>) = CopyValue : r2_2
#-----| Goto -> Block 3
# 164| Block 3
@@ -692,22 +680,19 @@ ssa.cpp:
# 174| r0_15(glval<Wrapper>) = VariableAddress[w] :
# 174| r0_16(glval<int>) = FieldAddress[f] : r0_15
# 174| mu0_17(int) = Store : &:r0_16, r0_14
# 174| r0_18(glval<int>) = CopyValue : r0_16
# 175| r0_19(glval<Wrapper>) = VariableAddress[w] :
# 175| r0_20(glval<int>) = FieldAddress[f] : r0_19
# 175| r0_21(int) = Load : &:r0_20, ~mu0_2
# 175| r0_22(glval<int>) = VariableAddress[a] :
# 175| m0_23(int) = Store : &:r0_22, r0_21
# 175| r0_24(glval<int>) = CopyValue : r0_22
# 176| r0_25(glval<Wrapper>) = VariableAddress[w] :
# 176| r0_26(Wrapper) = Load : &:r0_25, ~mu0_2
# 176| r0_27(glval<Wrapper>) = VariableAddress[x] :
# 176| m0_28(Wrapper) = Store : &:r0_27, r0_26
# 176| r0_29(glval<Wrapper>) = CopyValue : r0_27
# 177| v0_30(void) = NoOp :
# 171| v0_31(void) = ReturnVoid :
# 171| v0_32(void) = UnmodeledUse : mu*
# 171| v0_33(void) = ExitFunction :
# 175| r0_18(glval<Wrapper>) = VariableAddress[w] :
# 175| r0_19(glval<int>) = FieldAddress[f] : r0_18
# 175| r0_20(int) = Load : &:r0_19, ~mu0_2
# 175| r0_21(glval<int>) = VariableAddress[a] :
# 175| m0_22(int) = Store : &:r0_21, r0_20
# 176| r0_23(glval<Wrapper>) = VariableAddress[w] :
# 176| r0_24(Wrapper) = Load : &:r0_23, ~mu0_2
# 176| r0_25(glval<Wrapper>) = VariableAddress[x] :
# 176| m0_26(Wrapper) = Store : &:r0_25, r0_24
# 177| v0_27(void) = NoOp :
# 171| v0_28(void) = ReturnVoid :
# 171| v0_29(void) = UnmodeledUse : mu*
# 171| v0_30(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -782,24 +767,22 @@ ssa.cpp:
# 200| r0_27(int) = Load : &:r0_26, m0_19
# 200| r0_28(int) = Add : r0_27, r0_24
# 200| m0_29(int) = Store : &:r0_26, r0_28
# 200| r0_30(glval<int>) = CopyValue : r0_26
# 201| r0_31(glval<unknown>) = FunctionAddress[abs] :
# 201| r0_32(glval<int>) = VariableAddress[x] :
# 201| r0_33(int) = Load : &:r0_32, m0_8
# 201| r0_34(int) = Call : func:r0_31, 0:r0_33
# 201| r0_35(glval<int>) = VariableAddress[ret] :
# 201| r0_36(int) = Load : &:r0_35, m0_29
# 201| r0_37(int) = Add : r0_36, r0_34
# 201| m0_38(int) = Store : &:r0_35, r0_37
# 201| r0_39(glval<int>) = CopyValue : r0_35
# 202| r0_40(glval<int>) = VariableAddress[#return] :
# 202| r0_41(glval<int>) = VariableAddress[ret] :
# 202| r0_42(int) = Load : &:r0_41, m0_38
# 202| m0_43(int) = Store : &:r0_40, r0_42
# 198| r0_44(glval<int>) = VariableAddress[#return] :
# 198| v0_45(void) = ReturnValue : &:r0_44, m0_43
# 198| v0_46(void) = UnmodeledUse : mu*
# 198| v0_47(void) = ExitFunction :
# 201| r0_30(glval<unknown>) = FunctionAddress[abs] :
# 201| r0_31(glval<int>) = VariableAddress[x] :
# 201| r0_32(int) = Load : &:r0_31, m0_8
# 201| r0_33(int) = Call : func:r0_30, 0:r0_32
# 201| r0_34(glval<int>) = VariableAddress[ret] :
# 201| r0_35(int) = Load : &:r0_34, m0_29
# 201| r0_36(int) = Add : r0_35, r0_33
# 201| m0_37(int) = Store : &:r0_34, r0_36
# 202| r0_38(glval<int>) = VariableAddress[#return] :
# 202| r0_39(glval<int>) = VariableAddress[ret] :
# 202| r0_40(int) = Load : &:r0_39, m0_37
# 202| m0_41(int) = Store : &:r0_38, r0_40
# 198| r0_42(glval<int>) = VariableAddress[#return] :
# 198| v0_43(void) = ReturnValue : &:r0_42, m0_41
# 198| v0_44(void) = UnmodeledUse : mu*
# 198| v0_45(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0

View File

@@ -26,7 +26,7 @@ instructionWithoutSuccessor
| ms_try_mix.cpp:28:12:28:15 | Chi: call to C |
| ms_try_mix.cpp:48:10:48:13 | Chi: call to C |
| pointer_to_member.cpp:36:11:36:30 | FieldAddress: {...} |
| stmt_expr.cpp:27:5:27:15 | CopyValue: ... = ... |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... |
| vla.c:5:9:5:14 | Uninitialized: definition of matrix |
| vla.c:11:6:11:16 | UnmodeledDefinition: vla_typedef |
ambiguousSuccessors

View File

@@ -4,7 +4,6 @@ missingOperand
| condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | IR: misc3 | void misc3() |
| misc.c:220:3:223:3 | CopyValue: ... = ... | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
| misc.c:220:3:223:3 | Store: ... = ... | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
@@ -49,13 +48,13 @@ instructionWithoutSuccessor
| misc.c:222:10:222:10 | Store: 2 |
| ms_assume.cpp:20:12:20:12 | Constant: (bool)... |
| ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x |
| ms_try_except.cpp:7:13:7:17 | CopyValue: ... = ... |
| ms_try_except.cpp:7:13:7:17 | Store: ... = ... |
| ms_try_except.cpp:9:19:9:19 | Load: j |
| ms_try_except.cpp:10:13:10:17 | CopyValue: ... = ... |
| ms_try_except.cpp:14:13:14:17 | CopyValue: ... = ... |
| ms_try_except.cpp:17:13:17:17 | CopyValue: ... = ... |
| ms_try_except.cpp:10:13:10:17 | Store: ... = ... |
| ms_try_except.cpp:14:13:14:17 | Store: ... = ... |
| ms_try_except.cpp:17:13:17:17 | Store: ... = ... |
| ms_try_except.cpp:19:17:19:21 | Sub: ... - ... |
| ms_try_except.cpp:20:9:20:13 | CopyValue: ... = ... |
| ms_try_except.cpp:20:9:20:13 | Store: ... = ... |
| ms_try_mix.cpp:11:12:11:15 | CallSideEffect: call to C |
| ms_try_mix.cpp:16:13:16:19 | ThrowValue: throw ... |
| ms_try_mix.cpp:18:16:18:19 | CallSideEffect: call to C |
@@ -77,7 +76,7 @@ instructionWithoutSuccessor
| static_init_templates.cpp:97:27:97:36 | Convert: (void *)... |
| static_init_templates.cpp:105:27:105:27 | Constant: (void *)... |
| static_init_templates.cpp:105:27:105:27 | Constant: (void *)... |
| stmt_expr.cpp:27:5:27:15 | CopyValue: ... = ... |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... |
| stmt_expr.cpp:29:11:32:11 | CopyValue: (statement expression) |
| stmt_in_type.cpp:5:53:5:53 | Constant: 1 |
| vla.c:5:9:5:14 | Uninitialized: definition of matrix |

View File

@@ -35,7 +35,7 @@ instructionWithoutSuccessor
| ms_try_mix.cpp:28:12:28:15 | CallSideEffect: call to C |
| ms_try_mix.cpp:48:10:48:13 | CallSideEffect: call to C |
| pointer_to_member.cpp:36:11:36:30 | FieldAddress: {...} |
| stmt_expr.cpp:27:5:27:15 | CopyValue: ... = ... |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... |
| vla.c:5:9:5:14 | Uninitialized: definition of matrix |
| vla.c:11:6:11:16 | UnmodeledDefinition: vla_typedef |
ambiguousSuccessors