[LV] Remove nondeterminacy by changing LoopVectorizationLegality::Reductions

from DenseMap to MapVector

The iteration order of LoopVectorizationLegality::Reductions matters for the
final code generation, so we better use MapVector instead of DenseMap for it
to remove the nondeterminacy. reduction-order.ll in the patch is an example
reduced from the case we saw. In the output of opt command, the order of the
select instructions in the vector.body block keeps changing from run to run
currently.

Differential Revision: https://reviews.llvm.org/D73490
This commit is contained in:
Wei Mi 2020-01-27 16:49:50 -08:00
parent 949294f396
commit f60671f049
2 changed files with 42 additions and 1 deletions

View File

@ -208,7 +208,7 @@ public:
/// ReductionList contains the reduction descriptors for all
/// of the reductions that were found in the loop.
using ReductionList = DenseMap<PHINode *, RecurrenceDescriptor>;
using ReductionList = MapVector<PHINode *, RecurrenceDescriptor>;
/// InductionList saves induction variables and maps them to the
/// induction descriptor.

View File

@ -0,0 +1,41 @@
; RUN: opt -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S < %s 2>&1 | FileCheck %s
; RUN: opt -passes='loop-vectorize' -force-vector-width=4 -force-vector-interleave=1 -S < %s 2>&1 | FileCheck %s
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
; Make sure the selects generated from reduction are always emitted
; in deterministic order.
; CHECK-LABEL: @foo(
; CHECK: vector.body:
; CHECK: %[[VAR1:.*]] = add <4 x i32> <i32 3, i32 3, i32 3, i32 3>, %vec.phi1
; CHECK-NEXT: %[[VAR2:.*]] = add <4 x i32> %vec.phi, <i32 5, i32 5, i32 5, i32 5>
; CHECK-NEXT: icmp ule <4 x i64>
; CHECK-NEXT: select <4 x i1> {{.*}}, <4 x i32> %[[VAR2]], <4 x i32>
; CHECK-NEXT: select <4 x i1> {{.*}}, <4 x i32> %[[VAR1]], <4 x i32>
; CHECK: br i1 {{.*}}, label %middle.block, label %vector.body
;
define internal i64 @foo(i32* %t0) !prof !1 {
t16:
br label %t20
t17: ; preds = %t20
%t18 = phi i32 [ %t24, %t20 ]
%t19 = phi i32 [ %t28, %t20 ]
br label %t31
t20: ; preds = %t20, %t16
%t21 = phi i64 [ 0, %t16 ], [ %t29, %t20 ]
%t22 = phi i32 [ 0, %t16 ], [ %t28, %t20 ]
%t23 = phi i32 [ 0, %t16 ], [ %t24, %t20 ]
%t24 = add i32 3, %t23
%t28 = add i32 %t22, 5
%t29 = add nuw nsw i64 %t21, 1
%t30 = icmp eq i64 %t29, undef
br i1 %t30, label %t17, label %t20, !prof !2
t31:
ret i64 undef
}
!1 = !{!"function_entry_count", i64 801}
!2 = !{!"branch_weights", i32 746, i32 1}