-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Description
| 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.