| ; 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 |
| } |