C++: failing test for non-conflated escaped var

This commit is contained in:
Jonas Jensen
2020-03-24 13:24:31 +01:00
parent 29c4c8c0b2
commit 95a8dcb3fd
6 changed files with 227 additions and 1 deletions

View File

@@ -1287,3 +1287,61 @@ ssa.cpp:
# 268| v268_16(void) = UnmodeledUse : mu*
# 268| v268_17(void) = AliasedUse : ~m270_11
# 268| v268_18(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
# 275| v275_1(void) = EnterFunction :
# 275| m275_2(unknown) = AliasedDefinition :
# 275| m275_3(unknown) = InitializeNonLocal :
# 275| m275_4(unknown) = Chi : total:m275_2, partial:m275_3
# 275| mu275_5(unknown) = UnmodeledDefinition :
# 275| r275_6(glval<bool>) = VariableAddress[c] :
# 275| m275_7(bool) = InitializeParameter[c] : &:r275_6
# 275| r275_8(glval<Point>) = VariableAddress[p] :
# 275| m275_9(Point) = InitializeParameter[p] : &:r275_8
# 275| r275_10(glval<int>) = VariableAddress[x1] :
# 275| m275_11(int) = InitializeParameter[x1] : &:r275_10
# 276| r276_1(glval<Point>) = VariableAddress[a] :
# 276| m276_2(Point) = Uninitialized[a] : &:r276_1
# 276| m276_3(unknown) = Chi : total:m275_4, partial:m276_2
# 276| r276_4(glval<int>) = FieldAddress[x] : r276_1
# 276| r276_5(int) = Constant[0] :
# 276| m276_6(int) = Store : &:r276_4, r276_5
# 276| m276_7(unknown) = Chi : total:m276_3, partial:m276_6
# 276| r276_8(glval<int>) = FieldAddress[y] : r276_1
# 276| r276_9(int) = Constant[0] :
# 276| m276_10(int) = Store : &:r276_8, r276_9
# 276| m276_11(unknown) = Chi : total:m276_7, partial:m276_10
# 277| r277_1(glval<Point>) = VariableAddress[a] :
# 277| r277_2(Point *) = CopyValue : r277_1
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
# 277| m277_4(Point *) = Store : &:r277_3, r277_2
# 277| m277_5(unknown) = Chi : total:m276_11, partial:m277_4
# 278| r278_1(glval<bool>) = VariableAddress[c] :
# 278| r278_2(bool) = Load : &:r278_1, m275_7
# 278| v278_3(void) = ConditionalBranch : r278_2
#-----| False -> Block 2
#-----| True -> Block 1
# 279| Block 1
# 279| r279_1(glval<int>) = VariableAddress[x1] :
# 279| r279_2(int) = Load : &:r279_1, m275_11
# 279| r279_3(glval<Point>) = VariableAddress[a] :
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
# 279| m279_5(int) = Store : &:r279_4, r279_2
# 279| m279_6(unknown) = Chi : total:m277_5, partial:m279_5
#-----| Goto -> Block 2
# 281| Block 2
# 281| m281_1(int) = Phi : from 0:m276_6, from 1:m279_5
# 281| m281_2(unknown) = Phi : from 0:~m277_5, from 1:~m279_6
# 281| r281_3(glval<int>) = VariableAddress[x] :
# 281| r281_4(glval<Point>) = VariableAddress[a] :
# 281| r281_5(glval<int>) = FieldAddress[x] : r281_4
# 281| r281_6(int) = Load : &:r281_5, m281_1
# 281| m281_7(int) = Store : &:r281_3, r281_6
# 282| v282_1(void) = NoOp :
# 275| v275_12(void) = ReturnVoid :
# 275| v275_13(void) = UnmodeledUse : mu*
# 275| v275_14(void) = AliasedUse : ~m281_2
# 275| v275_15(void) = ExitFunction :

View File

