1; RUN: llc < %s -mtriple=x86_64-apple-macosx -regalloc=greedy | FileCheck %s 2 3; This testing case is reduced from 197.parser prune_match function. 4; We make sure register copies are not generated on isupper.exit blocks. 5 6; isupper.exit and isupper.exit223 get tail-duplicated into all their 7; predecessors. 8; CHECK: cond.true.i.i 9; CHECK-NEXT: in Loop 10; Mem-move 11; CHECK-NEXT: movl 12; CHECK-NEXT: andl 13; CHECK-NEXT: testl 14; CHECK-NEXT: jne 15; CHECK: cond.true.i.i217 16; CHECK-NEXT: in Loop 17; Mem-move 18; CHECK-NEXT: movl 19; CHECK-NEXT: andl 20; CHECK-NEXT: testl 21; CHECK-NEXT: je 22; CHECK: cond.false.i.i 23; CHECK: maskrune 24; CHECK-NEXT: movzbl 25; CHECK-NEXT: movq 26; CHECK-NEXT: testl 27; CHECK-NEXT: je 28; CHECK: cond.false.i.i219 29; CHECK: maskrune 30; CHECK-NEXT: movzbl 31; CHECK-NEXT: movq 32; CHECK-NEXT: testl 33; CHECK-NEXT: jne 34 35%struct.List_o_links_struct = type { i32, i32, i32, ptr } 36%struct.Connector_struct = type { i16, i16, i8, i8, ptr, ptr } 37%struct._RuneLocale = type { [8 x i8], [32 x i8], ptr, ptr, i32, [256 x i32], [256 x i32], [256 x i32], %struct._RuneRange, %struct._RuneRange, %struct._RuneRange, ptr, i32, i32, ptr } 38%struct._RuneRange = type { i32, ptr } 39%struct._RuneEntry = type { i32, i32, i32, ptr } 40%struct._RuneCharClass = type { [14 x i8], i32 } 41%struct.Exp_struct = type { i8, i8, i8, i8, %union.anon } 42%union.anon = type { ptr } 43%struct.E_list_struct = type { ptr, ptr } 44%struct.domain_struct = type { ptr, i32, ptr, i32, i32, ptr, ptr } 45%struct.d_tree_leaf_struct = type { ptr, i32, ptr } 46@_DefaultRuneLocale = external global %struct._RuneLocale 47declare i32 @__maskrune(i32, i64) #7 48define fastcc i32 @prune_match(ptr nocapture readonly %a, ptr nocapture readonly %b) #9 { 49entry: 50 %0 = load i16, ptr %a, align 2 51 %1 = load i16, ptr %b, align 2 52 %cmp = icmp eq i16 %0, %1 53 br i1 %cmp, label %if.end, label %return, !prof !988 54if.end: 55 %priority = getelementptr inbounds %struct.Connector_struct, ptr %a, i64 0, i32 2 56 %2 = load i8, ptr %priority, align 1 57 %priority5 = getelementptr inbounds %struct.Connector_struct, ptr %b, i64 0, i32 2 58 %3 = load i8, ptr %priority5, align 1 59 %string = getelementptr inbounds %struct.Connector_struct, ptr %a, i64 0, i32 5 60 %4 = load ptr, ptr %string, align 8 61 %string7 = getelementptr inbounds %struct.Connector_struct, ptr %b, i64 0, i32 5 62 %5 = load ptr, ptr %string7, align 8 63 br label %while.cond 64while.cond: 65 %lsr.iv27 = phi i64 [ %lsr.iv.next28, %if.end17 ], [ 0, %if.end ] 66 %scevgep55 = getelementptr i8, ptr %4, i64 %lsr.iv27 67 %6 = load i8, ptr %scevgep55, align 1 68 %idxprom.i.i = sext i8 %6 to i64 69 %isascii.i.i224 = icmp sgt i8 %6, -1 70 br i1 %isascii.i.i224, label %cond.true.i.i, label %cond.false.i.i, !prof !181 71cond.true.i.i: 72 %arrayidx.i.i = getelementptr inbounds %struct._RuneLocale, ptr @_DefaultRuneLocale, i64 0, i32 5, i64 %idxprom.i.i 73 %7 = load i32, ptr %arrayidx.i.i, align 4 74 %and.i.i = and i32 %7, 32768 75 br label %isupper.exit 76cond.false.i.i: 77 %8 = trunc i64 %idxprom.i.i to i8 78 %conv8 = sext i8 %8 to i32 79 %call3.i.i = tail call i32 @__maskrune(i32 %conv8, i64 32768) #3 80 br label %isupper.exit 81isupper.exit: 82 %tobool1.sink.i.in.i = phi i32 [ %and.i.i, %cond.true.i.i ], [ %call3.i.i, %cond.false.i.i ] 83 %tobool1.sink.i.i = icmp eq i32 %tobool1.sink.i.in.i, 0 84 br i1 %tobool1.sink.i.i, label %lor.rhs, label %while.body, !prof !989 85lor.rhs: 86 %sunkaddr = ptrtoint ptr %5 to i64 87 %sunkaddr58 = add i64 %sunkaddr, %lsr.iv27 88 %sunkaddr59 = inttoptr i64 %sunkaddr58 to ptr 89 %9 = load i8, ptr %sunkaddr59, align 1 90 %idxprom.i.i214 = sext i8 %9 to i64 91 %isascii.i.i213225 = icmp sgt i8 %9, -1 92 br i1 %isascii.i.i213225, label %cond.true.i.i217, label %cond.false.i.i219, !prof !181 93cond.true.i.i217: 94 %arrayidx.i.i215 = getelementptr inbounds %struct._RuneLocale, ptr @_DefaultRuneLocale, i64 0, i32 5, i64 %idxprom.i.i214 95 %10 = load i32, ptr %arrayidx.i.i215, align 4 96 %and.i.i216 = and i32 %10, 32768 97 br label %isupper.exit223 98cond.false.i.i219: 99 %11 = trunc i64 %idxprom.i.i214 to i8 100 %conv9 = sext i8 %11 to i32 101 %call3.i.i218 = tail call i32 @__maskrune(i32 %conv9, i64 32768) #3 102 br label %isupper.exit223 103isupper.exit223: 104 %tobool1.sink.i.in.i220 = phi i32 [ %and.i.i216, %cond.true.i.i217 ], [ %call3.i.i218, %cond.false.i.i219 ] 105 %tobool1.sink.i.i221 = icmp eq i32 %tobool1.sink.i.in.i220, 0 106 br i1 %tobool1.sink.i.i221, label %while.end, label %while.body, !prof !990 107while.body: 108 %sunkaddr60 = ptrtoint ptr %4 to i64 109 %sunkaddr61 = add i64 %sunkaddr60, %lsr.iv27 110 %sunkaddr62 = inttoptr i64 %sunkaddr61 to ptr 111 %12 = load i8, ptr %sunkaddr62, align 1 112 %sunkaddr63 = ptrtoint ptr %5 to i64 113 %sunkaddr64 = add i64 %sunkaddr63, %lsr.iv27 114 %sunkaddr65 = inttoptr i64 %sunkaddr64 to ptr 115 %13 = load i8, ptr %sunkaddr65, align 1 116 %cmp14 = icmp eq i8 %12, %13 117 br i1 %cmp14, label %if.end17, label %return, !prof !991 118if.end17: 119 %lsr.iv.next28 = add i64 %lsr.iv27, 1 120 br label %while.cond 121while.end: 122 %14 = or i8 %3, %2 123 %15 = icmp eq i8 %14, 0 124 br i1 %15, label %if.then23, label %if.else88, !prof !992 125if.then23: 126 %sunkaddr66 = ptrtoint ptr %a to i64 127 %sunkaddr67 = add i64 %sunkaddr66, 16 128 %sunkaddr68 = inttoptr i64 %sunkaddr67 to ptr 129 %16 = load ptr, ptr %sunkaddr68, align 8 130 %17 = load i8, ptr %16, align 1 131 %cmp26 = icmp eq i8 %17, 83 132 %sunkaddr69 = ptrtoint ptr %4 to i64 133 %sunkaddr70 = add i64 %sunkaddr69, %lsr.iv27 134 %sunkaddr71 = inttoptr i64 %sunkaddr70 to ptr 135 %18 = load i8, ptr %sunkaddr71, align 1 136 br i1 %cmp26, label %land.lhs.true28, label %while.cond59.preheader, !prof !993 137land.lhs.true28: 138 switch i8 %18, label %land.rhs.preheader [ 139 i8 112, label %land.lhs.true35 140 i8 0, label %return 141 ], !prof !994 142land.lhs.true35: 143 %sunkaddr72 = ptrtoint ptr %5 to i64 144 %sunkaddr73 = add i64 %sunkaddr72, %lsr.iv27 145 %sunkaddr74 = inttoptr i64 %sunkaddr73 to ptr 146 %19 = load i8, ptr %sunkaddr74, align 1 147 switch i8 %19, label %land.rhs.preheader [ 148 i8 112, label %land.lhs.true43 149 ], !prof !995 150land.lhs.true43: 151 %20 = ptrtoint ptr %16 to i64 152 %21 = sub i64 0, %20 153 %scevgep52 = getelementptr i8, ptr %4, i64 %21 154 %scevgep53 = getelementptr i8, ptr %scevgep52, i64 %lsr.iv27 155 %scevgep54 = getelementptr i8, ptr %scevgep53, i64 -1 156 %cmp45 = icmp eq ptr %scevgep54, null 157 br i1 %cmp45, label %return, label %lor.lhs.false47, !prof !996 158lor.lhs.false47: 159 %22 = ptrtoint ptr %16 to i64 160 %23 = sub i64 0, %22 161 %scevgep47 = getelementptr i8, ptr %4, i64 %23 162 %scevgep48 = getelementptr i8, ptr %scevgep47, i64 %lsr.iv27 163 %scevgep49 = getelementptr i8, ptr %scevgep48, i64 -2 164 %cmp50 = icmp eq ptr %scevgep49, null 165 br i1 %cmp50, label %land.lhs.true52, label %while.cond59.preheader, !prof !997 166land.lhs.true52: 167 %sunkaddr75 = ptrtoint ptr %4 to i64 168 %sunkaddr76 = add i64 %sunkaddr75, %lsr.iv27 169 %sunkaddr77 = add i64 %sunkaddr76, -1 170 %sunkaddr78 = inttoptr i64 %sunkaddr77 to ptr 171 %24 = load i8, ptr %sunkaddr78, align 1 172 %cmp55 = icmp eq i8 %24, 73 173 %cmp61233 = icmp eq i8 %18, 0 174 %or.cond265 = or i1 %cmp55, %cmp61233 175 br i1 %or.cond265, label %return, label %land.rhs.preheader, !prof !998 176while.cond59.preheader: 177 %cmp61233.old = icmp eq i8 %18, 0 178 br i1 %cmp61233.old, label %return, label %land.rhs.preheader, !prof !999 179land.rhs.preheader: 180 %scevgep33 = getelementptr i8, ptr %5, i64 %lsr.iv27 181 %scevgep43 = getelementptr i8, ptr %4, i64 %lsr.iv27 182 br label %land.rhs 183land.rhs: 184 %lsr.iv = phi i64 [ 0, %land.rhs.preheader ], [ %lsr.iv.next, %if.then83 ] 185 %25 = phi i8 [ %27, %if.then83 ], [ %18, %land.rhs.preheader ] 186 %scevgep34 = getelementptr i8, ptr %scevgep33, i64 %lsr.iv 187 %26 = load i8, ptr %scevgep34, align 1 188 %cmp64 = icmp eq i8 %26, 0 189 br i1 %cmp64, label %return, label %while.body66, !prof !1000 190while.body66: 191 %cmp68 = icmp eq i8 %25, 42 192 %cmp72 = icmp eq i8 %26, 42 193 %or.cond = or i1 %cmp68, %cmp72 194 br i1 %or.cond, label %if.then83, label %lor.lhs.false74, !prof !1001 195lor.lhs.false74: 196 %cmp77 = icmp ne i8 %25, %26 197 %cmp81 = icmp eq i8 %25, 94 198 %or.cond208 = or i1 %cmp77, %cmp81 199 br i1 %or.cond208, label %return, label %if.then83, !prof !1002 200if.then83: 201 %scevgep44 = getelementptr i8, ptr %scevgep43, i64 %lsr.iv 202 %scevgep45 = getelementptr i8, ptr %scevgep44, i64 1 203 %27 = load i8, ptr %scevgep45, align 1 204 %cmp61 = icmp eq i8 %27, 0 205 %lsr.iv.next = add i64 %lsr.iv, 1 206 br i1 %cmp61, label %return, label %land.rhs, !prof !999 207if.else88: 208 %cmp89 = icmp eq i8 %2, 1 209 %cmp92 = icmp eq i8 %3, 2 210 %or.cond159 = and i1 %cmp89, %cmp92 211 br i1 %or.cond159, label %while.cond95.preheader, label %if.else123, !prof !1003 212while.cond95.preheader: 213 %sunkaddr79 = ptrtoint ptr %4 to i64 214 %sunkaddr80 = add i64 %sunkaddr79, %lsr.iv27 215 %sunkaddr81 = inttoptr i64 %sunkaddr80 to ptr 216 %28 = load i8, ptr %sunkaddr81, align 1 217 %cmp97238 = icmp eq i8 %28, 0 218 br i1 %cmp97238, label %return, label %land.rhs99.preheader, !prof !1004 219land.rhs99.preheader: 220 %scevgep31 = getelementptr i8, ptr %5, i64 %lsr.iv27 221 %scevgep40 = getelementptr i8, ptr %4, i64 %lsr.iv27 222 br label %land.rhs99 223land.rhs99: 224 %lsr.iv17 = phi i64 [ 0, %land.rhs99.preheader ], [ %lsr.iv.next18, %if.then117 ] 225 %29 = phi i8 [ %31, %if.then117 ], [ %28, %land.rhs99.preheader ] 226 %scevgep32 = getelementptr i8, ptr %scevgep31, i64 %lsr.iv17 227 %30 = load i8, ptr %scevgep32, align 1 228 %cmp101 = icmp eq i8 %30, 0 229 br i1 %cmp101, label %return, label %while.body104, !prof !1005 230while.body104: 231 %cmp107 = icmp eq i8 %29, %30 232 %cmp111 = icmp eq i8 %29, 42 233 %or.cond209 = or i1 %cmp107, %cmp111 234 %cmp115 = icmp eq i8 %30, 94 235 %or.cond210 = or i1 %or.cond209, %cmp115 236 br i1 %or.cond210, label %if.then117, label %return, !prof !1006 237if.then117: 238 %scevgep41 = getelementptr i8, ptr %scevgep40, i64 %lsr.iv17 239 %scevgep42 = getelementptr i8, ptr %scevgep41, i64 1 240 %31 = load i8, ptr %scevgep42, align 1 241 %cmp97 = icmp eq i8 %31, 0 242 %lsr.iv.next18 = add i64 %lsr.iv17, 1 243 br i1 %cmp97, label %return, label %land.rhs99, !prof !1004 244if.else123: 245 %cmp124 = icmp eq i8 %3, 1 246 %cmp127 = icmp eq i8 %2, 2 247 %or.cond160 = and i1 %cmp124, %cmp127 248 br i1 %or.cond160, label %while.cond130.preheader, label %return, !prof !1007 249while.cond130.preheader: 250 %sunkaddr82 = ptrtoint ptr %4 to i64 251 %sunkaddr83 = add i64 %sunkaddr82, %lsr.iv27 252 %sunkaddr84 = inttoptr i64 %sunkaddr83 to ptr 253 %32 = load i8, ptr %sunkaddr84, align 1 254 %cmp132244 = icmp eq i8 %32, 0 255 br i1 %cmp132244, label %return, label %land.rhs134.preheader, !prof !1008 256land.rhs134.preheader: 257 %scevgep29 = getelementptr i8, ptr %5, i64 %lsr.iv27 258 %scevgep37 = getelementptr i8, ptr %4, i64 %lsr.iv27 259 br label %land.rhs134 260land.rhs134: 261 %lsr.iv22 = phi i64 [ 0, %land.rhs134.preheader ], [ %lsr.iv.next23, %if.then152 ] 262 %33 = phi i8 [ %35, %if.then152 ], [ %32, %land.rhs134.preheader ] 263 %scevgep30 = getelementptr i8, ptr %scevgep29, i64 %lsr.iv22 264 %34 = load i8, ptr %scevgep30, align 1 265 %cmp136 = icmp eq i8 %34, 0 266 br i1 %cmp136, label %return, label %while.body139, !prof !1009 267while.body139: 268 %cmp142 = icmp eq i8 %33, %34 269 %cmp146 = icmp eq i8 %34, 42 270 %or.cond211 = or i1 %cmp142, %cmp146 271 %cmp150 = icmp eq i8 %33, 94 272 %or.cond212 = or i1 %or.cond211, %cmp150 273 br i1 %or.cond212, label %if.then152, label %return, !prof !1010 274if.then152: 275 %scevgep38 = getelementptr i8, ptr %scevgep37, i64 %lsr.iv22 276 %scevgep39 = getelementptr i8, ptr %scevgep38, i64 1 277 %35 = load i8, ptr %scevgep39, align 1 278 %cmp132 = icmp eq i8 %35, 0 279 %lsr.iv.next23 = add i64 %lsr.iv22, 1 280 br i1 %cmp132, label %return, label %land.rhs134, !prof !1008 281return: 282 %retval.0 = phi i32 [ 0, %entry ], [ 1, %land.lhs.true52 ], [ 1, %land.lhs.true43 ], [ 0, %if.else123 ], [ 1, %while.cond59.preheader ], [ 1, %while.cond95.preheader ], [ 1, %while.cond130.preheader ], [ 1, %land.lhs.true28 ], [ 1, %if.then83 ], [ 0, %lor.lhs.false74 ], [ 1, %land.rhs ], [ 1, %if.then117 ], [ 0, %while.body104 ], [ 1, %land.rhs99 ], [ 1, %if.then152 ], [ 0, %while.body139 ], [ 1, %land.rhs134 ], [ 0, %while.body ] 283 ret i32 %retval.0 284} 285!181 = !{!"branch_weights", i32 662038, i32 1} 286!988 = !{!"branch_weights", i32 12091450, i32 1916} 287!989 = !{!"branch_weights", i32 7564670, i32 4526781} 288!990 = !{!"branch_weights", i32 7484958, i32 13283499} 289!991 = !{!"branch_weights", i32 8677007, i32 4606493} 290!992 = !{!"branch_weights", i32 -1172426948, i32 145094705} 291!993 = !{!"branch_weights", i32 1468914, i32 5683688} 292!994 = !{!"branch_weights", i32 114025221, i32 -1217548794, i32 -1199521551} 293!995 = !{!"branch_weights", i32 1853716452, i32 -444717951} 294!996 = !{!"branch_weights", i32 1004870, i32 20259} 295!997 = !{!"branch_weights", i32 20071, i32 189} 296!998 = !{!"branch_weights", i32 -1020255939, i32 572177766} 297!999 = !{!"branch_weights", i32 2666513, i32 3466431} 298!1000 = !{!"branch_weights", i32 5117635, i32 1859780} 299!1001 = !{!"branch_weights", i32 354902465, i32 -1444604407} 300!1002 = !{!"branch_weights", i32 -1762419279, i32 1592770684} 301!1003 = !{!"branch_weights", i32 1435905930, i32 -1951930624} 302!1004 = !{!"branch_weights", i32 1, i32 504888} 303!1005 = !{!"branch_weights", i32 94662, i32 504888} 304!1006 = !{!"branch_weights", i32 -1897793104, i32 160196332} 305!1007 = !{!"branch_weights", i32 2074643678, i32 -29579071} 306!1008 = !{!"branch_weights", i32 1, i32 226163} 307!1009 = !{!"branch_weights", i32 58357, i32 226163} 308!1010 = !{!"branch_weights", i32 -2072848646, i32 92907517} 309