blob: 447fca19a0758fada6f611772e58c951a72f6f0a [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 --check-globals=none
; RUN: opt -passes=loop-vectorize -S %s | FileCheck %s
; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s --check-prefix=FORCED
; Repeated diamonds in a dead expression must not cause excessive compile-time.
define void @shared_dead_operands(ptr %dst) {
; CHECK-LABEL: define void @shared_dead_operands(
; CHECK-SAME: ptr [[DST:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
; CHECK-NEXT: [[ITER:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[ITER_NEXT:%.*]], %[[LOOP]] ]
; CHECK-NEXT: [[ITER_FP:%.*]] = uitofp nneg i64 [[ITER]] to float
; CHECK-NEXT: [[ANGLE_SCALED:%.*]] = fmul nnan float [[ITER_FP]], f0x40C90FDB
; CHECK-NEXT: [[ANGLE:%.*]] = fmul nnan float [[ANGLE_SCALED]], 3.125000e-02
; CHECK-NEXT: [[CMP_0:%.*]] = fcmp ogt float [[ANGLE]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_0:%.*]] = fadd float [[ANGLE]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_0:%.*]] = select i1 [[CMP_0]], float [[ANGLE_ADJUSTED_0]], float [[ANGLE]]
; CHECK-NEXT: [[ANGLE_SUM_1:%.*]] = fadd float [[ANGLE]], [[SEL_0]]
; CHECK-NEXT: [[CMP_1:%.*]] = fcmp ogt float [[ANGLE_SUM_1]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_1:%.*]] = fadd float [[ANGLE_SUM_1]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_1:%.*]] = select i1 [[CMP_1]], float [[ANGLE_ADJUSTED_1]], float [[ANGLE_SUM_1]]
; CHECK-NEXT: [[ANGLE_SUM_2:%.*]] = fadd float [[ANGLE]], [[SEL_1]]
; CHECK-NEXT: [[CMP_2:%.*]] = fcmp ogt float [[ANGLE_SUM_2]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_2:%.*]] = fadd float [[ANGLE_SUM_2]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_2:%.*]] = select i1 [[CMP_2]], float [[ANGLE_ADJUSTED_2]], float [[ANGLE_SUM_2]]
; CHECK-NEXT: [[ANGLE_SUM_3:%.*]] = fadd float [[ANGLE]], [[SEL_2]]
; CHECK-NEXT: [[CMP_3:%.*]] = fcmp ogt float [[ANGLE_SUM_3]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_3:%.*]] = fadd float [[ANGLE_SUM_3]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_3:%.*]] = select i1 [[CMP_3]], float [[ANGLE_ADJUSTED_3]], float [[ANGLE_SUM_3]]
; CHECK-NEXT: [[ANGLE_SUM_4:%.*]] = fadd float [[ANGLE]], [[SEL_3]]
; CHECK-NEXT: [[CMP_4:%.*]] = fcmp ogt float [[ANGLE_SUM_4]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_4:%.*]] = fadd float [[ANGLE_SUM_4]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_4:%.*]] = select i1 [[CMP_4]], float [[ANGLE_ADJUSTED_4]], float [[ANGLE_SUM_4]]
; CHECK-NEXT: store float 0.000000e+00, ptr [[DST]], align 4
; CHECK-NEXT: [[ANGLE_SUM_5:%.*]] = fadd float [[ANGLE]], [[SEL_4]]
; CHECK-NEXT: [[CMP_5:%.*]] = fcmp ogt float [[ANGLE_SUM_5]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_5:%.*]] = fadd float [[ANGLE_SUM_5]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_5:%.*]] = select i1 [[CMP_5]], float [[ANGLE_ADJUSTED_5]], float [[ANGLE_SUM_5]]
; CHECK-NEXT: [[ANGLE_SUM_6:%.*]] = fadd float [[ANGLE]], [[SEL_5]]
; CHECK-NEXT: [[CMP_6:%.*]] = fcmp ogt float [[ANGLE_SUM_6]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_6:%.*]] = fadd float [[ANGLE_SUM_6]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_6:%.*]] = select i1 [[CMP_6]], float [[ANGLE_ADJUSTED_6]], float [[ANGLE_SUM_6]]
; CHECK-NEXT: [[ANGLE_SUM_7:%.*]] = fadd float [[ANGLE]], [[SEL_6]]
; CHECK-NEXT: [[CMP_7:%.*]] = fcmp ogt float [[ANGLE_SUM_7]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_7:%.*]] = fadd float [[ANGLE_SUM_7]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_7:%.*]] = select i1 [[CMP_7]], float [[ANGLE_ADJUSTED_7]], float [[ANGLE_SUM_7]]
; CHECK-NEXT: [[ANGLE_SUM_8:%.*]] = fadd float [[ANGLE]], [[SEL_7]]
; CHECK-NEXT: [[CMP_8:%.*]] = fcmp ogt float [[ANGLE_SUM_8]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_8:%.*]] = fadd float [[ANGLE_SUM_8]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_8:%.*]] = select i1 [[CMP_8]], float [[ANGLE_ADJUSTED_8]], float [[ANGLE_SUM_8]]
; CHECK-NEXT: [[ANGLE_SUM_9:%.*]] = fadd float [[ANGLE]], [[SEL_8]]
; CHECK-NEXT: [[CMP_9:%.*]] = fcmp ogt float [[ANGLE_SUM_9]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_9:%.*]] = fadd float [[ANGLE_SUM_9]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_9:%.*]] = select i1 [[CMP_9]], float [[ANGLE_ADJUSTED_9]], float [[ANGLE_SUM_9]]
; CHECK-NEXT: [[ANGLE_SUM_10:%.*]] = fadd float [[ANGLE]], [[SEL_9]]
; CHECK-NEXT: [[CMP_10:%.*]] = fcmp ogt float [[ANGLE_SUM_10]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_10:%.*]] = fadd float [[ANGLE_SUM_10]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_10:%.*]] = select i1 [[CMP_10]], float [[ANGLE_ADJUSTED_10]], float [[ANGLE_SUM_10]]
; CHECK-NEXT: [[ANGLE_SUM_11:%.*]] = fadd float [[ANGLE]], [[SEL_10]]
; CHECK-NEXT: [[CMP_11:%.*]] = fcmp ogt float [[ANGLE_SUM_11]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_11:%.*]] = fadd float [[ANGLE_SUM_11]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_11:%.*]] = select i1 [[CMP_11]], float [[ANGLE_ADJUSTED_11]], float [[ANGLE_SUM_11]]
; CHECK-NEXT: [[ANGLE_SUM_12:%.*]] = fadd float [[ANGLE]], [[SEL_11]]
; CHECK-NEXT: [[CMP_12:%.*]] = fcmp ogt float [[ANGLE_SUM_12]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_12:%.*]] = fadd float [[ANGLE_SUM_12]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_12:%.*]] = select i1 [[CMP_12]], float [[ANGLE_ADJUSTED_12]], float [[ANGLE_SUM_12]]
; CHECK-NEXT: [[ANGLE_SUM_13:%.*]] = fadd float [[ANGLE]], [[SEL_12]]
; CHECK-NEXT: [[CMP_13:%.*]] = fcmp ogt float [[ANGLE_SUM_13]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_13:%.*]] = fadd float [[ANGLE_SUM_13]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_13:%.*]] = select i1 [[CMP_13]], float [[ANGLE_ADJUSTED_13]], float [[ANGLE_SUM_13]]
; CHECK-NEXT: [[ANGLE_SUM_14:%.*]] = fadd float [[ANGLE]], [[SEL_13]]
; CHECK-NEXT: [[CMP_14:%.*]] = fcmp ogt float [[ANGLE_SUM_14]], f0x40490FDB
; CHECK-NEXT: [[ANGLE_ADJUSTED_14:%.*]] = fadd float [[ANGLE_SUM_14]], f0xC0C90FDB
; CHECK-NEXT: [[SEL_14:%.*]] = select i1 [[CMP_14]], float [[ANGLE_ADJUSTED_14]], float [[ANGLE_SUM_14]]
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 256
; CHECK-NEXT: [[ITER_NEXT]] = add nuw nsw i64 [[ITER]], 1
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 2048
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret void
;
; FORCED-LABEL: define void @shared_dead_operands(
; FORCED-SAME: ptr [[DST:%.*]]) {
; FORCED-NEXT: [[ENTRY:.*:]]
; FORCED-NEXT: br label %[[VECTOR_PH:.*]]
; FORCED: [[VECTOR_PH]]:
; FORCED-NEXT: br label %[[VECTOR_BODY:.*]]
; FORCED: [[VECTOR_BODY]]:
; FORCED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
; FORCED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
; FORCED-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 8
; FORCED-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; FORCED: [[MIDDLE_BLOCK]]:
; FORCED-NEXT: store float 0.000000e+00, ptr [[DST]], align 4
; FORCED-NEXT: br label %[[EXIT:.*]]
; FORCED: [[EXIT]]:
; FORCED-NEXT: ret void
;
entry:
br label %loop
loop:
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
%iter = phi i64 [ 0, %entry ], [ %iter.next, %loop ]
%iter.fp = uitofp nneg i64 %iter to float
%angle.scaled = fmul nnan float %iter.fp, f0x40C90FDB
%angle = fmul nnan float %angle.scaled, 3.125000e-02
%cmp.0 = fcmp ogt float %angle, f0x40490FDB
%angle.adjusted.0 = fadd float %angle, f0xC0C90FDB
%sel.0 = select i1 %cmp.0, float %angle.adjusted.0, float %angle
%angle.sum.1 = fadd float %angle, %sel.0
%cmp.1 = fcmp ogt float %angle.sum.1, f0x40490FDB
%angle.adjusted.1 = fadd float %angle.sum.1, f0xC0C90FDB
%sel.1 = select i1 %cmp.1, float %angle.adjusted.1, float %angle.sum.1
%angle.sum.2 = fadd float %angle, %sel.1
%cmp.2 = fcmp ogt float %angle.sum.2, f0x40490FDB
%angle.adjusted.2 = fadd float %angle.sum.2, f0xC0C90FDB
%sel.2 = select i1 %cmp.2, float %angle.adjusted.2, float %angle.sum.2
%angle.sum.3 = fadd float %angle, %sel.2
%cmp.3 = fcmp ogt float %angle.sum.3, f0x40490FDB
%angle.adjusted.3 = fadd float %angle.sum.3, f0xC0C90FDB
%sel.3 = select i1 %cmp.3, float %angle.adjusted.3, float %angle.sum.3
%angle.sum.4 = fadd float %angle, %sel.3
%cmp.4 = fcmp ogt float %angle.sum.4, f0x40490FDB
%angle.adjusted.4 = fadd float %angle.sum.4, f0xC0C90FDB
%sel.4 = select i1 %cmp.4, float %angle.adjusted.4, float %angle.sum.4
store float 0.000000e+00, ptr %dst, align 4
%angle.sum.5 = fadd float %angle, %sel.4
%cmp.5 = fcmp ogt float %angle.sum.5, f0x40490FDB
%angle.adjusted.5 = fadd float %angle.sum.5, f0xC0C90FDB
%sel.5 = select i1 %cmp.5, float %angle.adjusted.5, float %angle.sum.5
%angle.sum.6 = fadd float %angle, %sel.5
%cmp.6 = fcmp ogt float %angle.sum.6, f0x40490FDB
%angle.adjusted.6 = fadd float %angle.sum.6, f0xC0C90FDB
%sel.6 = select i1 %cmp.6, float %angle.adjusted.6, float %angle.sum.6
%angle.sum.7 = fadd float %angle, %sel.6
%cmp.7 = fcmp ogt float %angle.sum.7, f0x40490FDB
%angle.adjusted.7 = fadd float %angle.sum.7, f0xC0C90FDB
%sel.7 = select i1 %cmp.7, float %angle.adjusted.7, float %angle.sum.7
%angle.sum.8 = fadd float %angle, %sel.7
%cmp.8 = fcmp ogt float %angle.sum.8, f0x40490FDB
%angle.adjusted.8 = fadd float %angle.sum.8, f0xC0C90FDB
%sel.8 = select i1 %cmp.8, float %angle.adjusted.8, float %angle.sum.8
%angle.sum.9 = fadd float %angle, %sel.8
%cmp.9 = fcmp ogt float %angle.sum.9, f0x40490FDB
%angle.adjusted.9 = fadd float %angle.sum.9, f0xC0C90FDB
%sel.9 = select i1 %cmp.9, float %angle.adjusted.9, float %angle.sum.9
%angle.sum.10 = fadd float %angle, %sel.9
%cmp.10 = fcmp ogt float %angle.sum.10, f0x40490FDB
%angle.adjusted.10 = fadd float %angle.sum.10, f0xC0C90FDB
%sel.10 = select i1 %cmp.10, float %angle.adjusted.10, float %angle.sum.10
%angle.sum.11 = fadd float %angle, %sel.10
%cmp.11 = fcmp ogt float %angle.sum.11, f0x40490FDB
%angle.adjusted.11 = fadd float %angle.sum.11, f0xC0C90FDB
%sel.11 = select i1 %cmp.11, float %angle.adjusted.11, float %angle.sum.11
%angle.sum.12 = fadd float %angle, %sel.11
%cmp.12 = fcmp ogt float %angle.sum.12, f0x40490FDB
%angle.adjusted.12 = fadd float %angle.sum.12, f0xC0C90FDB
%sel.12 = select i1 %cmp.12, float %angle.adjusted.12, float %angle.sum.12
%angle.sum.13 = fadd float %angle, %sel.12
%cmp.13 = fcmp ogt float %angle.sum.13, f0x40490FDB
%angle.adjusted.13 = fadd float %angle.sum.13, f0xC0C90FDB
%sel.13 = select i1 %cmp.13, float %angle.adjusted.13, float %angle.sum.13
%angle.sum.14 = fadd float %angle, %sel.13
%cmp.14 = fcmp ogt float %angle.sum.14, f0x40490FDB
%angle.adjusted.14 = fadd float %angle.sum.14, f0xC0C90FDB
%sel.14 = select i1 %cmp.14, float %angle.adjusted.14, float %angle.sum.14
%iv.next = add nuw nsw i64 %iv, 256
%iter.next = add nuw nsw i64 %iter, 1
%ec = icmp eq i64 %iv.next, 2048
br i1 %ec, label %exit, label %loop
exit:
ret void
}