diff --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll index 2d34bcdc448b96..5712c947ccf9f0 100644 --- a/llvm/test/Transforms/Attributor/range.ll +++ b/llvm/test/Transforms/Attributor/range.ll @@ -1,8 +1,8 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes -; RUN: opt -attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,OLD_PM,MODULE,MODULE_OLD_PM -; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,NEW_PM,MODULE,MODULE_NEW_PM -; RUN: opt -attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,OLD_PM,CGSCC,CGSCC_OLD_PM -; RUN: opt -passes=attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,NEW_PM,CGSCC,CGSCC_NEW_PM +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,OLD_PM,MODULE_OLD_PM +; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,NEW_PM,MODULE_NEW_PM +; RUN: opt -attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC_OLD_PM +; RUN: opt -passes=attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC_NEW_PM ; FIXME: CGSCC is not looking at callees and calleers even though it could be allowed. @@ -18,16 +18,34 @@ define i32 @test0(i32* %p) { define i32 @test0-range-check(i32* %p) { ; +; OLD_PM-LABEL: define {{[^@]+}}@test0-range-check +; OLD_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; OLD_PM-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 +; OLD_PM-NEXT: ret i32 [[A]] +; +; NEW_PM-LABEL: define {{[^@]+}}@test0-range-check +; NEW_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; NEW_PM-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 +; NEW_PM-NEXT: ret i32 [[A]] +; +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test0-range-check +; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_OLD_PM-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_OLD_PM-NEXT: ret i32 [[A]] +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test0-range-check +; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_NEW_PM-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_NEW_PM-NEXT: ret i32 [[A]] +; ; MODULE-LABEL: define {{[^@]+}}@test0-range-check ; MODULE-SAME: (i32* nocapture nofree readonly [[P:%.*]]) ; MODULE-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 ; MODULE-NEXT: ret i32 [[A]] -; ; CGSCC-LABEL: define {{[^@]+}}@test0-range-check ; CGSCC-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) ; CGSCC-NEXT: [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) ; CGSCC-NEXT: ret i32 [[A]] -; %a = tail call i32 @test0(i32* %p) ret i32 %a } @@ -45,6 +63,234 @@ define void @use3(i1, i1, i1) { ; TEST0 icmp test define void @test0-icmp-check(i32* %p){ +; OLD_PM-LABEL: define {{[^@]+}}@test0-icmp-check +; OLD_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; OLD_PM-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 +; OLD_PM-NEXT: [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9 +; OLD_PM-NEXT: [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1 +; OLD_PM-NEXT: [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0 +; OLD_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 false) +; OLD_PM-NEXT: [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9 +; OLD_PM-NEXT: [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1 +; OLD_PM-NEXT: [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0 +; OLD_PM-NEXT: tail call void @use3(i1 true, i1 [[CMP_NE_2]], i1 [[CMP_NE_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 true) +; OLD_PM-NEXT: [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1 +; OLD_PM-NEXT: [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0 +; OLD_PM-NEXT: tail call void @use3(i1 false, i1 false, i1 [[CMP_UGT_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false) +; OLD_PM-NEXT: [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9 +; OLD_PM-NEXT: [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1 +; OLD_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 false) +; OLD_PM-NEXT: [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1 +; OLD_PM-NEXT: [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0 +; OLD_PM-NEXT: tail call void @use3(i1 false, i1 false, i1 [[CMP_SGT_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 true) +; OLD_PM-NEXT: [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9 +; OLD_PM-NEXT: [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1 +; OLD_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_4]], i1 true, i1 true) +; OLD_PM-NEXT: [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9 +; OLD_PM-NEXT: [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1 +; OLD_PM-NEXT: tail call void @use3(i1 true, i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_4]], i1 false, i1 false) +; OLD_PM-NEXT: [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8 +; OLD_PM-NEXT: [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1 +; OLD_PM-NEXT: [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0 +; OLD_PM-NEXT: tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]]) +; OLD_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false) +; OLD_PM-NEXT: ret void +; +; NEW_PM-LABEL: define {{[^@]+}}@test0-icmp-check +; NEW_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; NEW_PM-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 +; NEW_PM-NEXT: [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9 +; NEW_PM-NEXT: [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1 +; NEW_PM-NEXT: [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0 +; NEW_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 false) +; NEW_PM-NEXT: [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9 +; NEW_PM-NEXT: [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1 +; NEW_PM-NEXT: [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0 +; NEW_PM-NEXT: tail call void @use3(i1 true, i1 [[CMP_NE_2]], i1 [[CMP_NE_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 true) +; NEW_PM-NEXT: [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1 +; NEW_PM-NEXT: [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0 +; NEW_PM-NEXT: tail call void @use3(i1 false, i1 false, i1 [[CMP_UGT_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false) +; NEW_PM-NEXT: [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9 +; NEW_PM-NEXT: [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1 +; NEW_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 false) +; NEW_PM-NEXT: [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1 +; NEW_PM-NEXT: [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0 +; NEW_PM-NEXT: tail call void @use3(i1 false, i1 false, i1 [[CMP_SGT_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 true) +; NEW_PM-NEXT: [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9 +; NEW_PM-NEXT: [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1 +; NEW_PM-NEXT: tail call void @use3(i1 false, i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_4]], i1 true, i1 true) +; NEW_PM-NEXT: [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9 +; NEW_PM-NEXT: [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1 +; NEW_PM-NEXT: tail call void @use3(i1 true, i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_4]], i1 false, i1 false) +; NEW_PM-NEXT: [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8 +; NEW_PM-NEXT: [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1 +; NEW_PM-NEXT: [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0 +; NEW_PM-NEXT: tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]]) +; NEW_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false) +; NEW_PM-NEXT: ret void +; +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test0-icmp-check +; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_OLD_PM-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_1:%.*]] = icmp eq i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_EQ_6:%.*]] = icmp eq i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_1]], i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 [[CMP_EQ_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_NE_1:%.*]] = icmp ne i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_NE_6:%.*]] = icmp ne i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_NE_1]], i1 [[CMP_NE_2]], i1 [[CMP_NE_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 [[CMP_NE_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_UGT_1:%.*]] = icmp ugt i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_UGT_2:%.*]] = icmp ugt i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_1]], i1 [[CMP_UGT_2]], i1 [[CMP_UGT_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false) +; CGSCC_OLD_PM-NEXT: [[CMP_UGE_1:%.*]] = icmp uge i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_UGE_6:%.*]] = icmp uge i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_1]], i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 [[CMP_UGE_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_1:%.*]] = icmp sgt i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_2:%.*]] = icmp sgt i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_SGT_6:%.*]] = icmp sgt i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_1]], i1 [[CMP_SGT_2]], i1 [[CMP_SGT_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 [[CMP_SGT_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_1:%.*]] = icmp sge i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_5:%.*]] = icmp sge i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_GTE_6:%.*]] = icmp sge i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_1]], i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_4]], i1 [[CMP_GTE_5]], i1 [[CMP_GTE_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_1:%.*]] = icmp slt i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_5:%.*]] = icmp slt i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_SLT_6:%.*]] = icmp slt i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_1]], i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_4]], i1 [[CMP_SLT_5]], i1 [[CMP_SLT_6]]) +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_1:%.*]] = icmp sle i32 [[RET]], 10 +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_2:%.*]] = icmp sle i32 [[RET]], 9 +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8 +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1 +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0 +; CGSCC_OLD_PM-NEXT: [[CMP_LTE_6:%.*]] = icmp sle i32 [[RET]], -1 +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]]) +; CGSCC_OLD_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]]) +; CGSCC_OLD_PM-NEXT: ret void +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test0-icmp-check +; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_NEW_PM-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_1:%.*]] = icmp eq i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_EQ_6:%.*]] = icmp eq i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_1]], i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 [[CMP_EQ_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_NE_1:%.*]] = icmp ne i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_NE_6:%.*]] = icmp ne i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_NE_1]], i1 [[CMP_NE_2]], i1 [[CMP_NE_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 [[CMP_NE_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_UGT_1:%.*]] = icmp ugt i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_UGT_2:%.*]] = icmp ugt i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_1]], i1 [[CMP_UGT_2]], i1 [[CMP_UGT_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false) +; CGSCC_NEW_PM-NEXT: [[CMP_UGE_1:%.*]] = icmp uge i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_UGE_6:%.*]] = icmp uge i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_1]], i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 [[CMP_UGE_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_1:%.*]] = icmp sgt i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_2:%.*]] = icmp sgt i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_SGT_6:%.*]] = icmp sgt i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_1]], i1 [[CMP_SGT_2]], i1 [[CMP_SGT_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 [[CMP_SGT_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_1:%.*]] = icmp sge i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_5:%.*]] = icmp sge i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_GTE_6:%.*]] = icmp sge i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_1]], i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_GTE_4]], i1 [[CMP_GTE_5]], i1 [[CMP_GTE_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_1:%.*]] = icmp slt i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_5:%.*]] = icmp slt i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_SLT_6:%.*]] = icmp slt i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_1]], i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_SLT_4]], i1 [[CMP_SLT_5]], i1 [[CMP_SLT_6]]) +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_1:%.*]] = icmp sle i32 [[RET]], 10 +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_2:%.*]] = icmp sle i32 [[RET]], 9 +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8 +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1 +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0 +; CGSCC_NEW_PM-NEXT: [[CMP_LTE_6:%.*]] = icmp sle i32 [[RET]], -1 +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]]) +; CGSCC_NEW_PM-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]]) +; CGSCC_NEW_PM-NEXT: ret void +; ; MODULE-LABEL: define {{[^@]+}}@test0-icmp-check ; MODULE-SAME: (i32* nocapture nofree readonly [[P:%.*]]) ; MODULE-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly [[P]]) #0, !range !0 @@ -91,7 +337,6 @@ define void @test0-icmp-check(i32* %p){ ; MODULE-NEXT: tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]]) ; MODULE-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false) ; MODULE-NEXT: ret void -; ; CGSCC-LABEL: define {{[^@]+}}@test0-icmp-check ; CGSCC-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) ; CGSCC-NEXT: [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) @@ -158,7 +403,6 @@ define void @test0-icmp-check(i32* %p){ ; CGSCC-NEXT: tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]]) ; CGSCC-NEXT: tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]]) ; CGSCC-NEXT: ret void -; ; ret = [0, 10) %ret = tail call i32 @test0(i32 *%p) @@ -259,18 +503,40 @@ define i32 @test1(i32* %p) { } define i1 @test1-check(i32* %p) { +; OLD_PM-LABEL: define {{[^@]+}}@test1-check +; OLD_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; OLD_PM-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly [[P]]) #0, !range !2 +; OLD_PM-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 +; OLD_PM-NEXT: ret i1 [[CMP]] +; +; NEW_PM-LABEL: define {{[^@]+}}@test1-check +; NEW_PM-SAME: (i32* nocapture nofree readonly [[P:%.*]]) +; NEW_PM-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly [[P]]) #0, !range !2 +; NEW_PM-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 +; NEW_PM-NEXT: ret i1 [[CMP]] +; +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test1-check +; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_OLD_PM-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_OLD_PM-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 +; CGSCC_OLD_PM-NEXT: ret i1 [[CMP]] +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test1-check +; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) +; CGSCC_NEW_PM-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) +; CGSCC_NEW_PM-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 +; CGSCC_NEW_PM-NEXT: ret i1 [[CMP]] +; ; MODULE-LABEL: define {{[^@]+}}@test1-check ; MODULE-SAME: (i32* nocapture nofree readonly [[P:%.*]]) ; MODULE-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly [[P]]) #0, !range !2 ; MODULE-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 ; MODULE-NEXT: ret i1 [[CMP]] -; ; CGSCC-LABEL: define {{[^@]+}}@test1-check ; CGSCC-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]]) ; CGSCC-NEXT: [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]]) ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 ; CGSCC-NEXT: ret i1 [[CMP]] -; %res = tail call i32 @test1(i32* %p) %cmp = icmp eq i32 %res, 500 ret i1 %cmp @@ -305,6 +571,56 @@ entry: } define i32 @test2_check(i32* %p) { +; OLD_PM-LABEL: define {{[^@]+}}@test2_check +; OLD_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]]) +; OLD_PM-NEXT: entry: +; OLD_PM-NEXT: br label [[IF_THEN:%.*]] +; OLD_PM: if.then: +; OLD_PM-NEXT: br label [[RETURN:%.*]] +; OLD_PM: if.end: +; OLD_PM-NEXT: unreachable +; OLD_PM: return: +; OLD_PM-NEXT: ret i32 2 +; +; NEW_PM-LABEL: define {{[^@]+}}@test2_check +; NEW_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]]) +; NEW_PM-NEXT: entry: +; NEW_PM-NEXT: br label [[IF_THEN:%.*]] +; NEW_PM: if.then: +; NEW_PM-NEXT: br label [[RETURN:%.*]] +; NEW_PM: if.end: +; NEW_PM-NEXT: unreachable +; NEW_PM: return: +; NEW_PM-NEXT: ret i32 2 +; +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test2_check +; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) +; CGSCC_OLD_PM-NEXT: entry: +; CGSCC_OLD_PM-NEXT: [[CALL:%.*]] = tail call i32 @test2(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]]) +; CGSCC_OLD_PM-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 5 +; CGSCC_OLD_PM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CGSCC_OLD_PM: if.then: +; CGSCC_OLD_PM-NEXT: br label [[RETURN:%.*]] +; CGSCC_OLD_PM: if.end: +; CGSCC_OLD_PM-NEXT: br label [[RETURN]] +; CGSCC_OLD_PM: return: +; CGSCC_OLD_PM-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ] +; CGSCC_OLD_PM-NEXT: ret i32 [[RETVAL_0]] +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test2_check +; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) +; CGSCC_NEW_PM-NEXT: entry: +; CGSCC_NEW_PM-NEXT: [[CALL:%.*]] = tail call i32 @test2(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]]) +; CGSCC_NEW_PM-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 5 +; CGSCC_NEW_PM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CGSCC_NEW_PM: if.then: +; CGSCC_NEW_PM-NEXT: br label [[RETURN:%.*]] +; CGSCC_NEW_PM: if.end: +; CGSCC_NEW_PM-NEXT: br label [[RETURN]] +; CGSCC_NEW_PM: return: +; CGSCC_NEW_PM-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ] +; CGSCC_NEW_PM-NEXT: ret i32 [[RETVAL_0]] +; ; MODULE-LABEL: define {{[^@]+}}@test2_check ; MODULE-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]]) ; MODULE-NEXT: entry: @@ -315,7 +631,6 @@ define i32 @test2_check(i32* %p) { ; MODULE-NEXT: unreachable ; MODULE: return: ; MODULE-NEXT: ret i32 2 -; ; CGSCC-LABEL: define {{[^@]+}}@test2_check ; CGSCC-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) ; CGSCC-NEXT: entry: @@ -329,7 +644,6 @@ define i32 @test2_check(i32* %p) { ; CGSCC: return: ; CGSCC-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ] ; CGSCC-NEXT: ret i32 [[RETVAL_0]] -; entry: %call = tail call i32 @test2(i32* %p) %cmp = icmp slt i32 %call, 5 @@ -374,38 +688,38 @@ return: ; preds = %if.end, %if.then declare dso_local void @unkown() define internal i32 @r1(i32) local_unnamed_addr { -; MODULE_OLD_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr -; MODULE_OLD_PM-NEXT: br label [[TMP4:%.*]] -; MODULE_OLD_PM: 1: -; MODULE_OLD_PM-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000 -; MODULE_OLD_PM-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]] -; MODULE_OLD_PM: 3: -; MODULE_OLD_PM-NEXT: ret i32 20 -; MODULE_OLD_PM: f: -; MODULE_OLD_PM-NEXT: ret i32 10 -; MODULE_OLD_PM: 4: -; MODULE_OLD_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ] -; MODULE_OLD_PM-NEXT: [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ] -; MODULE_OLD_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]] -; MODULE_OLD_PM-NEXT: [[TMP8]] = add nuw nsw i32 [[TMP5]], 1 -; MODULE_OLD_PM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100 -; MODULE_OLD_PM-NEXT: br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]] -; -; MODULE_NEW_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr -; MODULE_NEW_PM-NEXT: br label [[TMP3:%.*]] -; MODULE_NEW_PM: 1: -; MODULE_NEW_PM-NEXT: br label [[F:%.*]] -; MODULE_NEW_PM: 2: -; MODULE_NEW_PM-NEXT: unreachable -; MODULE_NEW_PM: f: -; MODULE_NEW_PM-NEXT: ret i32 10 -; MODULE_NEW_PM: 3: -; MODULE_NEW_PM-NEXT: [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ] -; MODULE_NEW_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ] -; MODULE_NEW_PM-NEXT: [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]] -; MODULE_NEW_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP4]], 1 -; MODULE_NEW_PM-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100 -; MODULE_NEW_PM-NEXT: br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]] +; OLD_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr +; OLD_PM-NEXT: br label [[TMP4:%.*]] +; OLD_PM: 1: +; OLD_PM-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000 +; OLD_PM-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]] +; OLD_PM: 3: +; OLD_PM-NEXT: ret i32 20 +; OLD_PM: f: +; OLD_PM-NEXT: ret i32 10 +; OLD_PM: 4: +; OLD_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ] +; OLD_PM-NEXT: [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ] +; OLD_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]] +; OLD_PM-NEXT: [[TMP8]] = add nuw nsw i32 [[TMP5]], 1 +; OLD_PM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100 +; OLD_PM-NEXT: br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]] +; +; NEW_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr +; NEW_PM-NEXT: br label [[TMP3:%.*]] +; NEW_PM: 1: +; NEW_PM-NEXT: br label [[F:%.*]] +; NEW_PM: 2: +; NEW_PM-NEXT: unreachable +; NEW_PM: f: +; NEW_PM-NEXT: ret i32 10 +; NEW_PM: 3: +; NEW_PM-NEXT: [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ] +; NEW_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ] +; NEW_PM-NEXT: [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]] +; NEW_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP4]], 1 +; NEW_PM-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100 +; NEW_PM-NEXT: br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]] ; ; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@r1 ; CGSCC_OLD_PM-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr @@ -461,25 +775,25 @@ f: } define void @f1(i32){ -; MODULE_OLD_PM-LABEL: define {{[^@]+}}@f1 -; MODULE_OLD_PM-SAME: (i32 [[TMP0:%.*]]) -; MODULE_OLD_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1() -; MODULE_OLD_PM-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15 -; MODULE_OLD_PM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]] -; MODULE_OLD_PM: 4: -; MODULE_OLD_PM-NEXT: tail call void @unkown() -; MODULE_OLD_PM-NEXT: br label [[TMP5]] -; MODULE_OLD_PM: 5: -; MODULE_OLD_PM-NEXT: ret void -; -; MODULE_NEW_PM-LABEL: define {{[^@]+}}@f1 -; MODULE_NEW_PM-SAME: (i32 [[TMP0:%.*]]) -; MODULE_NEW_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1() -; MODULE_NEW_PM-NEXT: br label [[TMP4:%.*]] -; MODULE_NEW_PM: 3: -; MODULE_NEW_PM-NEXT: unreachable -; MODULE_NEW_PM: 4: -; MODULE_NEW_PM-NEXT: ret void +; OLD_PM-LABEL: define {{[^@]+}}@f1 +; OLD_PM-SAME: (i32 [[TMP0:%.*]]) +; OLD_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1() +; OLD_PM-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15 +; OLD_PM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]] +; OLD_PM: 4: +; OLD_PM-NEXT: tail call void @unkown() +; OLD_PM-NEXT: br label [[TMP5]] +; OLD_PM: 5: +; OLD_PM-NEXT: ret void +; +; NEW_PM-LABEL: define {{[^@]+}}@f1 +; NEW_PM-SAME: (i32 [[TMP0:%.*]]) +; NEW_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1() +; NEW_PM-NEXT: br label [[TMP4:%.*]] +; NEW_PM: 3: +; NEW_PM-NEXT: unreachable +; NEW_PM: 4: +; NEW_PM-NEXT: ret void ; ; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@f1 ; CGSCC_OLD_PM-SAME: (i32 [[TMP0:%.*]]) @@ -610,39 +924,59 @@ define dso_local i32 @test4-g2(i32 %u) { ; OLD_PM-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) ; OLD_PM-NEXT: ret i32 [[CALL]] ; -; MODULE_NEW_PM-LABEL: define {{[^@]+}}@test4-g2 -; MODULE_NEW_PM-SAME: (i32 [[U:%.*]]) -; MODULE_NEW_PM-NEXT: entry: -; MODULE_NEW_PM-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) #2, !range !3 -; MODULE_NEW_PM-NEXT: ret i32 [[CALL]] +; NEW_PM-LABEL: define {{[^@]+}}@test4-g2 +; NEW_PM-SAME: (i32 [[U:%.*]]) +; NEW_PM-NEXT: entry: +; NEW_PM-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) #2, !range !3 +; NEW_PM-NEXT: ret i32 [[CALL]] +; +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test4-g2 +; CGSCC_OLD_PM-SAME: (i32 [[U:%.*]]) +; CGSCC_OLD_PM-NEXT: entry: +; CGSCC_OLD_PM-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) +; CGSCC_OLD_PM-NEXT: ret i32 [[CALL]] +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test4-g2 +; CGSCC_NEW_PM-SAME: (i32 [[U:%.*]]) +; CGSCC_NEW_PM-NEXT: entry: +; CGSCC_NEW_PM-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) +; CGSCC_NEW_PM-NEXT: ret i32 [[CALL]] ; ; CGSCC-LABEL: define {{[^@]+}}@test4-g2 ; CGSCC-SAME: (i32 [[U:%.*]]) ; CGSCC-NEXT: entry: ; CGSCC-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) ; CGSCC-NEXT: ret i32 [[CALL]] -; entry: %call = tail call i32 @test4-f2(i32 %u) ret i32 %call } define dso_local i32 @test-5() { -; MODULE_OLD_PM-LABEL: define {{[^@]+}}@test-5() -; MODULE_OLD_PM-NEXT: entry: -; MODULE_OLD_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0), !range !3 -; MODULE_OLD_PM-NEXT: ret i32 [[CALL]] +; OLD_PM-LABEL: define {{[^@]+}}@test-5() +; OLD_PM-NEXT: entry: +; OLD_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0), !range !3 +; OLD_PM-NEXT: ret i32 [[CALL]] +; +; NEW_PM-LABEL: define {{[^@]+}}@test-5() +; NEW_PM-NEXT: entry: +; NEW_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0), !range !4 +; NEW_PM-NEXT: ret i32 [[CALL]] ; -; MODULE_NEW_PM-LABEL: define {{[^@]+}}@test-5() -; MODULE_NEW_PM-NEXT: entry: -; MODULE_NEW_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0), !range !4 -; MODULE_NEW_PM-NEXT: ret i32 [[CALL]] +; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test-5() +; CGSCC_OLD_PM-NEXT: entry: +; CGSCC_OLD_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0) +; CGSCC_OLD_PM-NEXT: ret i32 [[CALL]] +; +; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test-5() +; CGSCC_NEW_PM-NEXT: entry: +; CGSCC_NEW_PM-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0) +; CGSCC_NEW_PM-NEXT: ret i32 [[CALL]] ; ; CGSCC-LABEL: define {{[^@]+}}@test-5() ; CGSCC-NEXT: entry: ; CGSCC-NEXT: [[CALL:%.*]] = call i32 @rec(i32 0) ; CGSCC-NEXT: ret i32 [[CALL]] -; entry: %call = call i32 @rec(i32 0) ret i32 %call @@ -836,7 +1170,7 @@ entry: !1 = !{i32 10, i32 100} ; CHECK: !0 = !{i32 0, i32 10} ; CHECK-NEXT: !1 = !{i32 10, i32 100} -; CHECK-NEXT: !2 = !{i32 200, i32 1091} +; NEW_PM: !2 = !{i32 200, i32 1091} ; OLD_PM: !3 = !{i32 0, i32 2} ; NEW_PM: !3 = !{i32 1, i32 -2147483648} ; NEW_PM: !4 = !{i32 0, i32 2}