Skip to content

cse or gvn should replace opposite icmp with xor by true #27805

@llvmbot

Description

@llvmbot
Bugzilla Link 27431
Version trunk
OS Linux
Reporter LLVM Bugzilla Contributor
CC @topperc,@hfinkel,@sanjoy,@rotateright

Extended Description

Reduced testcase:

; ModuleID = 'gvn-icmp.ll'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @​use(i1)

define void @​fn1(i32 %A) {
entry:
%iszero = icmp eq i32 %A, 0
%isnotzero = icmp ne i32 %A, 0 ;; %isnotzero = xor i1 %iszero, true
tail call void @​use(i1 %iszero)
tail call void @​use(i1 %isnotzero)
ret void
}

Something in llvm should turn subsequent comparisons into nots of the original comparison to expose further correlations between values. In particular they should work across blocks, the right places for this might be early-cse and gvn.

Here's a larger C testcase, 77.c from Regehr's souper results:

int a;
char b;
int fn1() { return a && b || a && b; }

If I apply the proposed transformation by hand, it reduces from 12 instructions in 3 blocks down to a single block with load+load+icmp+icmp+and+zext+ret.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillallvm:GVNGVN and NewGVN stages (Global value numbering)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions