1ed48e6faSSam Parker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8.1m.main -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M 3d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8m.main -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M 4d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8m.base -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M 5d1d12935SRoman Lebedev; RUN: opt -mtriple=armv8a -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8A 6ed48e6faSSam Parker 7ed48e6faSSam Parker; Test that the phis from for.inc.preheader aren't hoisted into sw.bb92 because 8ed48e6faSSam Parker; the cost is too great - we can make a better decision later on. 947251582SSam Parker; FIXME: The Arm cost model needs to be updated for SizeAndLatency. 10*8979ae42SNikita Popovdefine i32 @multiple_spec_select_costs(ptr %a, ptr %idx, i8 %in) { 11ed48e6faSSam Parker; V8M-LABEL: @multiple_spec_select_costs( 12ed48e6faSSam Parker; V8M-NEXT: entry: 13*8979ae42SNikita Popov; V8M-NEXT: [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2 14*8979ae42SNikita Popov; V8M-NEXT: [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3 15ed48e6faSSam Parker; V8M-NEXT: [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0 16ed48e6faSSam Parker; V8M-NEXT: br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]] 17ed48e6faSSam Parker; V8M: sw.bb92: 18ed48e6faSSam Parker; V8M-NEXT: [[C_OFF_I150:%.*]] = add i8 [[IN]], -48 19ed48e6faSSam Parker; V8M-NEXT: [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9 20ed48e6faSSam Parker; V8M-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true 21ed48e6faSSam Parker; V8M-NEXT: [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7 22ed48e6faSSam Parker; V8M-NEXT: br label [[FOR_INC_PREHEADER]] 23ed48e6faSSam Parker; V8M: for.inc.preheader: 24*8979ae42SNikita Popov; V8M-NEXT: [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ] 25ed48e6faSSam Parker; V8M-NEXT: [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ] 26ed48e6faSSam Parker; V8M-NEXT: [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ] 27ed48e6faSSam Parker; V8M-NEXT: br label [[FOR_INC:%.*]] 28ed48e6faSSam Parker; V8M: for.inc: 29*8979ae42SNikita Popov; V8M-NEXT: [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ] 30*8979ae42SNikita Popov; V8M-NEXT: [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1 31*8979ae42SNikita Popov; V8M-NEXT: [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1 32ed48e6faSSam Parker; V8M-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0 33ed48e6faSSam Parker; V8M-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]] 34ed48e6faSSam Parker; V8M-NEXT: br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]] 35ed48e6faSSam Parker; V8M: for.body: 36ed48e6faSSam Parker; V8M-NEXT: [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1 37ed48e6faSSam Parker; V8M-NEXT: br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]] 38ed48e6faSSam Parker; V8M: exit: 39ed48e6faSSam Parker; V8M-NEXT: ret i32 [[PHI_RES]] 40ed48e6faSSam Parker; 41ed48e6faSSam Parker; V8A-LABEL: @multiple_spec_select_costs( 42ed48e6faSSam Parker; V8A-NEXT: entry: 43*8979ae42SNikita Popov; V8A-NEXT: [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2 44*8979ae42SNikita Popov; V8A-NEXT: [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3 45ed48e6faSSam Parker; V8A-NEXT: [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0 46ed48e6faSSam Parker; V8A-NEXT: br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]] 47ed48e6faSSam Parker; V8A: sw.bb92: 48ed48e6faSSam Parker; V8A-NEXT: [[C_OFF_I150:%.*]] = add i8 [[IN]], -48 49ed48e6faSSam Parker; V8A-NEXT: [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9 50ed48e6faSSam Parker; V8A-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true 51ed48e6faSSam Parker; V8A-NEXT: [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7 52ed48e6faSSam Parker; V8A-NEXT: br label [[FOR_INC_PREHEADER]] 53ed48e6faSSam Parker; V8A: for.inc.preheader: 54*8979ae42SNikita Popov; V8A-NEXT: [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ] 55ed48e6faSSam Parker; V8A-NEXT: [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ] 56ed48e6faSSam Parker; V8A-NEXT: [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ] 57ed48e6faSSam Parker; V8A-NEXT: br label [[FOR_INC:%.*]] 58ed48e6faSSam Parker; V8A: for.inc: 59*8979ae42SNikita Popov; V8A-NEXT: [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ] 60*8979ae42SNikita Popov; V8A-NEXT: [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1 61*8979ae42SNikita Popov; V8A-NEXT: [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1 62ed48e6faSSam Parker; V8A-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0 63ed48e6faSSam Parker; V8A-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]] 64ed48e6faSSam Parker; V8A-NEXT: br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]] 65ed48e6faSSam Parker; V8A: for.body: 66ed48e6faSSam Parker; V8A-NEXT: [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1 67ed48e6faSSam Parker; V8A-NEXT: br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]] 68ed48e6faSSam Parker; V8A: exit: 69ed48e6faSSam Parker; V8A-NEXT: ret i32 [[PHI_RES]] 70ed48e6faSSam Parker; 71ed48e6faSSam Parkerentry: 72*8979ae42SNikita Popov %gep.a.2 = getelementptr inbounds i8, ptr %a, i32 2 73*8979ae42SNikita Popov %incdec.ptr109.c4 = getelementptr inbounds i8, ptr %a, i32 3 74ed48e6faSSam Parker %zero = icmp ne i8 %in, 0 75ed48e6faSSam Parker br i1 %zero , label %for.inc.preheader, label %sw.bb92 76ed48e6faSSam Parker 77ed48e6faSSam Parkersw.bb92: 78ed48e6faSSam Parker %c.off.i150 = add i8 %in, -48 79ed48e6faSSam Parker %ugt.9 = icmp ugt i8 %c.off.i150, 9 80ed48e6faSSam Parker br i1 %ugt.9, label %for.inc.preheader, label %select.unfold198 81ed48e6faSSam Parker 82ed48e6faSSam Parkerselect.unfold198: 83ed48e6faSSam Parker br label %for.inc.preheader 84ed48e6faSSam Parker 85ed48e6faSSam Parkerfor.inc.preheader: 86*8979ae42SNikita Popov %str.ph.0 = phi ptr [ %incdec.ptr109.c4, %select.unfold198 ], [ %incdec.ptr109.c4, %sw.bb92 ], [ %gep.a.2, %entry ] 87ed48e6faSSam Parker %cmp = phi i1 [ true, %select.unfold198 ], [ false, %sw.bb92 ], [ false, %entry ] 88ed48e6faSSam Parker %phi.res = phi i32 [ 7, %select.unfold198 ], [ 1, %sw.bb92 ], [ 1, %entry ] 89ed48e6faSSam Parker br label %for.inc 90ed48e6faSSam Parker 91ed48e6faSSam Parkerfor.inc: 92*8979ae42SNikita Popov %str.ph.1 = phi ptr [ %incdec.ptr109, %for.body ], [ %str.ph.0, %for.inc.preheader ] 93*8979ae42SNikita Popov %incdec.ptr109 = getelementptr inbounds i8, ptr %str.ph.1, i32 1 94*8979ae42SNikita Popov %load.1 = load i8, ptr %incdec.ptr109, align 1 95ed48e6faSSam Parker %tobool = icmp ne i8 %load.1, 0 96ed48e6faSSam Parker %and = and i1 %cmp, %tobool 97ed48e6faSSam Parker br i1 %and, label %for.body, label %exit 98ed48e6faSSam Parker 99ed48e6faSSam Parkerfor.body: 100ed48e6faSSam Parker %cmp.1 = icmp eq i8 %load.1, 1 101ed48e6faSSam Parker br i1 %cmp.1, label %for.inc, label %sw.bb92 102ed48e6faSSam Parker 103ed48e6faSSam Parkerexit: 104ed48e6faSSam Parker ret i32 %phi.res 105ed48e6faSSam Parker} 106ed48e6faSSam Parker 107*8979ae42SNikita Popovdefine i32 @multiple_spec_select_costs_minsize(ptr %a, ptr %idx, i8 %in) #0 { 108ac50efd6SSam Parker; V8M-LABEL: @multiple_spec_select_costs_minsize( 109ac50efd6SSam Parker; V8M-NEXT: entry: 110*8979ae42SNikita Popov; V8M-NEXT: [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2 111*8979ae42SNikita Popov; V8M-NEXT: [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3 112ac50efd6SSam Parker; V8M-NEXT: [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0 113ac50efd6SSam Parker; V8M-NEXT: br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]] 114ac50efd6SSam Parker; V8M: sw.bb92: 115ac50efd6SSam Parker; V8M-NEXT: [[C_OFF_I150:%.*]] = add i8 [[IN]], -48 116ac50efd6SSam Parker; V8M-NEXT: [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9 11747251582SSam Parker; V8M-NEXT: br i1 [[UGT_9]], label [[FOR_INC_PREHEADER]], label [[SELECT_UNFOLD198:%.*]] 11847251582SSam Parker; V8M: select.unfold198: 119ac50efd6SSam Parker; V8M-NEXT: br label [[FOR_INC_PREHEADER]] 120ac50efd6SSam Parker; V8M: for.inc.preheader: 121*8979ae42SNikita Popov; V8M-NEXT: [[STR_PH_0:%.*]] = phi ptr [ [[INCDEC_PTR109_C4]], [[SELECT_UNFOLD198]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ], [ [[GEP_A_2]], [[ENTRY:%.*]] ] 12247251582SSam Parker; V8M-NEXT: [[CMP:%.*]] = phi i1 [ true, [[SELECT_UNFOLD198]] ], [ false, [[SW_BB92]] ], [ false, [[ENTRY]] ] 12347251582SSam Parker; V8M-NEXT: [[PHI_RES:%.*]] = phi i32 [ 7, [[SELECT_UNFOLD198]] ], [ 1, [[SW_BB92]] ], [ 1, [[ENTRY]] ] 124ac50efd6SSam Parker; V8M-NEXT: br label [[FOR_INC:%.*]] 125ac50efd6SSam Parker; V8M: for.inc: 126*8979ae42SNikita Popov; V8M-NEXT: [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ] 127*8979ae42SNikita Popov; V8M-NEXT: [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1 128*8979ae42SNikita Popov; V8M-NEXT: [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1 129ac50efd6SSam Parker; V8M-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0 130ac50efd6SSam Parker; V8M-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]] 131ac50efd6SSam Parker; V8M-NEXT: br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]] 132ac50efd6SSam Parker; V8M: for.body: 133ac50efd6SSam Parker; V8M-NEXT: [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1 134ac50efd6SSam Parker; V8M-NEXT: br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]] 135ac50efd6SSam Parker; V8M: exit: 136ac50efd6SSam Parker; V8M-NEXT: ret i32 [[PHI_RES]] 137ac50efd6SSam Parker; 138ac50efd6SSam Parker; V8A-LABEL: @multiple_spec_select_costs_minsize( 139ac50efd6SSam Parker; V8A-NEXT: entry: 140*8979ae42SNikita Popov; V8A-NEXT: [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2 141*8979ae42SNikita Popov; V8A-NEXT: [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3 142ac50efd6SSam Parker; V8A-NEXT: [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0 143ac50efd6SSam Parker; V8A-NEXT: br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]] 144ac50efd6SSam Parker; V8A: sw.bb92: 145ac50efd6SSam Parker; V8A-NEXT: [[C_OFF_I150:%.*]] = add i8 [[IN]], -48 146ac50efd6SSam Parker; V8A-NEXT: [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9 147ac50efd6SSam Parker; V8A-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true 148ac50efd6SSam Parker; V8A-NEXT: [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7 149ac50efd6SSam Parker; V8A-NEXT: br label [[FOR_INC_PREHEADER]] 150ac50efd6SSam Parker; V8A: for.inc.preheader: 151*8979ae42SNikita Popov; V8A-NEXT: [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ] 152ac50efd6SSam Parker; V8A-NEXT: [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ] 153ac50efd6SSam Parker; V8A-NEXT: [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ] 154ac50efd6SSam Parker; V8A-NEXT: br label [[FOR_INC:%.*]] 155ac50efd6SSam Parker; V8A: for.inc: 156*8979ae42SNikita Popov; V8A-NEXT: [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ] 157*8979ae42SNikita Popov; V8A-NEXT: [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1 158*8979ae42SNikita Popov; V8A-NEXT: [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1 159ac50efd6SSam Parker; V8A-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0 160ac50efd6SSam Parker; V8A-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]] 161ac50efd6SSam Parker; V8A-NEXT: br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]] 162ac50efd6SSam Parker; V8A: for.body: 163ac50efd6SSam Parker; V8A-NEXT: [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1 164ac50efd6SSam Parker; V8A-NEXT: br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]] 165ac50efd6SSam Parker; V8A: exit: 166ac50efd6SSam Parker; V8A-NEXT: ret i32 [[PHI_RES]] 167ac50efd6SSam Parker; 168ac50efd6SSam Parkerentry: 169*8979ae42SNikita Popov %gep.a.2 = getelementptr inbounds i8, ptr %a, i32 2 170*8979ae42SNikita Popov %incdec.ptr109.c4 = getelementptr inbounds i8, ptr %a, i32 3 171ac50efd6SSam Parker %zero = icmp ne i8 %in, 0 172ac50efd6SSam Parker br i1 %zero , label %for.inc.preheader, label %sw.bb92 173ac50efd6SSam Parker 174ac50efd6SSam Parkersw.bb92: 175ac50efd6SSam Parker %c.off.i150 = add i8 %in, -48 176ac50efd6SSam Parker %ugt.9 = icmp ugt i8 %c.off.i150, 9 177ac50efd6SSam Parker br i1 %ugt.9, label %for.inc.preheader, label %select.unfold198 178ac50efd6SSam Parker 179ac50efd6SSam Parkerselect.unfold198: 180ac50efd6SSam Parker br label %for.inc.preheader 181ac50efd6SSam Parker 182ac50efd6SSam Parkerfor.inc.preheader: 183*8979ae42SNikita Popov %str.ph.0 = phi ptr [ %incdec.ptr109.c4, %select.unfold198 ], [ %incdec.ptr109.c4, %sw.bb92 ], [ %gep.a.2, %entry ] 184ac50efd6SSam Parker %cmp = phi i1 [ true, %select.unfold198 ], [ false, %sw.bb92 ], [ false, %entry ] 185ac50efd6SSam Parker %phi.res = phi i32 [ 7, %select.unfold198 ], [ 1, %sw.bb92 ], [ 1, %entry ] 186ac50efd6SSam Parker br label %for.inc 187ac50efd6SSam Parker 188ac50efd6SSam Parkerfor.inc: 189*8979ae42SNikita Popov %str.ph.1 = phi ptr [ %incdec.ptr109, %for.body ], [ %str.ph.0, %for.inc.preheader ] 190*8979ae42SNikita Popov %incdec.ptr109 = getelementptr inbounds i8, ptr %str.ph.1, i32 1 191*8979ae42SNikita Popov %load.1 = load i8, ptr %incdec.ptr109, align 1 192ac50efd6SSam Parker %tobool = icmp ne i8 %load.1, 0 193ac50efd6SSam Parker %and = and i1 %cmp, %tobool 194ac50efd6SSam Parker br i1 %and, label %for.body, label %exit 195ac50efd6SSam Parker 196ac50efd6SSam Parkerfor.body: 197ac50efd6SSam Parker %cmp.1 = icmp eq i8 %load.1, 1 198ac50efd6SSam Parker br i1 %cmp.1, label %for.inc, label %sw.bb92 199ac50efd6SSam Parker 200ac50efd6SSam Parkerexit: 201ac50efd6SSam Parker ret i32 %phi.res 202ac50efd6SSam Parker} 203ac50efd6SSam Parker 204ac50efd6SSam Parkerattributes #0 = { minsize optsize } 205