[SCCP] Propagate equality of a not-constant
authorluxufan <luxufan@iscas.ac.cn>
Mon, 5 Dec 2022 11:38:25 +0000 (19:38 +0800)
committerluxufan <luxufan@iscas.ac.cn>
Mon, 5 Dec 2022 11:54:13 +0000 (19:54 +0800)
commitb0f78769178ebb5e0691aca5143fead7f79ee55c
tree05d73c16d621076102d42712603b420f14c8a61d
parentfc85ccd7b3cf7e6a7e7aef9e04c181df15b543e3
[SCCP] Propagate equality of a not-constant

The equality state of a not-constant can be used to do constant
propagation. For example,
```
define i32 @equal_not_constant(ptr noundef %p, ptr noundef %q) {
entry:
  %cmp = icmp ne ptr %p, null
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry
  %cmp.then = icmp eq ptr %p, %q
  br i1 %cmp.then, label %if.then1, label %if.end

if.then1:                                         ; preds = %if.then
  %cmp.then1 = icmp ne ptr %q, null
  call void @use(i1 %cmp.then1)
  br label %if.end

if.end:
  ret i32 0
}

```
In this case, we can fold `%cmp.then1` as `true`.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D139289
llvm/lib/Transforms/Utils/SCCPSolver.cpp
llvm/test/Transforms/SCCP/conditions-ranges.ll