@@ -1277,3 +1277,60 @@ ssa.cpp:
# 268| v268_15(void) = UnmodeledUse : mu*
# 268| v268_16(void) = AliasedUse : ~m269_7
# 268| v268_17(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
# 275| v275_1(void) = EnterFunction :
# 275| m275_2(unknown) = AliasedDefinition :
# 275| m275_3(unknown) = InitializeNonLocal :
# 275| m275_4(unknown) = Chi : total:m275_2, partial:m275_3
# 275| mu275_5(unknown) = UnmodeledDefinition :
# 275| r275_6(glval<bool>) = VariableAddress[c] :
# 275| m275_7(bool) = InitializeParameter[c] : &:r275_6
# 275| r275_8(glval<Point>) = VariableAddress[p] :
# 275| m275_9(Point) = InitializeParameter[p] : &:r275_8
# 275| r275_10(glval<int>) = VariableAddress[x1] :
# 275| m275_11(int) = InitializeParameter[x1] : &:r275_10
# 276| r276_1(glval<Point>) = VariableAddress[a] :
# 276| m276_2(Point) = Uninitialized[a] : &:r276_1
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
# 276| r276_4(int) = Constant[0] :
# 276| m276_5(int) = Store : &:r276_3, r276_4
# 276| m276_6(Point) = Chi : total:m276_2, partial:m276_5
# 276| r276_7(glval<int>) = FieldAddress[y] : r276_1
# 276| r276_8(int) = Constant[0] :
# 276| m276_9(int) = Store : &:r276_7, r276_8
# 276| m276_10(Point) = Chi : total:m276_6, partial:m276_9
# 277| r277_1(glval<Point>) = VariableAddress[a] :
# 277| r277_2(Point *) = CopyValue : r277_1
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
# 277| m277_4(Point *) = Store : &:r277_3, r277_2
# 277| m277_5(unknown) = Chi : total:m275_4, partial:m277_4
# 278| r278_1(glval<bool>) = VariableAddress[c] :
# 278| r278_2(bool) = Load : &:r278_1, m275_7
# 278| v278_3(void) = ConditionalBranch : r278_2
#-----| False -> Block 2
#-----| True -> Block 1
# 279| Block 1
# 279| r279_1(glval<int>) = VariableAddress[x1] :
# 279| r279_2(int) = Load : &:r279_1, m275_11
# 279| r279_3(glval<Point>) = VariableAddress[a] :
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
# 279| m279_5(int) = Store : &:r279_4, r279_2
# 279| m279_6(Point) = Chi : total:m276_10, partial:m279_5
#-----| Goto -> Block 2
# 281| Block 2
# 281| m281_1(int) = Phi : from 0:m276_5, from 1:m279_5
# 281| m281_2(Point) = Phi : from 0:m276_10, from 1:m279_6
# 281| r281_3(glval<int>) = VariableAddress[x] :
# 281| r281_4(glval<Point>) = VariableAddress[a] :
# 281| r281_5(glval<int>) = FieldAddress[x] : r281_4
# 281| r281_6(int) = Load : &:r281_5, m281_1
# 281| m281_7(int) = Store : &:r281_3, r281_6
# 282| v282_1(void) = NoOp :
# 275| v275_12(void) = ReturnVoid :
# 275| v275_13(void) = UnmodeledUse : mu*
# 275| v275_14(void) = AliasedUse : ~m277_5
# 275| v275_15(void) = ExitFunction :

View File

@@ -18,6 +18,7 @@ useNotDominatedByDefinition
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated
| ssa.cpp:281:7:281:7 | Phi: definition of x |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

View File

@@ -269,4 +269,14 @@ void *MallocAliasing(void *s, int size) {
void *buf = malloc(size);
memcpy(buf, s, size);
return buf;
}
}
Point *pp;
void EscapedButNotConflated(bool c, Point p, int x1) {
Point a = {};
pp = &a; // `a` escapes here and therefore belongs to the aliased vvar
if (c) {
a.x = x1;
}
int x = a.x; // The phi node here is not conflated
}

View File

