Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

-simplifycfg -instcombine miscompiles bool, aka i8 !range[0,2) #15265

Closed
llvmbot opened this issue Jan 10, 2013 · 7 comments
Closed

-simplifycfg -instcombine miscompiles bool, aka i8 !range[0,2) #15265

llvmbot opened this issue Jan 10, 2013 · 7 comments
Labels
bugzilla Issues migrated from bugzilla

Comments

@llvmbot
Copy link
Collaborator

llvmbot commented Jan 10, 2013

Bugzilla Link 14893
Resolution FIXED
Resolved on Jan 28, 2014 10:58
Version trunk
OS All
Depends On llvm/llvm-bugzilla-archive#14945
Reporter LLVM Bugzilla Contributor

Extended Description

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

;====

  1. "load i8 %r" is undef if %tmp is false.
  2. "load i8 %r" should not be executed when %tmp is false.
  3. "load i8 %r" affects the result even when "load i8 %r" might be out of [0,2).
  4. 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;
}

@llvmbot
Copy link
Collaborator Author

llvmbot commented Jan 14, 2013

As I talked to Duncan, it can be a bug in simplifycfg.
I filed bug 14945 .

InstCombine does the right job as far as !range is valid.

@llvmbot
Copy link
Collaborator Author

llvmbot commented May 27, 2013

This causes dragonegg to miscompile DiagnoseLogicalAndInLogicalOrLHS in clang, causing the test clang/test/Sema/parentheses.c to fail.

@llvmbot
Copy link
Collaborator Author

llvmbot commented May 27, 2013

test if bugzilla is working

@llvmbot
Copy link
Collaborator Author

llvmbot commented May 27, 2013

comment
bugzilla doesn't like me putting this comment inline.

@llvmbot
Copy link
Collaborator Author

llvmbot commented May 27, 2013

I agree that simplifycfg must drop the metadata.

@llvmbot
Copy link
Collaborator Author

llvmbot commented Jan 28, 2014

Fixed in r200322.

@llvmbot
Copy link
Collaborator Author

llvmbot commented Nov 26, 2021

mentioned in issue llvm/llvm-bugzilla-archive#14945

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 3, 2021
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla
Projects
None yet
Development

No branches or pull requests

1 participant