[PATCH] Disable branch folding with MemorySanitizer
Evgeniy Stepanov
eugenis at google.com
Mon Nov 18 07:02:29 PST 2013
Branch folding optimization often leads to confusing MSan reports due to lost debug info.
For example,
1: if (x < 0)
2: if (y < 0)
3: do_something();
is transformed into something like
%0 = and i32 %y, %x
%1 = icmp slt i32 %0, 0
br i1 %1, label %if.then2, label %if.end3
where all 3 instructions are associated with line 1.
This patch disables folding of conditional branches in functions with sanitize_memory attribute.
http://llvm-reviews.chandlerc.com/D2214
Files:
lib/Transforms/Utils/SimplifyCFG.cpp
test/Transforms/SimplifyCFG/branch-fold-msan.ll
Index: lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- lib/Transforms/Utils/SimplifyCFG.cpp
+++ lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1967,6 +1967,13 @@
bool llvm::FoldBranchToCommonDest(BranchInst *BI) {
BasicBlock *BB = BI->getParent();
+ // This optimization results in confusing MemorySanitizer reports. Use of
+ // uninitialized value in this branch instruction is reported with the
+ // predecessor's debug location.
+ if (BB->getParent()->hasFnAttribute(Attribute::SanitizeMemory) &&
+ BI->isConditional())
+ return false;
+
Instruction *Cond = 0;
if (BI->isConditional())
Cond = dyn_cast<Instruction>(BI->getCondition());
Index: test/Transforms/SimplifyCFG/branch-fold-msan.ll
===================================================================
--- test/Transforms/SimplifyCFG/branch-fold-msan.ll
+++ test/Transforms/SimplifyCFG/branch-fold-msan.ll
@@ -0,0 +1,29 @@
+; RUN: opt < %s -simplifycfg -S | FileCheck %s
+
+declare void @callee()
+
+; Test that conditional branches are not folded with sanitize_memory.
+define void @caller(i32 %x, i32 %y) sanitize_memory {
+; CHECK: define void @caller(i32 [[X:%.*]], i32 [[Y:%.*]])
+; CHECK: icmp slt i32 {{.*}}[[X]]
+; CHECK: icmp slt i32 {{.*}}[[Y]]
+; CHECK: ret void
+
+entry:
+ %cmp = icmp slt i32 %x, 0
+ br i1 %cmp, label %if.then, label %if.end3
+
+if.then: ; preds = %entry
+ %cmp1 = icmp slt i32 %y, 0
+ br i1 %cmp1, label %if.then2, label %if.end
+
+if.then2: ; preds = %if.then
+ call void @callee()
+ br label %if.end
+
+if.end: ; preds = %if.then2, %if.then
+ br label %if.end3
+
+if.end3: ; preds = %if.end, %entry
+ ret void
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2214.1.patch
Type: text/x-patch
Size: 1863 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131118/83d189df/attachment.bin>
More information about the llvm-commits
mailing list