216 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s3; RUN: llc -mtriple=x86_64-unknown-unknown -early-live-intervals < %s | FileCheck %s4; rdar://76104185 6%ptr = type { ptr }7%struct.s1 = type { %ptr, %ptr }8%struct.s2 = type { i32, ptr, ptr, [256 x ptr], [8 x i32], i64, ptr, i32, i64, i64, i32, ptr, ptr, [49 x i64] }9%struct.s3 = type { ptr, ptr, i32, i32, i32 }10 11define fastcc ptr @t(i32 %base) nounwind {12; CHECK-LABEL: t:13; CHECK: # %bb.0: # %entry14; CHECK-NEXT: pushq %rax15; CHECK-NEXT: movl %edi, %eax16; CHECK-NEXT: shlq $9, %rax17; CHECK-NEXT: leaq (%rax,%rax,4), %rdi18; CHECK-NEXT: xorl %eax, %eax19; CHECK-NEXT: testb %al, %al20; CHECK-NEXT: jne .LBB0_221; CHECK-NEXT: # %bb.1: # %bb122; CHECK-NEXT: callq bar@PLT23; CHECK-NEXT: .LBB0_2: # %bb224; CHECK-NEXT: callq foo@PLT25entry:26 %0 = zext i32 %base to i6427 %1 = getelementptr inbounds %struct.s2, ptr null, i64 %028 br i1 undef, label %bb1, label %bb229 30bb1:31 %2 = getelementptr inbounds %struct.s2, ptr null, i64 %0, i32 032 call void @bar(ptr %2) nounwind33 unreachable34 35bb2:36 %3 = call fastcc ptr @foo(ptr %1) nounwind37 unreachable38 39bb3:40 ret ptr undef41}42 43declare void @bar(ptr)44 45declare fastcc ptr @foo(ptr) nounwind46 47; rdar://877337148 49declare void @printf(...) nounwind50 51define void @commute(i32 %test_case, i32 %scale) nounwind ssp {52; CHECK-LABEL: commute:53; CHECK: # %bb.0: # %entry54; CHECK-NEXT: # kill: def $esi killed $esi def $rsi55; CHECK-NEXT: # kill: def $edi killed $edi def $rdi56; CHECK-NEXT: leal -1(%rdi), %eax57; CHECK-NEXT: cmpl $2, %eax58; CHECK-NEXT: ja .LBB1_459; CHECK-NEXT: # %bb.1: # %sw.bb60; CHECK-NEXT: xorl %eax, %eax61; CHECK-NEXT: testb %al, %al62; CHECK-NEXT: jne .LBB1_463; CHECK-NEXT: # %bb.2: # %if.end3464; CHECK-NEXT: pushq %rax65; CHECK-NEXT: imull %edi, %esi66; CHECK-NEXT: leal (%rsi,%rsi,2), %esi67; CHECK-NEXT: # kill: def $edi killed $edi killed $rdi68; CHECK-NEXT: xorl %eax, %eax69; CHECK-NEXT: callq printf@PLT70; CHECK-NEXT: addq $8, %rsp71; CHECK-NEXT: .p2align 472; CHECK-NEXT: .LBB1_3: # %for.body53.us73; CHECK-NEXT: # =>This Inner Loop Header: Depth=174; CHECK-NEXT: jmp .LBB1_375; CHECK-NEXT: .LBB1_4: # %sw.bb30776; CHECK-NEXT: retq77entry:78 switch i32 %test_case, label %sw.bb307 [79 i32 1, label %sw.bb80 i32 2, label %sw.bb81 i32 3, label %sw.bb82 ]83 84sw.bb:85 %mul = mul nsw i32 %test_case, 386 %mul20 = mul nsw i32 %mul, %scale87 br i1 undef, label %if.end34, label %sw.bb30788 89if.end34:90 tail call void (...) @printf(i32 %test_case, i32 %mul20) nounwind91 %tmp = mul i32 %scale, %test_case92 %tmp752 = mul i32 %tmp, 393 %tmp753 = zext i32 %tmp752 to i6494 br label %bb.nph743.us95 96for.body53.us:97 %exitcond = icmp eq i64 undef, %tmp75398 br i1 %exitcond, label %bb.nph743.us, label %for.body53.us99 100bb.nph743.us:101 br label %for.body53.us102 103sw.bb307:104 ret void105}106 107; CSE physical register defining instruction across MBB boundary.108; rdar://10660865109define i32 @cross_mbb_phys_cse(i32 %a, i32 %b) nounwind ssp {110; CHECK-LABEL: cross_mbb_phys_cse:111; CHECK: # %bb.0: # %entry112; CHECK-NEXT: movl $1, %eax113; CHECK-NEXT: cmpl %esi, %edi114; CHECK-NEXT: ja .LBB2_2115; CHECK-NEXT: # %bb.1: # %if.end116; CHECK-NEXT: xorl %eax, %eax117; CHECK-NEXT: cmpl %esi, %edi118; CHECK-NEXT: sbbl %eax, %eax119; CHECK-NEXT: .LBB2_2: # %return120; CHECK-NEXT: retq121entry:122 %cmp = icmp ugt i32 %a, %b123 br i1 %cmp, label %return, label %if.end124 125if.end:126 %cmp1 = icmp ult i32 %a, %b127 %. = sext i1 %cmp1 to i32128 br label %return129 130return:131 %retval.0 = phi i32 [ 1, %entry ], [ %., %if.end ]132 ret i32 %retval.0133}134 135; rdar://11393714136define ptr @bsd_memchr(ptr %s, i32 %a, i32 %c, i64 %n) nounwind ssp {137; CHECK-LABEL: bsd_memchr:138; CHECK: # %bb.0: # %entry139; CHECK-NEXT: testq %rcx, %rcx140; CHECK-NEXT: je .LBB3_4141; CHECK-NEXT: # %bb.1: # %preheader142; CHECK-NEXT: movq %rdi, %rax143; CHECK-NEXT: movzbl %dl, %edx144; CHECK-NEXT: .p2align 4145; CHECK-NEXT: .LBB3_2: # %do.body146; CHECK-NEXT: # =>This Inner Loop Header: Depth=1147; CHECK-NEXT: cmpl %edx, %esi148; CHECK-NEXT: je .LBB3_5149; CHECK-NEXT: # %bb.3: # %do.cond150; CHECK-NEXT: # in Loop: Header=BB3_2 Depth=1151; CHECK-NEXT: incq %rax152; CHECK-NEXT: decq %rcx153; CHECK-NEXT: jne .LBB3_2154; CHECK-NEXT: .LBB3_4:155; CHECK-NEXT: xorl %eax, %eax156; CHECK-NEXT: .LBB3_5: # %return157; CHECK-NEXT: retq158entry:159 %cmp = icmp eq i64 %n, 0160 br i1 %cmp, label %return, label %preheader161 162preheader:163 %conv2 = and i32 %c, 255164 br label %do.body165 166do.body:167 %n.addr.0 = phi i64 [ %dec, %do.cond ], [ %n, %preheader ]168 %p.0 = phi ptr [ %incdec.ptr, %do.cond ], [ %s, %preheader ]169 %cmp3 = icmp eq i32 %a, %conv2170 br i1 %cmp3, label %return, label %do.cond171 172do.cond:173 %incdec.ptr = getelementptr inbounds i8, ptr %p.0, i64 1174 %dec = add i64 %n.addr.0, -1175 %cmp6 = icmp eq i64 %dec, 0176 br i1 %cmp6, label %return, label %do.body177 178return:179 %retval.0 = phi ptr [ null, %entry ], [ null, %do.cond ], [ %p.0, %do.body ]180 ret ptr %retval.0181}182 183; PR13578184@t2_global = external dso_local global i32185 186declare i1 @t2_func()187 188define i32 @t2() nounwind {189; CHECK-LABEL: t2:190; CHECK: # %bb.0:191; CHECK-NEXT: pushq %rax192; CHECK-NEXT: movl $42, t2_global(%rip)193; CHECK-NEXT: callq t2_func@PLT194; CHECK-NEXT: testb $1, %al195; CHECK-NEXT: je .LBB4_2196; CHECK-NEXT: # %bb.1: # %a197; CHECK-NEXT: movl t2_global(%rip), %eax198; CHECK-NEXT: popq %rcx199; CHECK-NEXT: retq200; CHECK-NEXT: .LBB4_2: # %b201; CHECK-NEXT: xorl %eax, %eax202; CHECK-NEXT: popq %rcx203; CHECK-NEXT: retq204 store i32 42, ptr @t2_global205 %c = call i1 @t2_func()206 br i1 %c, label %a, label %b207 208a:209 %l = load i32, ptr @t2_global210 ret i32 %l211 212b:213 ret i32 0214}215 216