122 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s3 4%"struct.std::array" = type { [4 x i64] }5 6define void @PR47857(ptr noalias nocapture writeonly sret(%"struct.std::array") align 8 %0, ptr nocapture noundef nonnull readonly align 8 dereferenceable(32) %1, ptr nocapture noundef nonnull readonly align 8 dereferenceable(32) %2) {7; CHECK-LABEL: PR47857:8; CHECK: # %bb.0:9; CHECK-NEXT: movq %rdi, %rax10; CHECK-NEXT: movq (%rdx), %r911; CHECK-NEXT: movq 8(%rdx), %rcx12; CHECK-NEXT: xorl %edi, %edi13; CHECK-NEXT: addq (%rsi), %r914; CHECK-NEXT: adcq 8(%rsi), %rcx15; CHECK-NEXT: movq 16(%rdx), %r816; CHECK-NEXT: adcq 16(%rsi), %r817; CHECK-NEXT: movq 24(%rdx), %rdx18; CHECK-NEXT: adcq 24(%rsi), %rdx19; CHECK-NEXT: sbbq %rdi, %rdi20; CHECK-NEXT: andl $38, %edi21; CHECK-NEXT: addq %rdi, %r922; CHECK-NEXT: adcq $0, %rcx23; CHECK-NEXT: adcq $0, %r824; CHECK-NEXT: adcq $0, %rdx25; CHECK-NEXT: sbbq %rdi, %rdi26; CHECK-NEXT: andl $38, %edi27; CHECK-NEXT: addq %r9, %rdi28; CHECK-NEXT: adcq $0, %rcx29; CHECK-NEXT: adcq $0, %r830; CHECK-NEXT: adcq $0, %rdx31; CHECK-NEXT: movq %rdi, (%rax)32; CHECK-NEXT: movq %rcx, 8(%rax)33; CHECK-NEXT: movq %r8, 16(%rax)34; CHECK-NEXT: movq %rdx, 24(%rax)35; CHECK-NEXT: retq36 %4 = load i64, ptr %1, align 837 %5 = getelementptr inbounds %"struct.std::array", ptr %1, i64 0, i32 0, i64 138 %6 = load i64, ptr %5, align 839 %7 = getelementptr inbounds %"struct.std::array", ptr %1, i64 0, i32 0, i64 240 %8 = load i64, ptr %7, align 841 %9 = getelementptr inbounds %"struct.std::array", ptr %1, i64 0, i32 0, i64 342 %10 = load i64, ptr %9, align 843 %11 = load i64, ptr %2, align 844 %12 = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %11, i64 %4)45 %13 = extractvalue { i64, i1 } %12, 046 %14 = extractvalue { i64, i1 } %12, 147 %15 = getelementptr inbounds %"struct.std::array", ptr %2, i64 0, i32 0, i64 148 %16 = load i64, ptr %15, align 849 %17 = zext i1 %14 to i850 %18 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %17, i64 %16, i64 %6)51 %19 = extractvalue { i8, i64 } %18, 152 %20 = extractvalue { i8, i64 } %18, 053 %21 = icmp ne i8 %20, 054 %22 = getelementptr inbounds %"struct.std::array", ptr %2, i64 0, i32 0, i64 255 %23 = load i64, ptr %22, align 856 %24 = zext i1 %21 to i857 %25 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %24, i64 %23, i64 %8)58 %26 = extractvalue { i8, i64 } %25, 159 %27 = extractvalue { i8, i64 } %25, 060 %28 = icmp ne i8 %27, 061 %29 = getelementptr inbounds %"struct.std::array", ptr %2, i64 0, i32 0, i64 362 %30 = load i64, ptr %29, align 863 %31 = zext i1 %28 to i864 %32 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %31, i64 %30, i64 %10)65 %33 = extractvalue { i8, i64 } %32, 166 %34 = extractvalue { i8, i64 } %32, 067 %35 = icmp ne i8 %34, 068 %36 = zext i1 %35 to i869 %37 = tail call { i8, i64 } @llvm.x86.subborrow.64(i8 %36, i64 0, i64 0)70 %38 = extractvalue { i8, i64 } %37, 171 %39 = and i64 %38, 3872 %40 = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %39, i64 %13)73 %41 = extractvalue { i64, i1 } %40, 074 %42 = extractvalue { i64, i1 } %40, 175 %43 = zext i1 %42 to i876 %44 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %43, i64 0, i64 %19)77 %45 = extractvalue { i8, i64 } %44, 178 %46 = extractvalue { i8, i64 } %44, 079 %47 = icmp ne i8 %46, 080 %48 = zext i1 %47 to i881 %49 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %48, i64 0, i64 %26)82 %50 = extractvalue { i8, i64 } %49, 183 %51 = extractvalue { i8, i64 } %49, 084 %52 = icmp ne i8 %51, 085 %53 = zext i1 %52 to i886 %54 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %53, i64 0, i64 %33)87 %55 = extractvalue { i8, i64 } %54, 188 %56 = extractvalue { i8, i64 } %54, 089 %57 = icmp ne i8 %56, 090 %58 = zext i1 %57 to i891 %59 = tail call { i8, i64 } @llvm.x86.subborrow.64(i8 %58, i64 %39, i64 %39)92 %60 = extractvalue { i8, i64 } %59, 193 %61 = and i64 %60, 3894 %62 = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %61, i64 %41)95 %63 = extractvalue { i64, i1 } %62, 096 %64 = extractvalue { i64, i1 } %62, 197 %65 = zext i1 %64 to i898 %66 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %65, i64 0, i64 %45)99 %67 = extractvalue { i8, i64 } %66, 1100 %68 = extractvalue { i8, i64 } %66, 0101 %69 = icmp ne i8 %68, 0102 %70 = zext i1 %69 to i8103 %71 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %70, i64 0, i64 %50)104 %72 = extractvalue { i8, i64 } %71, 1105 %73 = extractvalue { i8, i64 } %71, 0106 %74 = icmp ne i8 %73, 0107 %75 = zext i1 %74 to i8108 %76 = tail call { i8, i64 } @llvm.x86.addcarry.64(i8 %75, i64 0, i64 %55)109 %77 = extractvalue { i8, i64 } %76, 1110 store i64 %63, ptr %0, align 8111 %78 = getelementptr inbounds %"struct.std::array", ptr %0, i64 0, i32 0, i64 1112 store i64 %67, ptr %78, align 8113 %79 = getelementptr inbounds %"struct.std::array", ptr %0, i64 0, i32 0, i64 2114 store i64 %72, ptr %79, align 8115 %80 = getelementptr inbounds %"struct.std::array", ptr %0, i64 0, i32 0, i64 3116 store i64 %77, ptr %80, align 8117 ret void118}119declare { i8, i64 } @llvm.x86.addcarry.64(i8, i64, i64)120declare { i8, i64 } @llvm.x86.subborrow.64(i8, i64, i64)121declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64)122