1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s 3 4declare dso_local void @bar() 5 6define dso_local void @test1(i32* nocapture %X) nounwind !prof !14 { 7; CHECK-LABEL: test1: 8; CHECK: # %bb.0: # %entry 9; CHECK-NEXT: cmpb $47, (%rdi) 10; CHECK-NEXT: je bar # TAILCALL 11; CHECK-NEXT: # %bb.1: # %if.end 12; CHECK-NEXT: retq 13entry: 14 %tmp1 = load i32, i32* %X, align 4 15 %and = and i32 %tmp1, 255 16 %cmp = icmp eq i32 %and, 47 17 br i1 %cmp, label %if.then, label %if.end 18 19if.then: 20 tail call void @bar() nounwind 21 br label %if.end 22 23if.end: 24 ret void 25} 26 27define dso_local void @test2(i32 %X) nounwind !prof !14 { 28; CHECK-LABEL: test2: 29; CHECK: # %bb.0: # %entry 30; CHECK-NEXT: cmpb $47, %dil 31; CHECK-NEXT: je bar # TAILCALL 32; CHECK-NEXT: # %bb.1: # %if.end 33; CHECK-NEXT: retq 34entry: 35 %and = and i32 %X, 255 36 %cmp = icmp eq i32 %and, 47 37 br i1 %cmp, label %if.then, label %if.end 38 39if.then: 40 tail call void @bar() nounwind 41 br label %if.end 42 43if.end: 44 ret void 45} 46 47define dso_local void @test3(i32 %X) nounwind !prof !14 { 48; CHECK-LABEL: test3: 49; CHECK: # %bb.0: # %entry 50; CHECK-NEXT: cmpb $-1, %dil 51; CHECK-NEXT: je bar # TAILCALL 52; CHECK-NEXT: # %bb.1: # %if.end 53; CHECK-NEXT: retq 54entry: 55 %and = and i32 %X, 255 56 %cmp = icmp eq i32 %and, 255 57 br i1 %cmp, label %if.then, label %if.end 58 59if.then: 60 tail call void @bar() nounwind 61 br label %if.end 62 63if.end: 64 ret void 65} 66 67; PR16083 68define i1 @test4(i64 %a, i32 %b) { 69; CHECK-LABEL: test4: 70; CHECK: # %bb.0: # %entry 71; CHECK-NEXT: movb $1, %al 72; CHECK-NEXT: testl %esi, %esi 73; CHECK-NEXT: je .LBB3_1 74; CHECK-NEXT: # %bb.2: # %lor.end 75; CHECK-NEXT: # kill: def $al killed $al killed $eax 76; CHECK-NEXT: retq 77; CHECK-NEXT: .LBB3_1: # %lor.rhs 78; CHECK-NEXT: xorl %eax, %eax 79; CHECK-NEXT: # kill: def $al killed $al killed $eax 80; CHECK-NEXT: retq 81entry: 82 %tobool = icmp ne i32 %b, 0 83 br i1 %tobool, label %lor.end, label %lor.rhs 84 85lor.rhs: ; preds = %entry 86 %and = and i64 0, %a 87 %tobool1 = icmp ne i64 %and, 0 88 br label %lor.end 89 90lor.end: ; preds = %lor.rhs, %entry 91 %p = phi i1 [ true, %entry ], [ %tobool1, %lor.rhs ] 92 ret i1 %p 93} 94 95@x = dso_local global { i8, i8, i8, i8, i8, i8, i8, i8 } { i8 1, i8 0, i8 0, i8 0, i8 1, i8 0, i8 0, i8 1 }, align 4 96 97; PR16551 98define dso_local void @test5(i32 %X) nounwind !prof !14 { 99; CHECK-LABEL: test5: 100; CHECK: # %bb.0: # %entry 101; CHECK-NEXT: movzbl x+6(%rip), %eax 102; CHECK-NEXT: shll $16, %eax 103; CHECK-NEXT: movzwl x+4(%rip), %ecx 104; CHECK-NEXT: orl %eax, %ecx 105; CHECK-NEXT: cmpl $1, %ecx 106; CHECK-NEXT: jne bar # TAILCALL 107; CHECK-NEXT: # %bb.1: # %if.end 108; CHECK-NEXT: retq 109entry: 110 %bf.load = load i56, i56* bitcast ({ i8, i8, i8, i8, i8, i8, i8, i8 }* @x to i56*), align 4 111 %bf.lshr = lshr i56 %bf.load, 32 112 %bf.cast = trunc i56 %bf.lshr to i32 113 %cmp = icmp ne i32 %bf.cast, 1 114 br i1 %cmp, label %if.then, label %if.end 115 116if.then: 117 tail call void @bar() nounwind 118 br label %if.end 119 120if.end: 121 ret void 122} 123 124define dso_local void @test2_1(i32 %X) nounwind !prof !14 { 125; CHECK-LABEL: test2_1: 126; CHECK: # %bb.0: # %entry 127; CHECK-NEXT: movzbl %dil, %eax 128; CHECK-NEXT: cmpl $256, %eax # imm = 0x100 129; CHECK-NEXT: je bar # TAILCALL 130; CHECK-NEXT: # %bb.1: # %if.end 131; CHECK-NEXT: retq 132entry: 133 %and = and i32 %X, 255 134 %cmp = icmp eq i32 %and, 256 135 br i1 %cmp, label %if.then, label %if.end 136 137if.then: 138 tail call void @bar() nounwind 139 br label %if.end 140 141if.end: 142 ret void 143} 144 145define dso_local void @test_sext_i8_icmp_1(i8 %x) nounwind !prof !14 { 146; CHECK-LABEL: test_sext_i8_icmp_1: 147; CHECK: # %bb.0: # %entry 148; CHECK-NEXT: cmpb $1, %dil 149; CHECK-NEXT: je bar # TAILCALL 150; CHECK-NEXT: # %bb.1: # %if.end 151; CHECK-NEXT: retq 152entry: 153 %sext = sext i8 %x to i32 154 %cmp = icmp eq i32 %sext, 1 155 br i1 %cmp, label %if.then, label %if.end 156 157if.then: 158 tail call void @bar() nounwind 159 br label %if.end 160 161if.end: 162 ret void 163} 164 165define dso_local void @test_sext_i8_icmp_47(i8 %x) nounwind !prof !14 { 166; CHECK-LABEL: test_sext_i8_icmp_47: 167; CHECK: # %bb.0: # %entry 168; CHECK-NEXT: cmpb $47, %dil 169; CHECK-NEXT: je bar # TAILCALL 170; CHECK-NEXT: # %bb.1: # %if.end 171; CHECK-NEXT: retq 172entry: 173 %sext = sext i8 %x to i32 174 %cmp = icmp eq i32 %sext, 47 175 br i1 %cmp, label %if.then, label %if.end 176 177if.then: 178 tail call void @bar() nounwind 179 br label %if.end 180 181if.end: 182 ret void 183} 184 185define dso_local void @test_sext_i8_icmp_127(i8 %x) nounwind !prof !14 { 186; CHECK-LABEL: test_sext_i8_icmp_127: 187; CHECK: # %bb.0: # %entry 188; CHECK-NEXT: cmpb $127, %dil 189; CHECK-NEXT: je bar # TAILCALL 190; CHECK-NEXT: # %bb.1: # %if.end 191; CHECK-NEXT: retq 192entry: 193 %sext = sext i8 %x to i32 194 %cmp = icmp eq i32 %sext, 127 195 br i1 %cmp, label %if.then, label %if.end 196 197if.then: 198 tail call void @bar() nounwind 199 br label %if.end 200 201if.end: 202 ret void 203} 204 205define dso_local void @test_sext_i8_icmp_neg1(i8 %x) nounwind !prof !14 { 206; CHECK-LABEL: test_sext_i8_icmp_neg1: 207; CHECK: # %bb.0: # %entry 208; CHECK-NEXT: cmpb $-1, %dil 209; CHECK-NEXT: je bar # TAILCALL 210; CHECK-NEXT: # %bb.1: # %if.end 211; CHECK-NEXT: retq 212entry: 213 %sext = sext i8 %x to i32 214 %cmp = icmp eq i32 %sext, -1 215 br i1 %cmp, label %if.then, label %if.end 216 217if.then: 218 tail call void @bar() nounwind 219 br label %if.end 220 221if.end: 222 ret void 223} 224 225define dso_local void @test_sext_i8_icmp_neg2(i8 %x) nounwind !prof !14 { 226; CHECK-LABEL: test_sext_i8_icmp_neg2: 227; CHECK: # %bb.0: # %entry 228; CHECK-NEXT: cmpb $-2, %dil 229; CHECK-NEXT: je bar # TAILCALL 230; CHECK-NEXT: # %bb.1: # %if.end 231; CHECK-NEXT: retq 232entry: 233 %sext = sext i8 %x to i32 234 %cmp = icmp eq i32 %sext, -2 235 br i1 %cmp, label %if.then, label %if.end 236 237if.then: 238 tail call void @bar() nounwind 239 br label %if.end 240 241if.end: 242 ret void 243} 244 245define dso_local void @test_sext_i8_icmp_neg127(i8 %x) nounwind !prof !14 { 246; CHECK-LABEL: test_sext_i8_icmp_neg127: 247; CHECK: # %bb.0: # %entry 248; CHECK-NEXT: cmpb $-127, %dil 249; CHECK-NEXT: je bar # TAILCALL 250; CHECK-NEXT: # %bb.1: # %if.end 251; CHECK-NEXT: retq 252entry: 253 %sext = sext i8 %x to i32 254 %cmp = icmp eq i32 %sext, -127 255 br i1 %cmp, label %if.then, label %if.end 256 257if.then: 258 tail call void @bar() nounwind 259 br label %if.end 260 261if.end: 262 ret void 263} 264 265define dso_local void @test_sext_i8_icmp_neg128(i8 %x) nounwind !prof !14 { 266; CHECK-LABEL: test_sext_i8_icmp_neg128: 267; CHECK: # %bb.0: # %entry 268; CHECK-NEXT: cmpb $-128, %dil 269; CHECK-NEXT: je bar # TAILCALL 270; CHECK-NEXT: # %bb.1: # %if.end 271; CHECK-NEXT: retq 272entry: 273 %sext = sext i8 %x to i32 274 %cmp = icmp eq i32 %sext, -128 275 br i1 %cmp, label %if.then, label %if.end 276 277if.then: 278 tail call void @bar() nounwind 279 br label %if.end 280 281if.end: 282 ret void 283} 284 285define dso_local void @test_sext_i8_icmp_255(i8 %x) nounwind !prof !14 { 286; CHECK-LABEL: test_sext_i8_icmp_255: 287; CHECK: # %bb.0: # %entry 288; CHECK-NEXT: movb $1, %al 289; CHECK-NEXT: testb %al, %al 290; CHECK-NEXT: je bar # TAILCALL 291; CHECK-NEXT: # %bb.1: # %if.end 292; CHECK-NEXT: retq 293entry: 294 %sext = sext i8 %x to i32 295 %cmp = icmp eq i32 %sext, 255 296 br i1 %cmp, label %if.then, label %if.end 297 298if.then: 299 tail call void @bar() nounwind 300 br label %if.end 301 302if.end: 303 ret void 304} 305 306!llvm.module.flags = !{!0} 307!0 = !{i32 1, !"ProfileSummary", !1} 308!1 = !{!2, !3, !4, !5, !6, !7, !8, !9} 309!2 = !{!"ProfileFormat", !"InstrProf"} 310!3 = !{!"TotalCount", i64 10000} 311!4 = !{!"MaxCount", i64 10} 312!5 = !{!"MaxInternalCount", i64 1} 313!6 = !{!"MaxFunctionCount", i64 1000} 314!7 = !{!"NumCounts", i64 3} 315!8 = !{!"NumFunctions", i64 3} 316!9 = !{!"DetailedSummary", !10} 317!10 = !{!11, !12, !13} 318!11 = !{i32 10000, i64 100, i32 1} 319!12 = !{i32 999000, i64 100, i32 1} 320!13 = !{i32 999999, i64 1, i32 2} 321!14 = !{!"function_entry_count", i64 0} 322