brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.8 KiB · 72e4fe4 Raw
293 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s3 4; Function Attrs: nounwind uwtable5define void @tail_dup_merge_loops(i32 %a, ptr %b, ptr %c) local_unnamed_addr #0 {6; CHECK-LABEL: tail_dup_merge_loops:7; CHECK:       # %bb.0: # %entry8; CHECK-NEXT:    jmp .LBB0_19; CHECK-NEXT:    .p2align 410; CHECK-NEXT:  .LBB0_3: # %inner_loop_exit11; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=112; CHECK-NEXT:    incq %rsi13; CHECK-NEXT:  .LBB0_1: # %outer_loop_top14; CHECK-NEXT:    # =>This Loop Header: Depth=115; CHECK-NEXT:    # Child Loop BB0_4 Depth 216; CHECK-NEXT:    testl %edi, %edi17; CHECK-NEXT:    je .LBB0_518; CHECK-NEXT:    .p2align 419; CHECK-NEXT:  # %bb.2: # %inner_loop_top20; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=121; CHECK-NEXT:    cmpb $0, (%rsi)22; CHECK-NEXT:    js .LBB0_323; CHECK-NEXT:  .LBB0_4: # %inner_loop_latch24; CHECK-NEXT:    # Parent Loop BB0_1 Depth=125; CHECK-NEXT:    # => This Inner Loop Header: Depth=226; CHECK-NEXT:    addq $2, %rsi27; CHECK-NEXT:    cmpb $0, (%rsi)28; CHECK-NEXT:    jns .LBB0_429; CHECK-NEXT:    jmp .LBB0_330; CHECK-NEXT:  .LBB0_5: # %exit31; CHECK-NEXT:    retq32entry:33  %notlhs674.i = icmp eq i32 %a, 034  br label %outer_loop_top35 36outer_loop_top:                         ; preds = %inner_loop_exit, %entry37  %dst.0.ph.i = phi ptr [ %b, %entry ], [ %scevgep679.i, %inner_loop_exit ]38  br i1 %notlhs674.i, label %exit, label %inner_loop_preheader39 40inner_loop_preheader:                           ; preds = %outer_loop_top41  br label %inner_loop_top42 43inner_loop_top:                                     ; preds = %inner_loop_latch, %inner_loop_preheader44  %dst.0.i = phi ptr [ %inc, %inner_loop_latch ], [ %dst.0.ph.i, %inner_loop_preheader ]45  %var = load i8, ptr %dst.0.i46  %tobool1.i = icmp slt i8 %var, 047  br label %inner_loop_test48 49inner_loop_test:                                       ; preds = %inner_loop_top50  br i1 %tobool1.i, label %inner_loop_exit, label %inner_loop_latch51 52inner_loop_exit:                       ; preds = %inner_loop_test53  %scevgep.i = getelementptr i8, ptr %dst.0.i, i64 154  %scevgep679.i = getelementptr i8, ptr %scevgep.i, i64 055  br label %outer_loop_top56 57inner_loop_latch:                                ; preds = %inner_loop_test58  %cmp75.i = icmp ult ptr %dst.0.i, %c59  %inc = getelementptr i8, ptr %dst.0.i, i64 260  br label %inner_loop_top61 62exit:                              ; preds = %outer_loop_top63  ret void64}65 66@.str.6 = external unnamed_addr constant [23 x i8], align 167 68; There is an erroneus check in LoopBase::addBasicBlockToLoop(), where it69; assumes that the header block for a loop is unique.70; For most of compilation this assumption is true, but during layout we allow71; this assumption to be violated. The following code will trigger the bug:72 73; The loops in question is eventually headed by the block shared_loop_header74;75; During layout The block labeled outer_loop_header gets tail-duplicated into76; outer_loop_latch, and into shared_preheader, and then removed. This leaves77; shared_loop_header as the header of both loops. The end result78; is that there are 2 valid loops, and that they share a header. If we re-ran79; the loop analysis, it would classify this as a single loop.80; So far this is fine as far as layout is concerned.81; After layout we tail merge blocks merge_other and merge_predecessor_split.82; We do this even though they share only a single instruction, because83; merge_predecessor_split falls through to their shared successor:84; outer_loop_latch.85; The rest of the blocks in the function are noise unfortunately. Bugpoint86; couldn't shrink the test any further.87 88define i32 @loop_shared_header(ptr %exe, i32 %exesz, i32 %headsize, i32 %min, i32 %wwprva, i32 %e_lfanew, ptr readonly %wwp, i32 %wwpsz, i16 zeroext %sects) local_unnamed_addr #0 {89; CHECK-LABEL: loop_shared_header:90; CHECK:       # %bb.0: # %entry91; CHECK-NEXT:    pushq %rbp92; CHECK-NEXT:    pushq %r1593; CHECK-NEXT:    pushq %r1494; CHECK-NEXT:    pushq %r1295; CHECK-NEXT:    pushq %rbx96; CHECK-NEXT:    movl $1, %ebx97; CHECK-NEXT:    xorl %eax, %eax98; CHECK-NEXT:    testb %al, %al99; CHECK-NEXT:    jne .LBB1_12100; CHECK-NEXT:  # %bb.1: # %if.end19101; CHECK-NEXT:    movl (%rax), %r12d102; CHECK-NEXT:    leal (,%r12,4), %ebp103; CHECK-NEXT:    movl %ebp, %r15d104; CHECK-NEXT:    movl $1, %esi105; CHECK-NEXT:    movq %r15, %rdi106; CHECK-NEXT:    callq cli_calloc@PLT107; CHECK-NEXT:    movq %rax, %r14108; CHECK-NEXT:    movb $1, %al109; CHECK-NEXT:    testb %al, %al110; CHECK-NEXT:    jne .LBB1_12111; CHECK-NEXT:  # %bb.2: # %if.end50112; CHECK-NEXT:    movq %r14, %rdi113; CHECK-NEXT:    movq %r15, %rdx114; CHECK-NEXT:    callq memcpy@PLT115; CHECK-NEXT:    cmpl $4, %ebp116; CHECK-NEXT:    jb .LBB1_19117; CHECK-NEXT:  # %bb.3: # %shared_preheader118; CHECK-NEXT:    movb $32, %cl119; CHECK-NEXT:    xorl %eax, %eax120; CHECK-NEXT:    jmp .LBB1_4121; CHECK-NEXT:    .p2align 4122; CHECK-NEXT:  .LBB1_15: # %merge_predecessor_split123; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1124; CHECK-NEXT:    movb $32, %cl125; CHECK-NEXT:  .LBB1_4: # %outer_loop_header126; CHECK-NEXT:    # =>This Loop Header: Depth=1127; CHECK-NEXT:    # Child Loop BB1_8 Depth 2128; CHECK-NEXT:    testl %r12d, %r12d129; CHECK-NEXT:    je .LBB1_5130; CHECK-NEXT:    .p2align 4131; CHECK-NEXT:  .LBB1_8: # %shared_loop_header132; CHECK-NEXT:    # Parent Loop BB1_4 Depth=1133; CHECK-NEXT:    # => This Inner Loop Header: Depth=2134; CHECK-NEXT:    testq %r14, %r14135; CHECK-NEXT:    jne .LBB1_18136; CHECK-NEXT:  # %bb.9: # %inner_loop_body137; CHECK-NEXT:    # in Loop: Header=BB1_8 Depth=2138; CHECK-NEXT:    testb %al, %al139; CHECK-NEXT:    je .LBB1_8140; CHECK-NEXT:  # %bb.10: # %if.end96.i141; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1142; CHECK-NEXT:    cmpl $3, %r12d143; CHECK-NEXT:    jae .LBB1_11144; CHECK-NEXT:  # %bb.13: # %if.end287.i145; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1146; CHECK-NEXT:    testb %al, %al147; CHECK-NEXT:    # implicit-def: $cl148; CHECK-NEXT:    jne .LBB1_4149; CHECK-NEXT:  # %bb.14: # %if.end308.i150; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1151; CHECK-NEXT:    testb %al, %al152; CHECK-NEXT:    je .LBB1_15153; CHECK-NEXT:  # %bb.16: # %if.end335.i154; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1155; CHECK-NEXT:    xorl %ecx, %ecx156; CHECK-NEXT:    testb %cl, %cl157; CHECK-NEXT:    jne .LBB1_4158; CHECK-NEXT:  # %bb.17: # %merge_other159; CHECK-NEXT:    # in Loop: Header=BB1_4 Depth=1160; CHECK-NEXT:    # implicit-def: $cl161; CHECK-NEXT:    jmp .LBB1_4162; CHECK-NEXT:  .LBB1_5: # %while.cond.us1412.i163; CHECK-NEXT:    xorl %eax, %eax164; CHECK-NEXT:    testb %al, %al165; CHECK-NEXT:    jne .LBB1_7166; CHECK-NEXT:  # %bb.6: # %while.cond.us1412.i167; CHECK-NEXT:    decb %cl168; CHECK-NEXT:    jne .LBB1_12169; CHECK-NEXT:  .LBB1_7: # %if.end41.us1436.i170; CHECK-NEXT:  .LBB1_11: # %if.then99.i171; CHECK-NEXT:    movq .str.6@GOTPCREL(%rip), %rdi172; CHECK-NEXT:    xorl %ebx, %ebx173; CHECK-NEXT:    xorl %eax, %eax174; CHECK-NEXT:    callq cli_dbgmsg@PLT175; CHECK-NEXT:  .LBB1_12: # %cleanup176; CHECK-NEXT:    movl %ebx, %eax177; CHECK-NEXT:    popq %rbx178; CHECK-NEXT:    popq %r12179; CHECK-NEXT:    popq %r14180; CHECK-NEXT:    popq %r15181; CHECK-NEXT:    popq %rbp182; CHECK-NEXT:    retq183; CHECK-NEXT:  .LBB1_18: # %wunpsect.exit.thread.loopexit389184; CHECK-NEXT:  .LBB1_19: # %wunpsect.exit.thread.loopexit391185entry:186  %0 = load i32, ptr undef, align 4187  %mul = shl nsw i32 %0, 2188  br i1 undef, label %if.end19, label %cleanup189 190if.end19:                                         ; preds = %entry191  %conv = zext i32 %mul to i64192  %call = tail call ptr @cli_calloc(i64 %conv, i64 1)193  %1 = icmp eq i32 %exesz, 0194  %notrhs = icmp eq i32 %0, 0195  %or.cond117.not = or i1 %1, %notrhs196  %or.cond202 = or i1 %or.cond117.not, undef197  %cmp35 = icmp ult ptr %call, %exe198  %or.cond203 = or i1 %or.cond202, %cmp35199  br i1 %or.cond203, label %cleanup, label %if.end50200 201if.end50:                                         ; preds = %if.end19202  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull %call, ptr undef, i64 %conv, i1 false)203  %cmp1.i.i = icmp ugt i32 %mul, 3204  br i1 %cmp1.i.i, label %shared_preheader, label %wunpsect.exit.thread.loopexit391205 206shared_preheader:                                 ; preds = %if.end50207  br label %outer_loop_header208 209outer_loop_header:                                ; preds = %outer_loop_latch, %shared_preheader210  %bits.1.i = phi i8 [ 32, %shared_preheader ], [ %bits.43.i, %outer_loop_latch ]211  %dst.0.ph.i = phi ptr [ undef, %shared_preheader ], [ %scevgep679.i, %outer_loop_latch ]212  %2 = icmp eq i32 %0, 0213  br i1 %2, label %while.cond.us1412.i, label %shared_loop_header214 215while.cond.us1412.i:                              ; preds = %outer_loop_header216  %.pre.i = add i8 %bits.1.i, -1217  %tobool2.us1420.i = icmp eq i8 %.pre.i, 0218  %or.cond.us1421.i = or i1 undef, %tobool2.us1420.i219  br i1 %or.cond.us1421.i, label %if.end41.us1436.i, label %cleanup220 221if.end41.us1436.i:                                ; preds = %while.cond.us1412.i222  unreachable223 224shared_loop_header:                               ; preds = %dup_early2, %dup_early1225  %dst.0.i = phi ptr [ undef, %inner_loop_body ], [ %dst.0.ph.i, %outer_loop_header ], [ undef, %dead_block ]226  %cmp3.i1172.i = icmp ult ptr null, %call227  br i1 %cmp3.i1172.i, label %wunpsect.exit.thread.loopexit389, label %inner_loop_body228 229inner_loop_body:                                  ; preds = %shared_loop_header230  %3 = icmp slt i32 undef, 0231  br i1 %3, label %if.end96.i, label %shared_loop_header232 233dead_block:                                       ; preds = %inner_loop_body234  %cmp75.i = icmp ult ptr %dst.0.i, null235  br label %shared_loop_header236 237if.end96.i:                                       ; preds = %inner_loop_body238  %cmp97.i = icmp ugt i32 %0, 2239  br i1 %cmp97.i, label %if.then99.i, label %if.end287.i240 241if.then99.i:                                      ; preds = %if.end96.i242  tail call void (ptr, ...) @cli_dbgmsg(ptr @.str.6, i32 undef)243  br label %cleanup244 245if.end287.i:                                      ; preds = %if.end96.i246  %cmp291.i = icmp ne i32 %0, 1247  %conv294.i = select i1 %cmp291.i, i16 4, i16 3248  br i1 undef, label %if.end308.i, label %outer_loop_latch249 250if.end308.i:                                      ; preds = %if.end287.i251  br i1 undef, label %if.end335.i, label %merge_predecessor_split252 253merge_predecessor_split:                          ; preds = %if.end308.i254  %4 = bitcast ptr undef to ptr255  br label %outer_loop_latch256 257if.end335.i:                                      ; preds = %if.end308.i258  br i1 undef, label %outer_loop_latch, label %merge_other259 260merge_other:                                      ; preds = %if.end335.i261  br label %outer_loop_latch262 263outer_loop_latch:                                 ; preds = %merge_other, %if.end335.i, %merge_predecessor_split, %if.end287.i264  %bits.43.i = phi i8 [ undef, %if.end287.i ], [ undef, %merge_other ], [ 32, %merge_predecessor_split ], [ 0, %if.end335.i ]265  %backsize.0.i = phi i16 [ %conv294.i, %if.end287.i ], [ 0, %merge_other ], [ 0, %merge_predecessor_split ], [ 0, %if.end335.i ]266  %5 = add i16 %backsize.0.i, -1267  %6 = zext i16 %5 to i64268  %scevgep.i = getelementptr i8, ptr %dst.0.ph.i, i64 1269  %scevgep679.i = getelementptr i8, ptr %scevgep.i, i64 %6270  br label %outer_loop_header271 272wunpsect.exit.thread.loopexit389:                 ; preds = %shared_loop_header273  unreachable274 275wunpsect.exit.thread.loopexit391:                 ; preds = %if.end50276  unreachable277 278cleanup:                                          ; preds = %if.then99.i, %while.cond.us1412.i, %if.end19, %entry279  %retval.0 = phi i32 [ 0, %if.then99.i ], [ 1, %entry ], [ 1, %if.end19 ], [ 1, %while.cond.us1412.i ]280  ret i32 %retval.0281}282 283; Function Attrs: nounwind284declare void @cli_dbgmsg(ptr, ...) local_unnamed_addr #0285 286; Function Attrs: nounwind287declare ptr @cli_calloc(i64, i64) local_unnamed_addr #0288 289; Function Attrs: argmemonly nounwind290declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) #1291attributes #0 = { nounwind }292attributes #1 = { argmemonly nounwind }293