Files
clang-p2996/llvm/test/Transforms/PhaseOrdering/branch-dom-cond.ll
Yingwei Zheng 380fa875ab [InstCombine] Replace all dominated uses of condition with constants (#105510)
This patch replaces all dominated uses of condition with true/false to
improve context-sensitive optimizations. It eliminates a bunch of
branches in llvm-opt-benchmark.

As a side effect, it may introduce new phi nodes in some corner cases.
See the following case:
```
define i1 @test(i1 %cmp, i1 %cond) {
entry:
   br i1 %cond, label %bb1, label %bb2
bb1:
   br i1 %cmp, label %if.then, label %if.else
if.then:
   br %bb2
if.else:
   br %bb2
bb2:
  %res = phi i1 [%cmp, %entry], [%cmp, %if.then], [%cmp, %if.else]
  ret i1 %res
}
```
It will be simplified into:
```
define i1 @test(i1 %cmp, i1 %cond) {
entry:
   br i1 %cond, label %bb1, label %bb2
bb1:
   br i1 %cmp, label %if.then, label %if.else
if.then:
   br %bb2
if.else:
   br %bb2
bb2:
  %res = phi i1 [%cmp, %entry], [true, %if.then], [false, %if.else]
  ret i1 %res
}
```

I am planning to fix this in late pipeline/CGP since this problem exists
before the patch.
2024-09-01 09:49:23 +08:00

48 lines
1.6 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -O3 -S < %s | FileCheck %s
define void @growTables(ptr %p) {
; CHECK-LABEL: define void @growTables(
; CHECK-SAME: ptr [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CALL:%.*]] = load volatile i32, ptr [[P]], align 4
; CHECK-NEXT: [[CMP71:%.*]] = icmp sgt i32 [[CALL]], 0
; CHECK-NEXT: br i1 [[CMP71]], label %[[FOR_BODY:.*]], label %[[COMMON_RET:.*]]
; CHECK: [[FOR_BODY]]:
; CHECK-NEXT: [[I_02:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[ENTRY]] ]
; CHECK-NEXT: [[CALL9:%.*]] = load volatile ptr, ptr [[P]], align 8
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_02]], 1
; CHECK-NEXT: [[CMP7:%.*]] = icmp slt i32 [[INC]], [[CALL]]
; CHECK-NEXT: br i1 [[CMP7]], label %[[FOR_BODY]], label %[[FOR_BODY12:.*]]
; CHECK: [[FOR_BODY12]]:
; CHECK-NEXT: [[CALL14:%.*]] = load volatile ptr, ptr [[P]], align 8
; CHECK-NEXT: br label %[[COMMON_RET]]
; CHECK: [[COMMON_RET]]:
; CHECK-NEXT: ret void
;
entry:
%call = load volatile i32, ptr %p, align 4
br label %for.cond
for.cond:
%i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
%cmp7 = icmp slt i32 %i.0, %call
br i1 %cmp7, label %for.body, label %for.end
for.body:
%call9 = load volatile ptr, ptr %p, align 8
%inc = add i32 %i.0, 1
br label %for.cond
for.end:
%cmp11 = icmp sgt i32 %call, 0
br i1 %cmp11, label %for.body12, label %common.ret
for.body12:
%call14 = load volatile ptr, ptr %p, align 8
br label %common.ret
common.ret:
ret void
}