From b623088abe69c439838ced036cc1474c818a170e Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Fri, 12 Aug 2016 15:08:15 +0000 Subject: [PATCH] [LVI] Fix potential memory corruption in getValueFromCondition Rewrite Visited[Cond] = getValueFromConditionImpl(..., Visited) statement which can lead to a memory corruption since getValueFromConditionImpl changes Visited map and invalidates the iterators. llvm-svn: 278514 --- llvm/lib/Analysis/LazyValueInfo.cpp | 6 +- .../Transforms/CorrelatedValuePropagation/crash.ll | 140 +++++++++++++++++++++ 2 files changed, 144 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 8c09010..7a94048 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -1260,8 +1260,10 @@ getValueFromCondition(Value *Val, Value *Cond, bool isTrueDest, auto I = Visited.find(Cond); if (I != Visited.end()) return I->second; - return Visited[Cond] = getValueFromConditionImpl(Val, Cond, isTrueDest, - Visited); + + auto Result = getValueFromConditionImpl(Val, Cond, isTrueDest, Visited); + Visited[Cond] = Result; + return Result; } LVILatticeVal getValueFromCondition(Value *Val, Value *Cond, bool isTrueDest) { diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/crash.ll b/llvm/test/Transforms/CorrelatedValuePropagation/crash.ll index 9723d18..8a6aaed 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/crash.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/crash.ll @@ -60,3 +60,143 @@ if.else.i: ; preds = %for.body.i return: ; preds = %for.cond.i, %for.body ret void } + +define i1 @test4(i32 %int) { + %a0 = icmp ult i32 %int, 100 + %a1 = and i1 %a0, %a0 + %a2 = and i1 %a1, %a1 + %a3 = and i1 %a2, %a2 + %a4 = and i1 %a3, %a3 + %a5 = and i1 %a4, %a4 + %a6 = and i1 %a5, %a5 + %a7 = and i1 %a6, %a6 + %a8 = and i1 %a7, %a7 + %a9 = and i1 %a8, %a8 + %a10 = and i1 %a9, %a9 + %a11 = and i1 %a10, %a10 + %a12 = and i1 %a11, %a11 + %a13 = and i1 %a12, %a12 + %a14 = and i1 %a13, %a13 + %a15 = and i1 %a14, %a14 + %a16 = and i1 %a15, %a15 + %a17 = and i1 %a16, %a16 + %a18 = and i1 %a17, %a17 + %a19 = and i1 %a18, %a18 + %a20 = and i1 %a19, %a19 + %a21 = and i1 %a20, %a20 + %a22 = and i1 %a21, %a21 + %a23 = and i1 %a22, %a22 + %a24 = and i1 %a23, %a23 + %a25 = and i1 %a24, %a24 + %a26 = and i1 %a25, %a25 + %a27 = and i1 %a26, %a26 + %a28 = and i1 %a27, %a27 + %a29 = and i1 %a28, %a28 + %a30 = and i1 %a29, %a29 + %a31 = and i1 %a30, %a30 + %a32 = and i1 %a31, %a31 + %a33 = and i1 %a32, %a32 + %a34 = and i1 %a33, %a33 + %a35 = and i1 %a34, %a34 + %a36 = and i1 %a35, %a35 + %a37 = and i1 %a36, %a36 + %a38 = and i1 %a37, %a37 + %a39 = and i1 %a38, %a38 + %a40 = and i1 %a39, %a39 + %a41 = and i1 %a40, %a40 + %a42 = and i1 %a41, %a41 + %a43 = and i1 %a42, %a42 + %a44 = and i1 %a43, %a43 + %a45 = and i1 %a44, %a44 + %a46 = and i1 %a45, %a45 + %a47 = and i1 %a46, %a46 + %a48 = and i1 %a47, %a47 + %a49 = and i1 %a48, %a48 + %a50 = and i1 %a49, %a49 + %a51 = and i1 %a50, %a50 + %a52 = and i1 %a51, %a51 + %a53 = and i1 %a52, %a52 + %a54 = and i1 %a53, %a53 + %a55 = and i1 %a54, %a54 + %a56 = and i1 %a55, %a55 + %a57 = and i1 %a56, %a56 + %a58 = and i1 %a57, %a57 + %a59 = and i1 %a58, %a58 + %a60 = and i1 %a59, %a59 + %a61 = and i1 %a60, %a60 + %a62 = and i1 %a61, %a61 + %a63 = and i1 %a62, %a62 + %a64 = and i1 %a63, %a63 + %a65 = and i1 %a64, %a64 + %a66 = and i1 %a65, %a65 + %a67 = and i1 %a66, %a66 + %a68 = and i1 %a67, %a67 + %a69 = and i1 %a68, %a68 + %a70 = and i1 %a69, %a69 + %a71 = and i1 %a70, %a70 + %a72 = and i1 %a71, %a71 + %a73 = and i1 %a72, %a72 + %a74 = and i1 %a73, %a73 + %a75 = and i1 %a74, %a74 + %a76 = and i1 %a75, %a75 + %a77 = and i1 %a76, %a76 + %a78 = and i1 %a77, %a77 + %a79 = and i1 %a78, %a78 + %a80 = and i1 %a79, %a79 + %a81 = and i1 %a80, %a80 + %a82 = and i1 %a81, %a81 + %a83 = and i1 %a82, %a82 + %a84 = and i1 %a83, %a83 + %a85 = and i1 %a84, %a84 + %a86 = and i1 %a85, %a85 + %a87 = and i1 %a86, %a86 + %a88 = and i1 %a87, %a87 + %a89 = and i1 %a88, %a88 + %a90 = and i1 %a89, %a89 + %a91 = and i1 %a90, %a90 + %a92 = and i1 %a91, %a91 + %a93 = and i1 %a92, %a92 + %a94 = and i1 %a93, %a93 + %a95 = and i1 %a94, %a94 + %a96 = and i1 %a95, %a95 + %a97 = and i1 %a96, %a96 + %a98 = and i1 %a97, %a97 + %a99 = and i1 %a98, %a98 + %a100 = and i1 %a99, %a99 + %a101 = and i1 %a100, %a100 + %a102 = and i1 %a101, %a101 + %a103 = and i1 %a102, %a102 + %a104 = and i1 %a103, %a103 + %a105 = and i1 %a104, %a104 + %a106 = and i1 %a105, %a105 + %a107 = and i1 %a106, %a106 + %a108 = and i1 %a107, %a107 + %a109 = and i1 %a108, %a108 + %a110 = and i1 %a109, %a109 + %a111 = and i1 %a110, %a110 + %a112 = and i1 %a111, %a111 + %a113 = and i1 %a112, %a112 + %a114 = and i1 %a113, %a113 + %a115 = and i1 %a114, %a114 + %a116 = and i1 %a115, %a115 + %a117 = and i1 %a116, %a116 + %a118 = and i1 %a117, %a117 + %a119 = and i1 %a118, %a118 + %a120 = and i1 %a119, %a119 + %a121 = and i1 %a120, %a120 + %a122 = and i1 %a121, %a121 + %a123 = and i1 %a122, %a122 + %a124 = and i1 %a123, %a123 + %a125 = and i1 %a124, %a124 + %a126 = and i1 %a125, %a125 + %a127 = and i1 %a126, %a126 + %cond = and i1 %a127, %a127 + br i1 %cond, label %then, label %else + +then: + %result = icmp eq i32 %int, 255 + ret i1 %result + +else: + ret i1 false +} -- 2.7.4