[LLVMbugs] [Bug 14893] New: Instcombine miscompiles bool, aka i8 !range[0, 2)
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Thu Jan 10 05:52:53 PST 2013
http://llvm.org/bugs/show_bug.cgi?id=14893
Bug #: 14893
Summary: Instcombine miscompiles bool, aka i8 !range[0,2)
Product: libraries
Version: trunk
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: Scalar Optimizations
AssignedTo: unassignedbugs at nondot.org
ReportedBy: geek4civic at gmail.com
CC: baldrick at free.fr, llvmbugs at cs.uiuc.edu
Classification: Unclassified
target datalayout =
"e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-redhat-linux"
define zeroext i8 @_Z3BARv() unnamed_addr nounwind uwtable {
entry:
%r = alloca i8, align 1
%tmp = call zeroext i8 @_Z3FOORb(i8* %r) nounwind
%tmp9 = and i8 %tmp, 1
%tmp1 = icmp eq i8 %tmp9, 0
br i1 %tmp1, label %"5", label %"3"
"3": ; preds = %entry
%tmp3 = load i8* %r, align 1, !range !0
%tmp4 = icmp eq i8 %tmp3, 0
br i1 %tmp4, label %"5", label %"7"
"5": ; preds = %"3", %entry
br label %"7"
"7": ; preds = %"3", %"5"
%tmp6 = phi i8 [ 0, %"5" ], [ 1, %"3" ]
call void @llvm.lifetime.end(i64 1, i8* %r)
ret i8 %tmp6
}
declare zeroext i8 @_Z3FOORb(i8*)
declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
!0 = metadata !{i8 0, i8 2}
;========
With -simplifycfg -instcombine,
entry:
%r = alloca i8, align 1
%tmp = call zeroext i8 @_Z3FOORb(i8* %r) nounwind
%tmp9 = and i8 %tmp, 1
%tmp3 = load i8* %r, align 1, !range !0
%0 = xor i8 %tmp9, 1
%1 = xor i8 %tmp3, 1
%2 = or i8 %0, %1
%tmp6 = xor i8 %2, 1
call void @llvm.lifetime.end(i64 1, i8* %r)
ret i8 %tmp6
;====
0) "load i8 %r" is undef if %tmp is false.
1) "load i8 %r" should not be executed when %tmp is false.
2) "load i8 %r" affects the result even when "load i8 %r" might be out of
[0,2).
3) It would not be miscompiled when !range is removed.
FYI, this issue was found on gcc47 with dragonegg.
// r is not updated (undef) when return value is false.
// Simplified from clang/lib/Sema/SemaExpr.cpp EvaluatesAsTrue()
extern bool FOO(bool& r);
bool BAR() {
bool r;
return FOO(r) && r;
}
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list