Issue 204334
Summary [AMDGPU] Stop structurizing uniform control flow
Labels new issue
Assignees
Reporter jayfoad
    add64_in_branch in test/CodeGen/AMDGPU/add.ll is an example of a function with only uniform control flow. `opt -p="print<uniformity>"` reports `ALL VALUES UNIFORM` but `opt -structurizecfg` structurizes it by adding a "flow" block. Before:
```
define amdgpu_kernel void @add64_in_branch(ptr addrspace(1) %out, ptr addrspace(1) %in, i64 %a, i64 %b, i64 %c) #0 {
entry:
 %add64_in_branch.kernarg.segment = call nonnull align 16 dereferenceable(296) ptr addrspace(4) @llvm.amdgcn.kernarg.segment.ptr()
  %out.kernarg.offset = getelementptr inbounds i8, ptr addrspace(4) %add64_in_branch.kernarg.segment, i64 36
  %0 = load <4 x i64>, ptr addrspace(4) %out.kernarg.offset, align 4, !invariant.load !0
  %a.load3 = extractelement <4 x i64> %0, i32 2
  %1 = icmp eq i64 %a.load3, 0
  br i1 %1, label %if, label %else, !structurizecfg.uniform !0

if: ; preds = %entry
  %in.load2 = extractelement <4 x i64> %0, i32 1
  %2 = inttoptr i64 %in.load2 to ptr addrspace(1)
  %3 = load i64, ptr addrspace(1) %2, align 4
  br label %endif, !structurizecfg.uniform !0

else: ; preds = %entry
  %b.load4 = extractelement <4 x i64> %0, i32 3
  %4 = add i64 %a.load3, %b.load4
  br label %endif, !structurizecfg.uniform !0

endif: ; preds = %else, %if
  %5 = phi i64 [ %3, %if ], [ %4, %else ]
  %out.load1 = extractelement <4 x i64> %0, i32 0
  %6 = inttoptr i64 %out.load1 to ptr addrspace(1)
  store i64 %5, ptr addrspace(1) %6, align 4
  ret void
}
```
After:
```
define amdgpu_kernel void @add64_in_branch(ptr addrspace(1) %out, ptr addrspace(1) %in, i64 %a, i64 %b, i64 %c) #0 {
entry:
  %add64_in_branch.kernarg.segment = call nonnull align 16 dereferenceable(296) ptr addrspace(4) @llvm.amdgcn.kernarg.segment.ptr()
 %out.kernarg.offset = getelementptr inbounds i8, ptr addrspace(4) %add64_in_branch.kernarg.segment, i64 36
  %0 = load <4 x i64>, ptr addrspace(4) %out.kernarg.offset, align 4, !invariant.load !0
  %a.load3 = extractelement <4 x i64> %0, i32 2
  %1 = icmp ne i64 %a.load3, 0
  br i1 %1, label %else, label %Flow

Flow: ; preds = %else, %entry
  %2 = phi i64 [ %6, %else ], [ poison, %entry ]
  %3 = phi i1 [ false, %else ], [ true, %entry ]
  br i1 %3, label %if, label %endif

if:                                               ; preds = %Flow
  %in.load2 = extractelement <4 x i64> %0, i32 1
  %4 = inttoptr i64 %in.load2 to ptr addrspace(1)
  %5 = load i64, ptr addrspace(1) %4, align 4
  br label %endif

else:                                             ; preds = %entry
  %b.load4 = extractelement <4 x i64> %0, i32 3
  %6 = add i64 %a.load3, %b.load4
  br label %Flow

endif: ; preds = %if, %Flow
  %7 = phi i64 [ %2, %Flow ], [ %5, %if ]
  %out.load1 = extractelement <4 x i64> %0, i32 0
  %8 = inttoptr i64 %out.load1 to ptr addrspace(1)
  store i64 %7, ptr addrspace(1) %8, align 4
  ret void
}
```
This seems pointless. There is no need to structurize uniform control flow.

There is previous work in this area: https://reviews.llvm.org/D40546 This patch added the option `-structurizecfg-skip-uniform-regions`. Maybe this should be on by default?
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to