brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.9 KiB · 68e10c0 Raw
310 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2 3; Verify the call site info. If the call site info is not4; in the valid state, an assert should be triggered.5; RUN: llc < %s -debug-entry-values -stop-after=machineverifier6 7; REQUIRES: asserts8; RUN: llc -mcpu=haswell < %s -O2 2>&1 | FileCheck %s9; For test:10; 2 invariant loads, 1 for OBJC_SELECTOR_REFERENCES_11; and 1 for objc_msgSend from the GOT12; For test_multi_def:13; 2 invariant load (full multiply, both loads should be hoisted.)14; For test_div_def:15; 2 invariant load (full divide, both loads should be hoisted.) 1 additional instruction for a zeroing edx that gets hoisted and then rematerialized.16 17target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"18target triple = "x86_64-apple-macosx10.7.2"19 20@"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"foo\00", section "__TEXT,__objc_methname,cstring_literals", align 121@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global ptr @"\01L_OBJC_METH_VAR_NAME_", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"22@"\01L_OBJC_IMAGE_INFO" = internal constant [2 x i32] [i32 0, i32 16], section "__DATA, __objc_imageinfo, regular, no_dead_strip"23@llvm.used = appending global [3 x ptr] [ptr @"\01L_OBJC_METH_VAR_NAME_", ptr @"\01L_OBJC_SELECTOR_REFERENCES_", ptr @"\01L_OBJC_IMAGE_INFO"], section "llvm.metadata"24 25define void @test(ptr %x) uwtable ssp {26; CHECK-LABEL: test:27; CHECK:       ## %bb.0: ## %entry28; CHECK-NEXT:    pushq %rbp29; CHECK-NEXT:    .cfi_def_cfa_offset 1630; CHECK-NEXT:    pushq %r1531; CHECK-NEXT:    .cfi_def_cfa_offset 2432; CHECK-NEXT:    pushq %r1433; CHECK-NEXT:    .cfi_def_cfa_offset 3234; CHECK-NEXT:    pushq %rbx35; CHECK-NEXT:    .cfi_def_cfa_offset 4036; CHECK-NEXT:    pushq %rax37; CHECK-NEXT:    .cfi_def_cfa_offset 4838; CHECK-NEXT:    .cfi_offset %rbx, -4039; CHECK-NEXT:    .cfi_offset %r14, -3240; CHECK-NEXT:    .cfi_offset %r15, -2441; CHECK-NEXT:    .cfi_offset %rbp, -1642; CHECK-NEXT:    movq %rdi, %rbx43; CHECK-NEXT:    movl $10000, %ebp ## imm = 0x271044; CHECK-NEXT:    movq L_OBJC_SELECTOR_REFERENCES_(%rip), %r1445; CHECK-NEXT:    movq _objc_msgSend@GOTPCREL(%rip), %r1546; CHECK-NEXT:    .p2align 447; CHECK-NEXT:  LBB0_1: ## %for.body48; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=149; CHECK-NEXT:    movq %rbx, %rdi50; CHECK-NEXT:    movq %r14, %rsi51; CHECK-NEXT:    callq *%r1552; CHECK-NEXT:    decl %ebp53; CHECK-NEXT:    jne LBB0_154; CHECK-NEXT:  ## %bb.2: ## %for.end55; CHECK-NEXT:    addq $8, %rsp56; CHECK-NEXT:    popq %rbx57; CHECK-NEXT:    popq %r1458; CHECK-NEXT:    popq %r1559; CHECK-NEXT:    popq %rbp60; CHECK-NEXT:    retq61entry:62  br label %for.body63 64for.body:                                         ; preds = %for.body, %entry65  %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]66  %0 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !invariant.load !067  %call = tail call ptr @objc_msgSend(ptr %x, ptr %0)68  %inc = add i32 %i.01, 169  %exitcond = icmp eq i32 %inc, 1000070  br i1 %exitcond, label %for.end, label %for.body71 72for.end:                                          ; preds = %for.body73  ret void74}75 76define void @test_unordered(ptr %x) uwtable ssp {77; CHECK-LABEL: test_unordered:78; CHECK:       ## %bb.0: ## %entry79; CHECK-NEXT:    pushq %rbp80; CHECK-NEXT:    .cfi_def_cfa_offset 1681; CHECK-NEXT:    pushq %r1582; CHECK-NEXT:    .cfi_def_cfa_offset 2483; CHECK-NEXT:    pushq %r1484; CHECK-NEXT:    .cfi_def_cfa_offset 3285; CHECK-NEXT:    pushq %rbx86; CHECK-NEXT:    .cfi_def_cfa_offset 4087; CHECK-NEXT:    pushq %rax88; CHECK-NEXT:    .cfi_def_cfa_offset 4889; CHECK-NEXT:    .cfi_offset %rbx, -4090; CHECK-NEXT:    .cfi_offset %r14, -3291; CHECK-NEXT:    .cfi_offset %r15, -2492; CHECK-NEXT:    .cfi_offset %rbp, -1693; CHECK-NEXT:    movq %rdi, %rbx94; CHECK-NEXT:    movl $10000, %ebp ## imm = 0x271095; CHECK-NEXT:    movq L_OBJC_SELECTOR_REFERENCES_(%rip), %r1496; CHECK-NEXT:    movq _objc_msgSend@GOTPCREL(%rip), %r1597; CHECK-NEXT:    .p2align 498; CHECK-NEXT:  LBB1_1: ## %for.body99; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1100; CHECK-NEXT:    movq %rbx, %rdi101; CHECK-NEXT:    movq %r14, %rsi102; CHECK-NEXT:    callq *%r15103; CHECK-NEXT:    decl %ebp104; CHECK-NEXT:    jne LBB1_1105; CHECK-NEXT:  ## %bb.2: ## %for.end106; CHECK-NEXT:    addq $8, %rsp107; CHECK-NEXT:    popq %rbx108; CHECK-NEXT:    popq %r14109; CHECK-NEXT:    popq %r15110; CHECK-NEXT:    popq %rbp111; CHECK-NEXT:    retq112entry:113  br label %for.body114 115for.body:                                         ; preds = %for.body, %entry116  %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]117  %0 = load atomic ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_" unordered, align 8, !invariant.load !0118  %call = tail call ptr @objc_msgSend(ptr %x, ptr %0)119  %inc = add i32 %i.01, 1120  %exitcond = icmp eq i32 %inc, 10000121  br i1 %exitcond, label %for.end, label %for.body122 123for.end:                                          ; preds = %for.body124  ret void125}126 127define void @test_volatile(ptr %x) uwtable ssp {128; CHECK-LABEL: test_volatile:129; CHECK:       ## %bb.0: ## %entry130; CHECK-NEXT:    pushq %rbp131; CHECK-NEXT:    .cfi_def_cfa_offset 16132; CHECK-NEXT:    pushq %r14133; CHECK-NEXT:    .cfi_def_cfa_offset 24134; CHECK-NEXT:    pushq %rbx135; CHECK-NEXT:    .cfi_def_cfa_offset 32136; CHECK-NEXT:    .cfi_offset %rbx, -32137; CHECK-NEXT:    .cfi_offset %r14, -24138; CHECK-NEXT:    .cfi_offset %rbp, -16139; CHECK-NEXT:    movq %rdi, %rbx140; CHECK-NEXT:    movl $10000, %ebp ## imm = 0x2710141; CHECK-NEXT:    movq _objc_msgSend@GOTPCREL(%rip), %r14142; CHECK-NEXT:    .p2align 4143; CHECK-NEXT:  LBB2_1: ## %for.body144; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1145; CHECK-NEXT:    movq L_OBJC_SELECTOR_REFERENCES_(%rip), %rsi146; CHECK-NEXT:    movq %rbx, %rdi147; CHECK-NEXT:    callq *%r14148; CHECK-NEXT:    decl %ebp149; CHECK-NEXT:    jne LBB2_1150; CHECK-NEXT:  ## %bb.2: ## %for.end151; CHECK-NEXT:    popq %rbx152; CHECK-NEXT:    popq %r14153; CHECK-NEXT:    popq %rbp154; CHECK-NEXT:    retq155entry:156  br label %for.body157 158for.body:                                         ; preds = %for.body, %entry159  %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]160  %0 = load volatile ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !invariant.load !0161  %call = tail call ptr @objc_msgSend(ptr %x, ptr %0)162  %inc = add i32 %i.01, 1163  %exitcond = icmp eq i32 %inc, 10000164  br i1 %exitcond, label %for.end, label %for.body165 166for.end:                                          ; preds = %for.body167  ret void168}169 170define void @test_seq_cst(ptr %x) uwtable ssp {171; CHECK-LABEL: test_seq_cst:172; CHECK:       ## %bb.0: ## %entry173; CHECK-NEXT:    pushq %rbp174; CHECK-NEXT:    .cfi_def_cfa_offset 16175; CHECK-NEXT:    pushq %r14176; CHECK-NEXT:    .cfi_def_cfa_offset 24177; CHECK-NEXT:    pushq %rbx178; CHECK-NEXT:    .cfi_def_cfa_offset 32179; CHECK-NEXT:    .cfi_offset %rbx, -32180; CHECK-NEXT:    .cfi_offset %r14, -24181; CHECK-NEXT:    .cfi_offset %rbp, -16182; CHECK-NEXT:    movq %rdi, %rbx183; CHECK-NEXT:    movl $10000, %ebp ## imm = 0x2710184; CHECK-NEXT:    movq _objc_msgSend@GOTPCREL(%rip), %r14185; CHECK-NEXT:    .p2align 4186; CHECK-NEXT:  LBB3_1: ## %for.body187; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1188; CHECK-NEXT:    movq L_OBJC_SELECTOR_REFERENCES_(%rip), %rsi189; CHECK-NEXT:    movq %rbx, %rdi190; CHECK-NEXT:    callq *%r14191; CHECK-NEXT:    decl %ebp192; CHECK-NEXT:    jne LBB3_1193; CHECK-NEXT:  ## %bb.2: ## %for.end194; CHECK-NEXT:    popq %rbx195; CHECK-NEXT:    popq %r14196; CHECK-NEXT:    popq %rbp197; CHECK-NEXT:    retq198entry:199  br label %for.body200 201for.body:                                         ; preds = %for.body, %entry202  %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]203  %0 = load atomic ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_" seq_cst, align 8, !invariant.load !0204  %call = tail call ptr @objc_msgSend(ptr %x, ptr %0)205  %inc = add i32 %i.01, 1206  %exitcond = icmp eq i32 %inc, 10000207  br i1 %exitcond, label %for.end, label %for.body208 209for.end:                                          ; preds = %for.body210  ret void211}212 213declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind214 215define void @test_multi_def(ptr dereferenceable(8) align(8) %x1,216; CHECK-LABEL: test_multi_def:217; CHECK:       ## %bb.0: ## %entry218; CHECK-NEXT:    movq %rdx, %rax219; CHECK-NEXT:    xorl %r8d, %r8d220; CHECK-NEXT:    movq (%rdi), %rdx221; CHECK-NEXT:    movq (%rsi), %rsi222; CHECK-NEXT:    .p2align 4223; CHECK-NEXT:  LBB4_2: ## %for.body224; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1225; CHECK-NEXT:    mulxq %rsi, %r9, %rdi226; CHECK-NEXT:    addq %r9, (%rax)227; CHECK-NEXT:    adcq %rdi, 8(%rax)228; CHECK-NEXT:  ## %bb.1: ## %for.check229; CHECK-NEXT:    ## in Loop: Header=BB4_2 Depth=1230; CHECK-NEXT:    incq %r8231; CHECK-NEXT:    addq $16, %rax232; CHECK-NEXT:    cmpq %rcx, %r8233; CHECK-NEXT:    jl LBB4_2234; CHECK-NEXT:  ## %bb.3: ## %exit235; CHECK-NEXT:    retq236                            ptr dereferenceable(8) align(8) %x2,237                            ptr %y, i64 %count) nounwind nofree nosync {238entry:239  br label %for.body240 241for.check:242  %inc = add nsw i64 %i, 1243  %done = icmp sge i64 %inc, %count244  br i1 %done, label %exit, label %for.body245 246for.body:247  %i = phi i64 [ 0, %entry ], [ %inc, %for.check ]248  %x1_load = load i64, ptr %x1, align 8, !invariant.load !0249  %x1_zext = zext i64 %x1_load to i128250  %x2_load = load i64, ptr %x2, align 8, !invariant.load !0251  %x2_zext = zext i64 %x2_load to i128252  %x_prod = mul i128 %x1_zext, %x2_zext253  %y_elem = getelementptr inbounds i128, ptr %y, i64 %i254  %y_load = load i128, ptr %y_elem, align 8255  %y_plus = add i128 %x_prod, %y_load256  store i128 %y_plus, ptr %y_elem, align 8257  br label %for.check258 259exit:260  ret void261}262 263define void @test_div_def(ptr dereferenceable(8) align(8) %x1,264; CHECK-LABEL: test_div_def:265; CHECK:       ## %bb.0: ## %entry266; CHECK-NEXT:    movq %rdx, %r8267; CHECK-NEXT:    xorl %r9d, %r9d268; CHECK-NEXT:    movl (%rdi), %edi269; CHECK-NEXT:    movl (%rsi), %esi270; CHECK-NEXT:    .p2align 4271; CHECK-NEXT:  LBB5_2: ## %for.body272; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1273; CHECK-NEXT:    movl %edi, %eax274; CHECK-NEXT:    xorl %edx, %edx275; CHECK-NEXT:    divl %esi276; CHECK-NEXT:    addl %eax, (%r8,%r9,4)277; CHECK-NEXT:  ## %bb.1: ## %for.check278; CHECK-NEXT:    ## in Loop: Header=BB5_2 Depth=1279; CHECK-NEXT:    incq %r9280; CHECK-NEXT:    cmpl %ecx, %r9d281; CHECK-NEXT:    jl LBB5_2282; CHECK-NEXT:  ## %bb.3: ## %exit283; CHECK-NEXT:    retq284                          ptr dereferenceable(8) align(8) %x2,285                          ptr %y, i32 %count) nounwind nofree nosync {286entry:287  br label %for.body288 289for.check:290  %inc = add nsw i32 %i, 1291  %done = icmp sge i32 %inc, %count292  br i1 %done, label %exit, label %for.body293 294for.body:295  %i = phi i32 [ 0, %entry ], [ %inc, %for.check ]296  %x1_load = load i32, ptr %x1, align 8, !invariant.load !0297  %x2_load = load i32, ptr %x2, align 8, !invariant.load !0298  %x_quot = udiv i32 %x1_load, %x2_load299  %y_elem = getelementptr inbounds i32, ptr %y, i32 %i300  %y_load = load i32, ptr %y_elem, align 8301  %y_plus = add i32 %x_quot, %y_load302  store i32 %y_plus, ptr %y_elem, align 8303  br label %for.check304 305exit:306  ret void307}308 309!0 = !{}310