diff options
Diffstat (limited to 'llvm/test/Transforms/MergeICmps/pair-int32-int32.ll')
-rw-r--r-- | llvm/test/Transforms/MergeICmps/pair-int32-int32.ll | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/llvm/test/Transforms/MergeICmps/pair-int32-int32.ll b/llvm/test/Transforms/MergeICmps/pair-int32-int32.ll index 351cb2adedf..7544b84d861 100644 --- a/llvm/test/Transforms/MergeICmps/pair-int32-int32.ll +++ b/llvm/test/Transforms/MergeICmps/pair-int32-int32.ll @@ -1,10 +1,30 @@ -; RUN: opt -mergeicmps -S -o - %s | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -mergeicmps -S | FileCheck %s --check-prefix=NOEXPANSION %"struct.std::pair" = type { i32, i32 } define zeroext i1 @opeq1( - %"struct.std::pair"* nocapture readonly dereferenceable(8) %a, - %"struct.std::pair"* nocapture readonly dereferenceable(8) %b) local_unnamed_addr #0 { +; NOEXPANSION-LABEL: @opeq1( +; NOEXPANSION-NEXT: entry: +; NOEXPANSION-NEXT: [[FIRST_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[A:%.*]], i64 0, i32 0 +; NOEXPANSION-NEXT: [[TMP0:%.*]] = load i32, i32* [[FIRST_I]], align 4 +; NOEXPANSION-NEXT: [[FIRST1_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[B:%.*]], i64 0, i32 0 +; NOEXPANSION-NEXT: [[TMP1:%.*]] = load i32, i32* [[FIRST1_I]], align 4 +; NOEXPANSION-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] +; NOEXPANSION-NEXT: br i1 [[CMP_I]], label [[LAND_RHS_I:%.*]], label [[OPEQ1_EXIT:%.*]] +; NOEXPANSION: land.rhs.i: +; NOEXPANSION-NEXT: [[SECOND_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[A]], i64 0, i32 1 +; NOEXPANSION-NEXT: [[TMP2:%.*]] = load i32, i32* [[SECOND_I]], align 4 +; NOEXPANSION-NEXT: [[SECOND2_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[B]], i64 0, i32 1 +; NOEXPANSION-NEXT: [[TMP3:%.*]] = load i32, i32* [[SECOND2_I]], align 4 +; NOEXPANSION-NEXT: [[CMP3_I:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]] +; NOEXPANSION-NEXT: br label [[OPEQ1_EXIT]] +; NOEXPANSION: opeq1.exit: +; NOEXPANSION-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP3_I]], [[LAND_RHS_I]] ] +; NOEXPANSION-NEXT: ret i1 [[TMP4]] +; + %"struct.std::pair"* nocapture readonly dereferenceable(8) %a, + %"struct.std::pair"* nocapture readonly dereferenceable(8) %b) local_unnamed_addr #0 { entry: %first.i = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* %a, i64 0, i32 0 %0 = load i32, i32* %first.i, align 4 @@ -24,28 +44,31 @@ land.rhs.i: opeq1.exit: %4 = phi i1 [ false, %entry ], [ %cmp3.i, %land.rhs.i ] ret i1 %4 -; CHECK-LABEL: @opeq1( -; The entry block with zero-offset GEPs is kept, loads are removed. -; CHECK: entry -; CHECK: getelementptr {{.*}} i32 0 -; CHECK-NOT: load -; CHECK: getelementptr {{.*}} i32 0 -; CHECK-NOT: load -; The two 4 byte loads and compares are replaced with a single 8-byte memcmp. -; CHECK: @memcmp({{.*}}8) -; CHECK: icmp eq {{.*}} 0 -; The branch is now a direct branch; the other block has been removed. -; CHECK: br label %opeq1.exit -; CHECK-NOT: br -; The phi is updated. -; CHECK: phi i1 [ %{{[^,]*}}, %entry ] -; CHECK-NEXT: ret } ; Same as above, but the two blocks are in inverse order. define zeroext i1 @opeq1_inverse( - %"struct.std::pair"* nocapture readonly dereferenceable(8) %a, - %"struct.std::pair"* nocapture readonly dereferenceable(8) %b) local_unnamed_addr #0 { +; NOEXPANSION-LABEL: @opeq1_inverse( +; NOEXPANSION-NEXT: entry: +; NOEXPANSION-NEXT: [[FIRST_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[A:%.*]], i64 0, i32 1 +; NOEXPANSION-NEXT: [[TMP0:%.*]] = load i32, i32* [[FIRST_I]], align 4 +; NOEXPANSION-NEXT: [[FIRST1_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[B:%.*]], i64 0, i32 1 +; NOEXPANSION-NEXT: [[TMP1:%.*]] = load i32, i32* [[FIRST1_I]], align 4 +; NOEXPANSION-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]] +; NOEXPANSION-NEXT: br i1 [[CMP_I]], label [[LAND_RHS_I:%.*]], label [[OPEQ1_EXIT:%.*]] +; NOEXPANSION: land.rhs.i: +; NOEXPANSION-NEXT: [[SECOND_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[A]], i64 0, i32 0 +; NOEXPANSION-NEXT: [[TMP2:%.*]] = load i32, i32* [[SECOND_I]], align 4 +; NOEXPANSION-NEXT: [[SECOND2_I:%.*]] = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* [[B]], i64 0, i32 0 +; NOEXPANSION-NEXT: [[TMP3:%.*]] = load i32, i32* [[SECOND2_I]], align 4 +; NOEXPANSION-NEXT: [[CMP3_I:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]] +; NOEXPANSION-NEXT: br label [[OPEQ1_EXIT]] +; NOEXPANSION: opeq1.exit: +; NOEXPANSION-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP3_I]], [[LAND_RHS_I]] ] +; NOEXPANSION-NEXT: ret i1 [[TMP4]] +; + %"struct.std::pair"* nocapture readonly dereferenceable(8) %a, + %"struct.std::pair"* nocapture readonly dereferenceable(8) %b) local_unnamed_addr #0 { entry: %first.i = getelementptr inbounds %"struct.std::pair", %"struct.std::pair"* %a, i64 0, i32 1 %0 = load i32, i32* %first.i, align 4 @@ -65,22 +88,6 @@ land.rhs.i: opeq1.exit: %4 = phi i1 [ false, %entry ], [ %cmp3.i, %land.rhs.i ] ret i1 %4 -; CHECK-LABEL: @opeq1_inverse( -; The second block with zero-offset GEPs is kept, loads are removed. -; CHECK: land.rhs.i -; CHECK: getelementptr {{.*}} i32 0 -; CHECK-NOT: load -; CHECK: getelementptr {{.*}} i32 0 -; CHECK-NOT: load -; The two 4 byte loads and compares are replaced with a single 8-byte memcmp. -; CHECK: @memcmp({{.*}}8) -; CHECK: icmp eq {{.*}} 0 -; The branch is now a direct branch; the other block has been removed. -; CHECK: br label %opeq1.exit -; CHECK-NOT: br -; The phi is updated. -; CHECK: phi i1 [ %{{[^,]*}}, %land.rhs.i ] -; CHECK-NEXT: ret } |