[llvm-bugs] [Bug 50605] New: Vector comparisons are not canonicalized

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Jun 7 11:18:00 PDT 2021


https://bugs.llvm.org/show_bug.cgi?id=50605

            Bug ID: 50605
           Summary: Vector comparisons are not canonicalized
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Common Code Generator Code
          Assignee: unassignedbugs at nondot.org
          Reporter: dave at znu.io
                CC: llvm-bugs at lists.llvm.org

The following input IR does not canonicalize consistently. Notably example_a_lt
optimized IR should be the same as example_a_ge. Similarly, example_b_le should
generate the same optimized IR as example_b_gt. The actual output with
top-of-tree LLVM follows the input IR:

define dso_local <16 x i32> @_Z12example_a_ltDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) #0 {
  %4 = alloca <16 x i32>, align 64
  %5 = alloca <16 x i32>, align 64
  %6 = alloca <16 x i32>, align 64
  store <16 x i32> %0, <16 x i32>* %4, align 64
  store <16 x i32> %1, <16 x i32>* %5, align 64
  store <16 x i32> %2, <16 x i32>* %6, align 64
  %7 = load <16 x i32>, <16 x i32>* %4, align 64
  %8 = icmp slt <16 x i32> %7, zeroinitializer
  %9 = sext <16 x i1> %8 to <16 x i32>
  %10 = load <16 x i32>, <16 x i32>* %5, align 64
  %11 = load <16 x i32>, <16 x i32>* %6, align 64
  %12 = icmp ne <16 x i32> %9, zeroinitializer
  %13 = select <16 x i1> %12, <16 x i32> %10, <16 x i32> %11
  ret <16 x i32> %13
}

; Function Attrs: noinline nounwind optnone uwtable mustprogress
define dso_local <16 x i32> @_Z12example_a_geDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) #0 {
  %4 = alloca <16 x i32>, align 64
  %5 = alloca <16 x i32>, align 64
  %6 = alloca <16 x i32>, align 64
  store <16 x i32> %0, <16 x i32>* %4, align 64
  store <16 x i32> %1, <16 x i32>* %5, align 64
  store <16 x i32> %2, <16 x i32>* %6, align 64
  %7 = load <16 x i32>, <16 x i32>* %4, align 64
  %8 = icmp sge <16 x i32> %7, zeroinitializer
  %9 = sext <16 x i1> %8 to <16 x i32>
  %10 = load <16 x i32>, <16 x i32>* %6, align 64
  %11 = load <16 x i32>, <16 x i32>* %5, align 64
  %12 = icmp ne <16 x i32> %9, zeroinitializer
  %13 = select <16 x i1> %12, <16 x i32> %10, <16 x i32> %11
  ret <16 x i32> %13
}

; Function Attrs: noinline nounwind optnone uwtable mustprogress
define dso_local <16 x i32> @_Z12example_b_leDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) #0 {
  %4 = alloca <16 x i32>, align 64
  %5 = alloca <16 x i32>, align 64
  %6 = alloca <16 x i32>, align 64
  store <16 x i32> %0, <16 x i32>* %4, align 64
  store <16 x i32> %1, <16 x i32>* %5, align 64
  store <16 x i32> %2, <16 x i32>* %6, align 64
  %7 = load <16 x i32>, <16 x i32>* %4, align 64
  %8 = icmp sle <16 x i32> %7, zeroinitializer
  %9 = sext <16 x i1> %8 to <16 x i32>
  %10 = load <16 x i32>, <16 x i32>* %5, align 64
  %11 = load <16 x i32>, <16 x i32>* %6, align 64
  %12 = icmp ne <16 x i32> %9, zeroinitializer
  %13 = select <16 x i1> %12, <16 x i32> %10, <16 x i32> %11
  ret <16 x i32> %13
}

; Function Attrs: noinline nounwind optnone uwtable mustprogress
define dso_local <16 x i32> @_Z12example_b_gtDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) #0 {
  %4 = alloca <16 x i32>, align 64
  %5 = alloca <16 x i32>, align 64
  %6 = alloca <16 x i32>, align 64
  store <16 x i32> %0, <16 x i32>* %4, align 64
  store <16 x i32> %1, <16 x i32>* %5, align 64
  store <16 x i32> %2, <16 x i32>* %6, align 64
  %7 = load <16 x i32>, <16 x i32>* %4, align 64
  %8 = icmp sgt <16 x i32> %7, zeroinitializer
  %9 = sext <16 x i1> %8 to <16 x i32>
  %10 = load <16 x i32>, <16 x i32>* %6, align 64
  %11 = load <16 x i32>, <16 x i32>* %5, align 64
  %12 = icmp ne <16 x i32> %9, zeroinitializer
  %13 = select <16 x i1> %12, <16 x i32> %10, <16 x i32> %11
  ret <16 x i32> %13
}


The current output IR after optimizations is:

define dso_local <16 x i32> @_Z12example_a_ltDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) local_unnamed_addr #0 {
  %4 = icmp sgt <16 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1,
i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
  %5 = select <16 x i1> %4, <16 x i32> %2, <16 x i32> %1
  ret <16 x i32> %5
}

; Function Attrs: nofree norecurse nosync nounwind readnone uwtable willreturn
mustprogress
define dso_local <16 x i32> @_Z12example_a_geDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) local_unnamed_addr #0 {
  %4 = icmp slt <16 x i32> %0, zeroinitializer
  %5 = select <16 x i1> %4, <16 x i32> %1, <16 x i32> %2
  ret <16 x i32> %5
}

; Function Attrs: nofree norecurse nosync nounwind readnone uwtable willreturn
mustprogress
define dso_local <16 x i32> @_Z12example_b_leDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) local_unnamed_addr #0 {
  %4 = icmp sgt <16 x i32> %0, zeroinitializer
  %5 = select <16 x i1> %4, <16 x i32> %2, <16 x i32> %1
  ret <16 x i32> %5
}

; Function Attrs: nofree norecurse nosync nounwind readnone uwtable willreturn
mustprogress
define dso_local <16 x i32> @_Z12example_b_gtDv16_iS_S_(<16 x i32> %0, <16 x
i32> %1, <16 x i32> %2) local_unnamed_addr #0 {
  %4 = icmp slt <16 x i32> %0, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32
1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
  %5 = select <16 x i1> %4, <16 x i32> %1, <16 x i32> %2
  ret <16 x i32> %5
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210607/de301c6f/attachment.html>


More information about the llvm-bugs mailing list