@@ -1188,3 +1188,53 @@ ssa.cpp:
# 268| v268_14(void) = UnmodeledUse : mu*
# 268| v268_15(void) = AliasedUse : ~mu268_4
# 268| v268_16(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
# 275| v275_1(void) = EnterFunction :
# 275| mu275_2(unknown) = AliasedDefinition :
# 275| mu275_3(unknown) = InitializeNonLocal :
# 275| mu275_4(unknown) = UnmodeledDefinition :
# 275| r275_5(glval<bool>) = VariableAddress[c] :
# 275| m275_6(bool) = InitializeParameter[c] : &:r275_5
# 275| r275_7(glval<Point>) = VariableAddress[p] :
# 275| m275_8(Point) = InitializeParameter[p] : &:r275_7
# 275| r275_9(glval<int>) = VariableAddress[x1] :
# 275| m275_10(int) = InitializeParameter[x1] : &:r275_9
# 276| r276_1(glval<Point>) = VariableAddress[a] :
# 276| mu276_2(Point) = Uninitialized[a] : &:r276_1
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
# 276| r276_4(int) = Constant[0] :
# 276| mu276_5(int) = Store : &:r276_3, r276_4
# 276| r276_6(glval<int>) = FieldAddress[y] : r276_1
# 276| r276_7(int) = Constant[0] :
# 276| mu276_8(int) = Store : &:r276_6, r276_7
# 277| r277_1(glval<Point>) = VariableAddress[a] :
# 277| r277_2(Point *) = CopyValue : r277_1
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
# 277| mu277_4(Point *) = Store : &:r277_3, r277_2
# 278| r278_1(glval<bool>) = VariableAddress[c] :
# 278| r278_2(bool) = Load : &:r278_1, m275_6
# 278| v278_3(void) = ConditionalBranch : r278_2
#-----| False -> Block 2
#-----| True -> Block 1
# 279| Block 1
# 279| r279_1(glval<int>) = VariableAddress[x1] :
# 279| r279_2(int) = Load : &:r279_1, m275_10
# 279| r279_3(glval<Point>) = VariableAddress[a] :
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
# 279| mu279_5(int) = Store : &:r279_4, r279_2
#-----| Goto -> Block 2
# 281| Block 2
# 281| r281_1(glval<int>) = VariableAddress[x] :
# 281| r281_2(glval<Point>) = VariableAddress[a] :
# 281| r281_3(glval<int>) = FieldAddress[x] : r281_2
# 281| r281_4(int) = Load : &:r281_3, ~mu275_4
# 281| m281_5(int) = Store : &:r281_1, r281_4
# 282| v282_1(void) = NoOp :
# 275| v275_11(void) = ReturnVoid :
# 275| v275_12(void) = UnmodeledUse : mu*
# 275| v275_13(void) = AliasedUse : ~mu275_4
# 275| v275_14(void) = ExitFunction :

View File

@@ -1188,3 +1188,53 @@ ssa.cpp:
# 268| v268_14(void) = UnmodeledUse : mu*
# 268| v268_15(void) = AliasedUse : ~mu268_4
# 268| v268_16(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
# 275| v275_1(void) = EnterFunction :
# 275| mu275_2(unknown) = AliasedDefinition :
# 275| mu275_3(unknown) = InitializeNonLocal :
# 275| mu275_4(unknown) = UnmodeledDefinition :
# 275| r275_5(glval<bool>) = VariableAddress[c] :
# 275| m275_6(bool) = InitializeParameter[c] : &:r275_5
# 275| r275_7(glval<Point>) = VariableAddress[p] :
# 275| m275_8(Point) = InitializeParameter[p] : &:r275_7
# 275| r275_9(glval<int>) = VariableAddress[x1] :
# 275| m275_10(int) = InitializeParameter[x1] : &:r275_9
# 276| r276_1(glval<Point>) = VariableAddress[a] :
# 276| mu276_2(Point) = Uninitialized[a] : &:r276_1
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
# 276| r276_4(int) = Constant[0] :
# 276| mu276_5(int) = Store : &:r276_3, r276_4
# 276| r276_6(glval<int>) = FieldAddress[y] : r276_1
# 276| r276_7(int) = Constant[0] :
# 276| mu276_8(int) = Store : &:r276_6, r276_7
# 277| r277_1(glval<Point>) = VariableAddress[a] :
# 277| r277_2(Point *) = CopyValue : r277_1
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
# 277| mu277_4(Point *) = Store : &:r277_3, r277_2
# 278| r278_1(glval<bool>) = VariableAddress[c] :
# 278| r278_2(bool) = Load : &:r278_1, m275_6
# 278| v278_3(void) = ConditionalBranch : r278_2
#-----| False -> Block 2
#-----| True -> Block 1
# 279| Block 1
# 279| r279_1(glval<int>) = VariableAddress[x1] :
# 279| r279_2(int) = Load : &:r279_1, m275_10
# 279| r279_3(glval<Point>) = VariableAddress[a] :
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
# 279| mu279_5(int) = Store : &:r279_4, r279_2
#-----| Goto -> Block 2
# 281| Block 2
# 281| r281_1(glval<int>) = VariableAddress[x] :
# 281| r281_2(glval<Point>) = VariableAddress[a] :
# 281| r281_3(glval<int>) = FieldAddress[x] : r281_2
# 281| r281_4(int) = Load : &:r281_3, ~mu275_4
# 281| m281_5(int) = Store : &:r281_1, r281_4
# 282| v282_1(void) = NoOp :
# 275| v275_11(void) = ReturnVoid :
# 275| v275_12(void) = UnmodeledUse : mu*
# 275| v275_13(void) = AliasedUse : ~mu275_4
# 275| v275_14(void) = ExitFunction :