C++: only generate uninits when needed

This commit is contained in:
Robert Marsh
2019-11-07 13:55:49 -08:00
parent 81ad11090e
commit ae1377447e
5 changed files with 158 additions and 164 deletions

View File

@@ -121,7 +121,7 @@ abstract class TranslatedVariableDeclaration extends TranslatedElement, Initiali
private predicate hasUninitializedInstruction() {
not exists(getInitialization()) or
getInitialization() instanceof TranslatedListInitialization or
getInitialization() instanceof TranslatedStringLiteralInitialization
getInitialization().(TranslatedStringLiteralInitialization).zeroInitRange(_, _)
}
}

View File

@@ -340,7 +340,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
* Holds if the `elementCount` array elements starting at `startIndex` must be
* zero initialized.
*/
private predicate zeroInitRange(int startIndex, int elementCount) {
predicate zeroInitRange(int startIndex, int elementCount) {
exists(int targetCount |
startIndex = expr.getUnspecifiedType().(ArrayType).getArraySize() and
targetCount = getContext().getTargetType().getUnspecifiedType().(ArrayType).getArraySize() and

View File

@@ -2675,58 +2675,56 @@ ir.cpp:
# 572| r0_10(glval<char>) = PointerAdd[1] : r0_3, r0_9
# 572| mu0_11(unknown[31]) = Store : &:r0_10, r0_8
# 573| r0_12(glval<char[4]>) = VariableAddress[a_nopad] :
# 573| mu0_13(char[4]) = Uninitialized[a_nopad] : &:r0_12
# 573| r0_14(glval<char[4]>) = StringConstant["foo"] :
# 573| r0_15(char[4]) = Load : &:r0_14, ~mu0_2
# 573| mu0_16(char[4]) = Store : &:r0_12, r0_15
# 574| r0_17(glval<char[5]>) = VariableAddress[a_infer] :
# 574| mu0_18(char[5]) = Uninitialized[a_infer] : &:r0_17
# 574| r0_19(glval<char[5]>) = StringConstant["blah"] :
# 574| r0_20(char[5]) = Load : &:r0_19, ~mu0_2
# 574| mu0_21(char[5]) = Store : &:r0_17, r0_20
# 575| r0_22(glval<char[2]>) = VariableAddress[b] :
# 575| mu0_23(char[2]) = Uninitialized[b] : &:r0_22
# 576| r0_24(glval<char[2]>) = VariableAddress[c] :
# 576| mu0_25(char[2]) = Uninitialized[c] : &:r0_24
# 576| r0_26(int) = Constant[0] :
# 576| r0_27(glval<char>) = PointerAdd[1] : r0_24, r0_26
# 576| r0_28(unknown[2]) = Constant[0] :
# 576| mu0_29(unknown[2]) = Store : &:r0_27, r0_28
# 577| r0_30(glval<char[2]>) = VariableAddress[d] :
# 577| mu0_31(char[2]) = Uninitialized[d] : &:r0_30
# 577| r0_32(int) = Constant[0] :
# 577| r0_33(glval<char>) = PointerAdd[1] : r0_30, r0_32
# 577| r0_34(char) = Constant[0] :
# 577| mu0_35(char) = Store : &:r0_33, r0_34
# 577| r0_36(int) = Constant[1] :
# 577| r0_37(glval<char>) = PointerAdd[1] : r0_30, r0_36
# 577| r0_38(char) = Constant[0] :
# 577| mu0_39(char) = Store : &:r0_37, r0_38
# 578| r0_40(glval<char[2]>) = VariableAddress[e] :
# 578| mu0_41(char[2]) = Uninitialized[e] : &:r0_40
# 578| r0_42(int) = Constant[0] :
# 578| r0_43(glval<char>) = PointerAdd[1] : r0_40, r0_42
# 578| r0_44(char) = Constant[0] :
# 578| mu0_45(char) = Store : &:r0_43, r0_44
# 578| r0_46(int) = Constant[1] :
# 578| r0_47(glval<char>) = PointerAdd[1] : r0_40, r0_46
# 578| r0_48(char) = Constant[1] :
# 578| mu0_49(char) = Store : &:r0_47, r0_48
# 579| r0_50(glval<char[3]>) = VariableAddress[f] :
# 579| mu0_51(char[3]) = Uninitialized[f] : &:r0_50
# 579| r0_52(int) = Constant[0] :
# 579| r0_53(glval<char>) = PointerAdd[1] : r0_50, r0_52
# 579| r0_54(char) = Constant[0] :
# 579| mu0_55(char) = Store : &:r0_53, r0_54
# 579| r0_56(int) = Constant[1] :
# 579| r0_57(glval<char>) = PointerAdd[1] : r0_50, r0_56
# 579| r0_58(unknown[2]) = Constant[0] :
# 579| mu0_59(unknown[2]) = Store : &:r0_57, r0_58
# 580| v0_60(void) = NoOp :
# 571| v0_61(void) = ReturnVoid :
# 571| v0_62(void) = UnmodeledUse : mu*
# 571| v0_63(void) = AliasedUse : ~mu0_2
# 571| v0_64(void) = ExitFunction :
# 573| r0_13(glval<char[4]>) = StringConstant["foo"] :
# 573| r0_14(char[4]) = Load : &:r0_13, ~mu0_2
# 573| mu0_15(char[4]) = Store : &:r0_12, r0_14
# 574| r0_16(glval<char[5]>) = VariableAddress[a_infer] :
# 574| r0_17(glval<char[5]>) = StringConstant["blah"] :
# 574| r0_18(char[5]) = Load : &:r0_17, ~mu0_2
# 574| mu0_19(char[5]) = Store : &:r0_16, r0_18
# 575| r0_20(glval<char[2]>) = VariableAddress[b] :
# 575| mu0_21(char[2]) = Uninitialized[b] : &:r0_20
# 576| r0_22(glval<char[2]>) = VariableAddress[c] :
# 576| mu0_23(char[2]) = Uninitialized[c] : &:r0_22
# 576| r0_24(int) = Constant[0] :
# 576| r0_25(glval<char>) = PointerAdd[1] : r0_22, r0_24
# 576| r0_26(unknown[2]) = Constant[0] :
# 576| mu0_27(unknown[2]) = Store : &:r0_25, r0_26
# 577| r0_28(glval<char[2]>) = VariableAddress[d] :
# 577| mu0_29(char[2]) = Uninitialized[d] : &:r0_28
# 577| r0_30(int) = Constant[0] :
# 577| r0_31(glval<char>) = PointerAdd[1] : r0_28, r0_30
# 577| r0_32(char) = Constant[0] :
# 577| mu0_33(char) = Store : &:r0_31, r0_32
# 577| r0_34(int) = Constant[1] :
# 577| r0_35(glval<char>) = PointerAdd[1] : r0_28, r0_34
# 577| r0_36(char) = Constant[0] :
# 577| mu0_37(char) = Store : &:r0_35, r0_36
# 578| r0_38(glval<char[2]>) = VariableAddress[e] :
# 578| mu0_39(char[2]) = Uninitialized[e] : &:r0_38
# 578| r0_40(int) = Constant[0] :
# 578| r0_41(glval<char>) = PointerAdd[1] : r0_38, r0_40
# 578| r0_42(char) = Constant[0] :
# 578| mu0_43(char) = Store : &:r0_41, r0_42
# 578| r0_44(int) = Constant[1] :
# 578| r0_45(glval<char>) = PointerAdd[1] : r0_38, r0_44
# 578| r0_46(char) = Constant[1] :
# 578| mu0_47(char) = Store : &:r0_45, r0_46
# 579| r0_48(glval<char[3]>) = VariableAddress[f] :
# 579| mu0_49(char[3]) = Uninitialized[f] : &:r0_48
# 579| r0_50(int) = Constant[0] :
# 579| r0_51(glval<char>) = PointerAdd[1] : r0_48, r0_50
# 579| r0_52(char) = Constant[0] :
# 579| mu0_53(char) = Store : &:r0_51, r0_52
# 579| r0_54(int) = Constant[1] :
# 579| r0_55(glval<char>) = PointerAdd[1] : r0_48, r0_54
# 579| r0_56(unknown[2]) = Constant[0] :
# 579| mu0_57(unknown[2]) = Store : &:r0_55, r0_56
# 580| v0_58(void) = NoOp :
# 571| v0_59(void) = ReturnVoid :
# 571| v0_60(void) = UnmodeledUse : mu*
# 571| v0_61(void) = AliasedUse : ~mu0_2
# 571| v0_62(void) = ExitFunction :
# 584| void VarArgs()
# 584| Block 0

View File

@@ -887,61 +887,59 @@ ssa.cpp:
# 214| m0_12(unknown[31]) = Store : &:r0_11, r0_9
# 214| m0_13(char[32]) = Chi : total:m0_8, partial:m0_12
# 215| r0_14(glval<char[4]>) = VariableAddress[a_nopad] :
# 215| m0_15(char[4]) = Uninitialized[a_nopad] : &:r0_14
# 215| r0_16(glval<char[4]>) = StringConstant["foo"] :
# 215| r0_17(char[4]) = Load : &:r0_16, ~m0_1
# 215| m0_18(char[4]) = Store : &:r0_14, r0_17
# 216| r0_19(glval<char[5]>) = VariableAddress[a_infer] :
# 216| m0_20(char[5]) = Uninitialized[a_infer] : &:r0_19
# 216| r0_21(glval<char[5]>) = StringConstant["blah"] :
# 216| r0_22(char[5]) = Load : &:r0_21, ~m0_1
# 216| m0_23(char[5]) = Store : &:r0_19, r0_22
# 217| r0_24(glval<char[2]>) = VariableAddress[b] :
# 217| m0_25(char[2]) = Uninitialized[b] : &:r0_24
# 218| r0_26(glval<char[2]>) = VariableAddress[c] :
# 218| m0_27(char[2]) = Uninitialized[c] : &:r0_26
# 218| r0_28(int) = Constant[0] :
# 218| r0_29(glval<char>) = PointerAdd[1] : r0_26, r0_28
# 218| r0_30(unknown[2]) = Constant[0] :
# 218| m0_31(unknown[2]) = Store : &:r0_29, r0_30
# 219| r0_32(glval<char[2]>) = VariableAddress[d] :
# 219| m0_33(char[2]) = Uninitialized[d] : &:r0_32
# 219| r0_34(int) = Constant[0] :
# 219| r0_35(glval<char>) = PointerAdd[1] : r0_32, r0_34
# 219| r0_36(char) = Constant[0] :
# 219| m0_37(char) = Store : &:r0_35, r0_36
# 219| m0_38(char[2]) = Chi : total:m0_33, partial:m0_37
# 219| r0_39(int) = Constant[1] :
# 219| r0_40(glval<char>) = PointerAdd[1] : r0_32, r0_39
# 219| r0_41(char) = Constant[0] :
# 219| m0_42(char) = Store : &:r0_40, r0_41
# 219| m0_43(char[2]) = Chi : total:m0_38, partial:m0_42
# 220| r0_44(glval<char[2]>) = VariableAddress[e] :
# 220| m0_45(char[2]) = Uninitialized[e] : &:r0_44
# 220| r0_46(int) = Constant[0] :
# 220| r0_47(glval<char>) = PointerAdd[1] : r0_44, r0_46
# 220| r0_48(char) = Constant[0] :
# 220| m0_49(char) = Store : &:r0_47, r0_48
# 220| m0_50(char[2]) = Chi : total:m0_45, partial:m0_49
# 220| r0_51(int) = Constant[1] :
# 220| r0_52(glval<char>) = PointerAdd[1] : r0_44, r0_51
# 220| r0_53(char) = Constant[1] :
# 220| m0_54(char) = Store : &:r0_52, r0_53
# 220| m0_55(char[2]) = Chi : total:m0_50, partial:m0_54
# 221| r0_56(glval<char[3]>) = VariableAddress[f] :
# 221| m0_57(char[3]) = Uninitialized[f] : &:r0_56
# 221| r0_58(int) = Constant[0] :
# 221| r0_59(glval<char>) = PointerAdd[1] : r0_56, r0_58
# 221| r0_60(char) = Constant[0] :
# 221| m0_61(char) = Store : &:r0_59, r0_60
# 221| m0_62(char[3]) = Chi : total:m0_57, partial:m0_61
# 221| r0_63(int) = Constant[1] :
# 221| r0_64(glval<char>) = PointerAdd[1] : r0_56, r0_63
# 221| r0_65(unknown[2]) = Constant[0] :
# 221| m0_66(unknown[2]) = Store : &:r0_64, r0_65
# 221| m0_67(char[3]) = Chi : total:m0_62, partial:m0_66
# 222| v0_68(void) = NoOp :
# 213| v0_69(void) = ReturnVoid :
# 213| v0_70(void) = UnmodeledUse : mu*
# 213| v0_71(void) = AliasedUse : ~m0_1
# 213| v0_72(void) = ExitFunction :
# 215| r0_15(glval<char[4]>) = StringConstant["foo"] :
# 215| r0_16(char[4]) = Load : &:r0_15, ~m0_1
# 215| m0_17(char[4]) = Store : &:r0_14, r0_16
# 216| r0_18(glval<char[5]>) = VariableAddress[a_infer] :
# 216| r0_19(glval<char[5]>) = StringConstant["blah"] :
# 216| r0_20(char[5]) = Load : &:r0_19, ~m0_1
# 216| m0_21(char[5]) = Store : &:r0_18, r0_20
# 217| r0_22(glval<char[2]>) = VariableAddress[b] :
# 217| m0_23(char[2]) = Uninitialized[b] : &:r0_22
# 218| r0_24(glval<char[2]>) = VariableAddress[c] :
# 218| m0_25(char[2]) = Uninitialized[c] : &:r0_24
# 218| r0_26(int) = Constant[0] :
# 218| r0_27(glval<char>) = PointerAdd[1] : r0_24, r0_26
# 218| r0_28(unknown[2]) = Constant[0] :
# 218| m0_29(unknown[2]) = Store : &:r0_27, r0_28
# 219| r0_30(glval<char[2]>) = VariableAddress[d] :
# 219| m0_31(char[2]) = Uninitialized[d] : &:r0_30
# 219| r0_32(int) = Constant[0] :
# 219| r0_33(glval<char>) = PointerAdd[1] : r0_30, r0_32
# 219| r0_34(char) = Constant[0] :
# 219| m0_35(char) = Store : &:r0_33, r0_34
# 219| m0_36(char[2]) = Chi : total:m0_31, partial:m0_35
# 219| r0_37(int) = Constant[1] :
# 219| r0_38(glval<char>) = PointerAdd[1] : r0_30, r0_37
# 219| r0_39(char) = Constant[0] :
# 219| m0_40(char) = Store : &:r0_38, r0_39
# 219| m0_41(char[2]) = Chi : total:m0_36, partial:m0_40
# 220| r0_42(glval<char[2]>) = VariableAddress[e] :
# 220| m0_43(char[2]) = Uninitialized[e] : &:r0_42
# 220| r0_44(int) = Constant[0] :
# 220| r0_45(glval<char>) = PointerAdd[1] : r0_42, r0_44
# 220| r0_46(char) = Constant[0] :
# 220| m0_47(char) = Store : &:r0_45, r0_46
# 220| m0_48(char[2]) = Chi : total:m0_43, partial:m0_47
# 220| r0_49(int) = Constant[1] :
# 220| r0_50(glval<char>) = PointerAdd[1] : r0_42, r0_49
# 220| r0_51(char) = Constant[1] :
# 220| m0_52(char) = Store : &:r0_50, r0_51
# 220| m0_53(char[2]) = Chi : total:m0_48, partial:m0_52
# 221| r0_54(glval<char[3]>) = VariableAddress[f] :
# 221| m0_55(char[3]) = Uninitialized[f] : &:r0_54
# 221| r0_56(int) = Constant[0] :
# 221| r0_57(glval<char>) = PointerAdd[1] : r0_54, r0_56
# 221| r0_58(char) = Constant[0] :
# 221| m0_59(char) = Store : &:r0_57, r0_58
# 221| m0_60(char[3]) = Chi : total:m0_55, partial:m0_59
# 221| r0_61(int) = Constant[1] :
# 221| r0_62(glval<char>) = PointerAdd[1] : r0_54, r0_61
# 221| r0_63(unknown[2]) = Constant[0] :
# 221| m0_64(unknown[2]) = Store : &:r0_62, r0_63
# 221| m0_65(char[3]) = Chi : total:m0_60, partial:m0_64
# 222| v0_66(void) = NoOp :
# 213| v0_67(void) = ReturnVoid :
# 213| v0_68(void) = UnmodeledUse : mu*
# 213| v0_69(void) = AliasedUse : ~m0_1
# 213| v0_70(void) = ExitFunction :

View File

@@ -849,55 +849,53 @@ ssa.cpp:
# 214| r0_10(glval<char>) = PointerAdd[1] : r0_3, r0_9
# 214| mu0_11(unknown[31]) = Store : &:r0_10, r0_8
# 215| r0_12(glval<char[4]>) = VariableAddress[a_nopad] :
# 215| m0_13(char[4]) = Uninitialized[a_nopad] : &:r0_12
# 215| r0_14(glval<char[4]>) = StringConstant["foo"] :
# 215| r0_15(char[4]) = Load : &:r0_14, ~mu0_2
# 215| m0_16(char[4]) = Store : &:r0_12, r0_15
# 216| r0_17(glval<char[5]>) = VariableAddress[a_infer] :
# 216| m0_18(char[5]) = Uninitialized[a_infer] : &:r0_17
# 216| r0_19(glval<char[5]>) = StringConstant["blah"] :
# 216| r0_20(char[5]) = Load : &:r0_19, ~mu0_2
# 216| m0_21(char[5]) = Store : &:r0_17, r0_20
# 217| r0_22(glval<char[2]>) = VariableAddress[b] :
# 217| m0_23(char[2]) = Uninitialized[b] : &:r0_22
# 218| r0_24(glval<char[2]>) = VariableAddress[c] :
# 218| mu0_25(char[2]) = Uninitialized[c] : &:r0_24
# 218| r0_26(int) = Constant[0] :
# 218| r0_27(glval<char>) = PointerAdd[1] : r0_24, r0_26
# 218| r0_28(unknown[2]) = Constant[0] :
# 218| mu0_29(unknown[2]) = Store : &:r0_27, r0_28
# 219| r0_30(glval<char[2]>) = VariableAddress[d] :
# 219| mu0_31(char[2]) = Uninitialized[d] : &:r0_30
# 219| r0_32(int) = Constant[0] :
# 219| r0_33(glval<char>) = PointerAdd[1] : r0_30, r0_32
# 219| r0_34(char) = Constant[0] :
# 219| mu0_35(char) = Store : &:r0_33, r0_34
# 219| r0_36(int) = Constant[1] :
# 219| r0_37(glval<char>) = PointerAdd[1] : r0_30, r0_36
# 219| r0_38(char) = Constant[0] :
# 219| mu0_39(char) = Store : &:r0_37, r0_38
# 220| r0_40(glval<char[2]>) = VariableAddress[e] :
# 220| mu0_41(char[2]) = Uninitialized[e] : &:r0_40
# 220| r0_42(int) = Constant[0] :
# 220| r0_43(glval<char>) = PointerAdd[1] : r0_40, r0_42
# 220| r0_44(char) = Constant[0] :
# 220| mu0_45(char) = Store : &:r0_43, r0_44
# 220| r0_46(int) = Constant[1] :
# 220| r0_47(glval<char>) = PointerAdd[1] : r0_40, r0_46
# 220| r0_48(char) = Constant[1] :
# 220| mu0_49(char) = Store : &:r0_47, r0_48
# 221| r0_50(glval<char[3]>) = VariableAddress[f] :
# 221| mu0_51(char[3]) = Uninitialized[f] : &:r0_50
# 221| r0_52(int) = Constant[0] :
# 221| r0_53(glval<char>) = PointerAdd[1] : r0_50, r0_52
# 221| r0_54(char) = Constant[0] :
# 221| mu0_55(char) = Store : &:r0_53, r0_54
# 221| r0_56(int) = Constant[1] :
# 221| r0_57(glval<char>) = PointerAdd[1] : r0_50, r0_56
# 221| r0_58(unknown[2]) = Constant[0] :
# 221| mu0_59(unknown[2]) = Store : &:r0_57, r0_58
# 222| v0_60(void) = NoOp :
# 213| v0_61(void) = ReturnVoid :
# 213| v0_62(void) = UnmodeledUse : mu*
# 213| v0_63(void) = AliasedUse : ~mu0_2
# 213| v0_64(void) = ExitFunction :
# 215| r0_13(glval<char[4]>) = StringConstant["foo"] :
# 215| r0_14(char[4]) = Load : &:r0_13, ~mu0_2
# 215| m0_15(char[4]) = Store : &:r0_12, r0_14
# 216| r0_16(glval<char[5]>) = VariableAddress[a_infer] :
# 216| r0_17(glval<char[5]>) = StringConstant["blah"] :
# 216| r0_18(char[5]) = Load : &:r0_17, ~mu0_2
# 216| m0_19(char[5]) = Store : &:r0_16, r0_18
# 217| r0_20(glval<char[2]>) = VariableAddress[b] :
# 217| m0_21(char[2]) = Uninitialized[b] : &:r0_20
# 218| r0_22(glval<char[2]>) = VariableAddress[c] :
# 218| mu0_23(char[2]) = Uninitialized[c] : &:r0_22
# 218| r0_24(int) = Constant[0] :
# 218| r0_25(glval<char>) = PointerAdd[1] : r0_22, r0_24
# 218| r0_26(unknown[2]) = Constant[0] :
# 218| mu0_27(unknown[2]) = Store : &:r0_25, r0_26
# 219| r0_28(glval<char[2]>) = VariableAddress[d] :
# 219| mu0_29(char[2]) = Uninitialized[d] : &:r0_28
# 219| r0_30(int) = Constant[0] :
# 219| r0_31(glval<char>) = PointerAdd[1] : r0_28, r0_30
# 219| r0_32(char) = Constant[0] :
# 219| mu0_33(char) = Store : &:r0_31, r0_32
# 219| r0_34(int) = Constant[1] :
# 219| r0_35(glval<char>) = PointerAdd[1] : r0_28, r0_34
# 219| r0_36(char) = Constant[0] :
# 219| mu0_37(char) = Store : &:r0_35, r0_36
# 220| r0_38(glval<char[2]>) = VariableAddress[e] :
# 220| mu0_39(char[2]) = Uninitialized[e] : &:r0_38
# 220| r0_40(int) = Constant[0] :
# 220| r0_41(glval<char>) = PointerAdd[1] : r0_38, r0_40
# 220| r0_42(char) = Constant[0] :
# 220| mu0_43(char) = Store : &:r0_41, r0_42
# 220| r0_44(int) = Constant[1] :
# 220| r0_45(glval<char>) = PointerAdd[1] : r0_38, r0_44
# 220| r0_46(char) = Constant[1] :
# 220| mu0_47(char) = Store : &:r0_45, r0_46
# 221| r0_48(glval<char[3]>) = VariableAddress[f] :
# 221| mu0_49(char[3]) = Uninitialized[f] : &:r0_48
# 221| r0_50(int) = Constant[0] :
# 221| r0_51(glval<char>) = PointerAdd[1] : r0_48, r0_50
# 221| r0_52(char) = Constant[0] :
# 221| mu0_53(char) = Store : &:r0_51, r0_52
# 221| r0_54(int) = Constant[1] :
# 221| r0_55(glval<char>) = PointerAdd[1] : r0_48, r0_54
# 221| r0_56(unknown[2]) = Constant[0] :
# 221| mu0_57(unknown[2]) = Store : &:r0_55, r0_56
# 222| v0_58(void) = NoOp :
# 213| v0_59(void) = ReturnVoid :
# 213| v0_60(void) = UnmodeledUse : mu*
# 213| v0_61(void) = AliasedUse : ~mu0_2
# 213| v0_62(void) = ExitFunction :