brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.7 KiB · 6449c3e Raw
857 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -debugify-and-strip-all-safe < %s -mtriple=aarch64-linux-gnu | FileCheck %s3 4; marked as external to prevent possible optimizations5@a = external global i326@b = external global i327@c = external global i328@d = external global i329 10; (a > 10 && b == c) || (a >= 10 && b == d)11define i32 @combine_gt_ge_10() #0 {12; CHECK-LABEL: combine_gt_ge_10:13; CHECK:       // %bb.0: // %entry14; CHECK-NEXT:    adrp x8, :got:a15; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]16; CHECK-NEXT:    ldr w8, [x8]17; CHECK-NEXT:    cmp w8, #1018; CHECK-NEXT:    adrp x8, :got:b19; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]20; CHECK-NEXT:    b.le .LBB0_321; CHECK-NEXT:  // %bb.1: // %land.lhs.true22; CHECK-NEXT:    adrp x9, :got:c23; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]24; CHECK-NEXT:    ldr w10, [x8]25; CHECK-NEXT:    ldr w9, [x9]26; CHECK-NEXT:    cmp w10, w927; CHECK-NEXT:    b.ne .LBB0_428; CHECK-NEXT:  // %bb.2:29; CHECK-NEXT:    mov w0, #1 // =0x130; CHECK-NEXT:    ret31; CHECK-NEXT:  .LBB0_3: // %lor.lhs.false32; CHECK-NEXT:    b.lt .LBB0_633; CHECK-NEXT:  .LBB0_4: // %land.lhs.true334; CHECK-NEXT:    adrp x9, :got:d35; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]36; CHECK-NEXT:    ldr w8, [x8]37; CHECK-NEXT:    ldr w9, [x9]38; CHECK-NEXT:    cmp w8, w939; CHECK-NEXT:    b.ne .LBB0_640; CHECK-NEXT:  // %bb.5:41; CHECK-NEXT:    mov w0, #1 // =0x142; CHECK-NEXT:    ret43; CHECK-NEXT:  .LBB0_6: // %if.end44; CHECK-NEXT:    mov w0, wzr45; CHECK-NEXT:    ret46entry:47  %0 = load i32, ptr @a, align 448  %cmp = icmp sgt i32 %0, 1049  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false50 51land.lhs.true:                                    ; preds = %entry52  %1 = load i32, ptr @b, align 453  %2 = load i32, ptr @c, align 454  %cmp1 = icmp eq i32 %1, %255  br i1 %cmp1, label %return, label %land.lhs.true356 57lor.lhs.false:                                    ; preds = %entry58  %cmp2 = icmp sgt i32 %0, 959  br i1 %cmp2, label %land.lhs.true3, label %if.end60 61land.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true62  %3 = load i32, ptr @b, align 463  %4 = load i32, ptr @d, align 464  %cmp4 = icmp eq i32 %3, %465  br i1 %cmp4, label %return, label %if.end66 67if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false68  br label %return69 70return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true71  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]72  ret i32 %retval.073}74 75; (a > 5 && b == c) || (a < 5 && b == d)76define i32 @combine_gt_lt_5() #0 {77; CHECK-LABEL: combine_gt_lt_5:78; CHECK:       // %bb.0: // %entry79; CHECK-NEXT:    adrp x8, :got:a80; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]81; CHECK-NEXT:    ldr w8, [x8]82; CHECK-NEXT:    cmp w8, #583; CHECK-NEXT:    b.le .LBB1_384; CHECK-NEXT:  // %bb.1: // %land.lhs.true85; CHECK-NEXT:    adrp x8, :got:b86; CHECK-NEXT:    adrp x9, :got:c87; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]88; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]89; CHECK-NEXT:    ldr w8, [x8]90; CHECK-NEXT:    ldr w9, [x9]91; CHECK-NEXT:    cmp w8, w992; CHECK-NEXT:    b.ne .LBB1_693; CHECK-NEXT:  // %bb.2:94; CHECK-NEXT:    mov w0, #1 // =0x195; CHECK-NEXT:    ret96; CHECK-NEXT:  .LBB1_3: // %lor.lhs.false97; CHECK-NEXT:    b.ge .LBB1_698; CHECK-NEXT:  // %bb.4: // %land.lhs.true399; CHECK-NEXT:    adrp x8, :got:b100; CHECK-NEXT:    adrp x9, :got:d101; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]102; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]103; CHECK-NEXT:    ldr w8, [x8]104; CHECK-NEXT:    ldr w9, [x9]105; CHECK-NEXT:    cmp w8, w9106; CHECK-NEXT:    b.ne .LBB1_6107; CHECK-NEXT:  // %bb.5:108; CHECK-NEXT:    mov w0, #1 // =0x1109; CHECK-NEXT:    ret110; CHECK-NEXT:  .LBB1_6: // %if.end111; CHECK-NEXT:    mov w0, wzr112; CHECK-NEXT:    ret113entry:114  %0 = load i32, ptr @a, align 4115  %cmp = icmp sgt i32 %0, 5116  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false117 118land.lhs.true:                                    ; preds = %entry119  %1 = load i32, ptr @b, align 4120  %2 = load i32, ptr @c, align 4121  %cmp1 = icmp eq i32 %1, %2122  br i1 %cmp1, label %return, label %if.end123 124lor.lhs.false:                                    ; preds = %entry125  %cmp2 = icmp slt i32 %0, 5126  br i1 %cmp2, label %land.lhs.true3, label %if.end127 128land.lhs.true3:                                   ; preds = %lor.lhs.false129  %3 = load i32, ptr @b, align 4130  %4 = load i32, ptr @d, align 4131  %cmp4 = icmp eq i32 %3, %4132  br i1 %cmp4, label %return, label %if.end133 134if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true135  br label %return136 137return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true138  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]139  ret i32 %retval.0140}141 142; (a < 5 && b == c) || (a <= 5 && b == d)143define i32 @combine_lt_ge_5() #0 {144; CHECK-LABEL: combine_lt_ge_5:145; CHECK:       // %bb.0: // %entry146; CHECK-NEXT:    adrp x8, :got:a147; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]148; CHECK-NEXT:    ldr w8, [x8]149; CHECK-NEXT:    cmp w8, #5150; CHECK-NEXT:    adrp x8, :got:b151; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]152; CHECK-NEXT:    b.ge .LBB2_3153; CHECK-NEXT:  // %bb.1: // %land.lhs.true154; CHECK-NEXT:    adrp x9, :got:c155; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]156; CHECK-NEXT:    ldr w10, [x8]157; CHECK-NEXT:    ldr w9, [x9]158; CHECK-NEXT:    cmp w10, w9159; CHECK-NEXT:    b.ne .LBB2_4160; CHECK-NEXT:  // %bb.2:161; CHECK-NEXT:    mov w0, #1 // =0x1162; CHECK-NEXT:    ret163; CHECK-NEXT:  .LBB2_3: // %lor.lhs.false164; CHECK-NEXT:    b.gt .LBB2_6165; CHECK-NEXT:  .LBB2_4: // %land.lhs.true3166; CHECK-NEXT:    adrp x9, :got:d167; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]168; CHECK-NEXT:    ldr w8, [x8]169; CHECK-NEXT:    ldr w9, [x9]170; CHECK-NEXT:    cmp w8, w9171; CHECK-NEXT:    b.ne .LBB2_6172; CHECK-NEXT:  // %bb.5:173; CHECK-NEXT:    mov w0, #1 // =0x1174; CHECK-NEXT:    ret175; CHECK-NEXT:  .LBB2_6: // %if.end176; CHECK-NEXT:    mov w0, wzr177; CHECK-NEXT:    ret178entry:179  %0 = load i32, ptr @a, align 4180  %cmp = icmp slt i32 %0, 5181  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false182 183land.lhs.true:                                    ; preds = %entry184  %1 = load i32, ptr @b, align 4185  %2 = load i32, ptr @c, align 4186  %cmp1 = icmp eq i32 %1, %2187  br i1 %cmp1, label %return, label %land.lhs.true3188 189lor.lhs.false:                                    ; preds = %entry190  %cmp2 = icmp slt i32 %0, 6191  br i1 %cmp2, label %land.lhs.true3, label %if.end192 193land.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true194  %3 = load i32, ptr @b, align 4195  %4 = load i32, ptr @d, align 4196  %cmp4 = icmp eq i32 %3, %4197  br i1 %cmp4, label %return, label %if.end198 199if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false200  br label %return201 202return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true203  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]204  ret i32 %retval.0205}206 207; (a < 5 && b == c) || (a > 5 && b == d)208define i32 @combine_lt_gt_5() #0 {209; CHECK-LABEL: combine_lt_gt_5:210; CHECK:       // %bb.0: // %entry211; CHECK-NEXT:    adrp x8, :got:a212; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]213; CHECK-NEXT:    ldr w8, [x8]214; CHECK-NEXT:    cmp w8, #5215; CHECK-NEXT:    b.ge .LBB3_3216; CHECK-NEXT:  // %bb.1: // %land.lhs.true217; CHECK-NEXT:    adrp x8, :got:b218; CHECK-NEXT:    adrp x9, :got:c219; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]220; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]221; CHECK-NEXT:    ldr w8, [x8]222; CHECK-NEXT:    ldr w9, [x9]223; CHECK-NEXT:    cmp w8, w9224; CHECK-NEXT:    b.ne .LBB3_6225; CHECK-NEXT:  // %bb.2:226; CHECK-NEXT:    mov w0, #1 // =0x1227; CHECK-NEXT:    ret228; CHECK-NEXT:  .LBB3_3: // %lor.lhs.false229; CHECK-NEXT:    b.le .LBB3_6230; CHECK-NEXT:  // %bb.4: // %land.lhs.true3231; CHECK-NEXT:    adrp x8, :got:b232; CHECK-NEXT:    adrp x9, :got:d233; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]234; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]235; CHECK-NEXT:    ldr w8, [x8]236; CHECK-NEXT:    ldr w9, [x9]237; CHECK-NEXT:    cmp w8, w9238; CHECK-NEXT:    b.ne .LBB3_6239; CHECK-NEXT:  // %bb.5:240; CHECK-NEXT:    mov w0, #1 // =0x1241; CHECK-NEXT:    ret242; CHECK-NEXT:  .LBB3_6: // %if.end243; CHECK-NEXT:    mov w0, wzr244; CHECK-NEXT:    ret245entry:246  %0 = load i32, ptr @a, align 4247  %cmp = icmp slt i32 %0, 5248  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false249 250land.lhs.true:                                    ; preds = %entry251  %1 = load i32, ptr @b, align 4252  %2 = load i32, ptr @c, align 4253  %cmp1 = icmp eq i32 %1, %2254  br i1 %cmp1, label %return, label %if.end255 256lor.lhs.false:                                    ; preds = %entry257  %cmp2 = icmp sgt i32 %0, 5258  br i1 %cmp2, label %land.lhs.true3, label %if.end259 260land.lhs.true3:                                   ; preds = %lor.lhs.false261  %3 = load i32, ptr @b, align 4262  %4 = load i32, ptr @d, align 4263  %cmp4 = icmp eq i32 %3, %4264  br i1 %cmp4, label %return, label %if.end265 266if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true267  br label %return268 269return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true270  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]271  ret i32 %retval.0272}273 274; (a > -5 && b == c) || (a < -5 && b == d)275define i32 @combine_gt_lt_n5() #0 {276; CHECK-LABEL: combine_gt_lt_n5:277; CHECK:       // %bb.0: // %entry278; CHECK-NEXT:    adrp x8, :got:a279; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]280; CHECK-NEXT:    ldr w8, [x8]281; CHECK-NEXT:    cmn w8, #5282; CHECK-NEXT:    b.le .LBB4_3283; CHECK-NEXT:  // %bb.1: // %land.lhs.true284; CHECK-NEXT:    adrp x8, :got:b285; CHECK-NEXT:    adrp x9, :got:c286; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]287; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]288; CHECK-NEXT:    ldr w8, [x8]289; CHECK-NEXT:    ldr w9, [x9]290; CHECK-NEXT:    cmp w8, w9291; CHECK-NEXT:    b.ne .LBB4_6292; CHECK-NEXT:  // %bb.2:293; CHECK-NEXT:    mov w0, #1 // =0x1294; CHECK-NEXT:    ret295; CHECK-NEXT:  .LBB4_3: // %lor.lhs.false296; CHECK-NEXT:    b.ge .LBB4_6297; CHECK-NEXT:  // %bb.4: // %land.lhs.true3298; CHECK-NEXT:    adrp x8, :got:b299; CHECK-NEXT:    adrp x9, :got:d300; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]301; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]302; CHECK-NEXT:    ldr w8, [x8]303; CHECK-NEXT:    ldr w9, [x9]304; CHECK-NEXT:    cmp w8, w9305; CHECK-NEXT:    b.ne .LBB4_6306; CHECK-NEXT:  // %bb.5:307; CHECK-NEXT:    mov w0, #1 // =0x1308; CHECK-NEXT:    ret309; CHECK-NEXT:  .LBB4_6: // %if.end310; CHECK-NEXT:    mov w0, wzr311; CHECK-NEXT:    ret312entry:313  %0 = load i32, ptr @a, align 4314  %cmp = icmp sgt i32 %0, -5315  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false316 317land.lhs.true:                                    ; preds = %entry318  %1 = load i32, ptr @b, align 4319  %2 = load i32, ptr @c, align 4320  %cmp1 = icmp eq i32 %1, %2321  br i1 %cmp1, label %return, label %if.end322 323lor.lhs.false:                                    ; preds = %entry324  %cmp2 = icmp slt i32 %0, -5325  br i1 %cmp2, label %land.lhs.true3, label %if.end326 327land.lhs.true3:                                   ; preds = %lor.lhs.false328  %3 = load i32, ptr @b, align 4329  %4 = load i32, ptr @d, align 4330  %cmp4 = icmp eq i32 %3, %4331  br i1 %cmp4, label %return, label %if.end332 333if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true334  br label %return335 336return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true337  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]338  ret i32 %retval.0339}340 341; (a < -5 && b == c) || (a > -5 && b == d)342define i32 @combine_lt_gt_n5() #0 {343; CHECK-LABEL: combine_lt_gt_n5:344; CHECK:       // %bb.0: // %entry345; CHECK-NEXT:    adrp x8, :got:a346; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]347; CHECK-NEXT:    ldr w8, [x8]348; CHECK-NEXT:    cmn w8, #5349; CHECK-NEXT:    b.ge .LBB5_3350; CHECK-NEXT:  // %bb.1: // %land.lhs.true351; CHECK-NEXT:    adrp x8, :got:b352; CHECK-NEXT:    adrp x9, :got:c353; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]354; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]355; CHECK-NEXT:    ldr w8, [x8]356; CHECK-NEXT:    ldr w9, [x9]357; CHECK-NEXT:    cmp w8, w9358; CHECK-NEXT:    b.ne .LBB5_6359; CHECK-NEXT:  // %bb.2:360; CHECK-NEXT:    mov w0, #1 // =0x1361; CHECK-NEXT:    ret362; CHECK-NEXT:  .LBB5_3: // %lor.lhs.false363; CHECK-NEXT:    b.le .LBB5_6364; CHECK-NEXT:  // %bb.4: // %land.lhs.true3365; CHECK-NEXT:    adrp x8, :got:b366; CHECK-NEXT:    adrp x9, :got:d367; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]368; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]369; CHECK-NEXT:    ldr w8, [x8]370; CHECK-NEXT:    ldr w9, [x9]371; CHECK-NEXT:    cmp w8, w9372; CHECK-NEXT:    b.ne .LBB5_6373; CHECK-NEXT:  // %bb.5:374; CHECK-NEXT:    mov w0, #1 // =0x1375; CHECK-NEXT:    ret376; CHECK-NEXT:  .LBB5_6: // %if.end377; CHECK-NEXT:    mov w0, wzr378; CHECK-NEXT:    ret379entry:380  %0 = load i32, ptr @a, align 4381  %cmp = icmp slt i32 %0, -5382  br i1 %cmp, label %land.lhs.true, label %lor.lhs.false383 384land.lhs.true:                                    ; preds = %entry385  %1 = load i32, ptr @b, align 4386  %2 = load i32, ptr @c, align 4387  %cmp1 = icmp eq i32 %1, %2388  br i1 %cmp1, label %return, label %if.end389 390lor.lhs.false:                                    ; preds = %entry391  %cmp2 = icmp sgt i32 %0, -5392  br i1 %cmp2, label %land.lhs.true3, label %if.end393 394land.lhs.true3:                                   ; preds = %lor.lhs.false395  %3 = load i32, ptr @b, align 4396  %4 = load i32, ptr @d, align 4397  %cmp4 = icmp eq i32 %3, %4398  br i1 %cmp4, label %return, label %if.end399 400if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true401  br label %return402 403return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true404  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]405  ret i32 %retval.0406}407 408%struct.Struct = type { i64, i64 }409 410@glob = internal unnamed_addr global ptr null, align 8411 412declare ptr @Update(ptr) #1413 414; no checks for this case, it just should be processed without errors415define void @combine_non_adjacent_cmp_br(ptr nocapture readonly %hdCall) #0 {416; CHECK-LABEL: combine_non_adjacent_cmp_br:417; CHECK:       // %bb.0: // %entry418; CHECK-NEXT:    str x30, [sp, #-48]! // 8-byte Folded Spill419; CHECK-NEXT:    .cfi_def_cfa_offset 48420; CHECK-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill421; CHECK-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill422; CHECK-NEXT:    .cfi_offset w19, -8423; CHECK-NEXT:    .cfi_offset w20, -16424; CHECK-NEXT:    .cfi_offset w21, -24425; CHECK-NEXT:    .cfi_offset w22, -32426; CHECK-NEXT:    .cfi_offset w30, -48427; CHECK-NEXT:    ldr x20, [x0]428; CHECK-NEXT:    mov w19, #24 // =0x18429; CHECK-NEXT:    adrp x22, glob430; CHECK-NEXT:    add x21, x20, #2431; CHECK-NEXT:  .LBB6_1: // %land.rhs432; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1433; CHECK-NEXT:    ldr x8, [x19]434; CHECK-NEXT:    cmp x8, #1435; CHECK-NEXT:    b.lt .LBB6_3436; CHECK-NEXT:  // %bb.2: // %while.body437; CHECK-NEXT:    // in Loop: Header=BB6_1 Depth=1438; CHECK-NEXT:    ldr x0, [x22, :lo12:glob]439; CHECK-NEXT:    bl Update440; CHECK-NEXT:    sub x21, x21, #2441; CHECK-NEXT:    cmp x20, x21442; CHECK-NEXT:    b.lt .LBB6_1443; CHECK-NEXT:  .LBB6_3: // %while.end444; CHECK-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload445; CHECK-NEXT:    ldp x22, x21, [sp, #16] // 16-byte Folded Reload446; CHECK-NEXT:    ldr x30, [sp], #48 // 8-byte Folded Reload447; CHECK-NEXT:    .cfi_def_cfa_offset 0448; CHECK-NEXT:    .cfi_restore w19449; CHECK-NEXT:    .cfi_restore w20450; CHECK-NEXT:    .cfi_restore w21451; CHECK-NEXT:    .cfi_restore w22452; CHECK-NEXT:    .cfi_restore w30453; CHECK-NEXT:    ret454entry:455  %0 = load i64, ptr %hdCall, align 8456  br label %land.rhs457 458land.rhs:459  %rp.06 = phi i64 [ %0, %entry ], [ %sub, %while.body ]460  %1 = load i64, ptr inttoptr (i64 24 to ptr), align 8461  %cmp2 = icmp sgt i64 %1, 0462  br i1 %cmp2, label %while.body, label %while.end463 464while.body:465  %2 = load ptr, ptr @glob, align 8466  %call = tail call ptr @Update(ptr %2) #2467  %sub = add nsw i64 %rp.06, -2468  %cmp = icmp slt i64 %0, %rp.06469  br i1 %cmp, label %land.rhs, label %while.end470 471while.end:472  ret void473}474 475; undefined external to prevent possible optimizations476declare void @do_something() #1477 478define i32 @do_nothing_if_resultant_opcodes_would_differ() #0 {479; CHECK-LABEL: do_nothing_if_resultant_opcodes_would_differ:480; CHECK:       // %bb.0: // %entry481; CHECK-NEXT:    str x30, [sp, #-32]! // 8-byte Folded Spill482; CHECK-NEXT:    .cfi_def_cfa_offset 32483; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill484; CHECK-NEXT:    .cfi_offset w19, -8485; CHECK-NEXT:    .cfi_offset w20, -16486; CHECK-NEXT:    .cfi_offset w30, -32487; CHECK-NEXT:    adrp x19, :got:a488; CHECK-NEXT:    ldr x19, [x19, :got_lo12:a]489; CHECK-NEXT:    ldr w8, [x19]490; CHECK-NEXT:    cmn w8, #2491; CHECK-NEXT:    b.gt .LBB7_4492; CHECK-NEXT:  // %bb.1: // %while.body.preheader493; CHECK-NEXT:    sub w20, w8, #1494; CHECK-NEXT:  .LBB7_2: // %while.body495; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1496; CHECK-NEXT:    bl do_something497; CHECK-NEXT:    adds w20, w20, #1498; CHECK-NEXT:    b.mi .LBB7_2499; CHECK-NEXT:  // %bb.3: // %while.cond.while.end_crit_edge500; CHECK-NEXT:    ldr w8, [x19]501; CHECK-NEXT:  .LBB7_4: // %while.end502; CHECK-NEXT:    cmp w8, #1503; CHECK-NEXT:    b.gt .LBB7_7504; CHECK-NEXT:  // %bb.5: // %land.lhs.true505; CHECK-NEXT:    adrp x8, :got:b506; CHECK-NEXT:    adrp x9, :got:d507; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]508; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]509; CHECK-NEXT:    ldr w8, [x8]510; CHECK-NEXT:    ldr w9, [x9]511; CHECK-NEXT:    cmp w8, w9512; CHECK-NEXT:    b.ne .LBB7_7513; CHECK-NEXT:  // %bb.6:514; CHECK-NEXT:    mov w0, #123 // =0x7b515; CHECK-NEXT:    b .LBB7_8516; CHECK-NEXT:  .LBB7_7: // %if.end517; CHECK-NEXT:    mov w0, wzr518; CHECK-NEXT:  .LBB7_8: // %return519; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload520; CHECK-NEXT:    ldr x30, [sp], #32 // 8-byte Folded Reload521; CHECK-NEXT:    .cfi_def_cfa_offset 0522; CHECK-NEXT:    .cfi_restore w19523; CHECK-NEXT:    .cfi_restore w20524; CHECK-NEXT:    .cfi_restore w30525; CHECK-NEXT:    ret526entry:527  %0 = load i32, ptr @a, align 4528  %cmp4 = icmp slt i32 %0, -1529  br i1 %cmp4, label %while.body.preheader, label %while.end530 531while.body.preheader:                             ; preds = %entry532  br label %while.body533 534while.body:                                       ; preds = %while.body, %while.body.preheader535  %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ]536  tail call void @do_something() #2537  %inc = add nsw i32 %i.05, 1538  %cmp = icmp slt i32 %i.05, 0539  br i1 %cmp, label %while.body, label %while.cond.while.end_crit_edge540 541while.cond.while.end_crit_edge:                   ; preds = %while.body542  %.pre = load i32, ptr @a, align 4543  br label %while.end544 545while.end:                                        ; preds = %while.cond.while.end_crit_edge, %entry546  %1 = phi i32 [ %.pre, %while.cond.while.end_crit_edge ], [ %0, %entry ]547  %cmp1 = icmp slt i32 %1, 2548  br i1 %cmp1, label %land.lhs.true, label %if.end549 550land.lhs.true:                                    ; preds = %while.end551  %2 = load i32, ptr @b, align 4552  %3 = load i32, ptr @d, align 4553  %cmp2 = icmp eq i32 %2, %3554  br i1 %cmp2, label %return, label %if.end555 556if.end:                                           ; preds = %land.lhs.true, %while.end557  br label %return558 559return:                                           ; preds = %if.end, %land.lhs.true560  %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ]561  ret i32 %retval.0562}563 564define i32 @do_nothing_if_compares_can_not_be_adjusted_to_each_other() #0 {565; CHECK-LABEL: do_nothing_if_compares_can_not_be_adjusted_to_each_other:566; CHECK:       // %bb.0: // %entry567; CHECK-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill568; CHECK-NEXT:    .cfi_def_cfa_offset 16569; CHECK-NEXT:    .cfi_offset w19, -8570; CHECK-NEXT:    .cfi_offset w30, -16571; CHECK-NEXT:    .cfi_remember_state572; CHECK-NEXT:    adrp x8, :got:a573; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]574; CHECK-NEXT:    ldr w8, [x8]575; CHECK-NEXT:    cmp w8, #0576; CHECK-NEXT:    b.gt .LBB8_3577; CHECK-NEXT:  // %bb.1: // %while.body.preheader578; CHECK-NEXT:    sub w19, w8, #1579; CHECK-NEXT:  .LBB8_2: // %while.body580; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1581; CHECK-NEXT:    bl do_something582; CHECK-NEXT:    adds w19, w19, #1583; CHECK-NEXT:    b.mi .LBB8_2584; CHECK-NEXT:  .LBB8_3: // %while.end585; CHECK-NEXT:    adrp x8, :got:c586; CHECK-NEXT:    ldr x8, [x8, :got_lo12:c]587; CHECK-NEXT:    ldr w8, [x8]588; CHECK-NEXT:    cmn w8, #2589; CHECK-NEXT:    b.lt .LBB8_6590; CHECK-NEXT:  // %bb.4: // %land.lhs.true591; CHECK-NEXT:    adrp x8, :got:b592; CHECK-NEXT:    adrp x9, :got:d593; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]594; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]595; CHECK-NEXT:    ldr w8, [x8]596; CHECK-NEXT:    ldr w9, [x9]597; CHECK-NEXT:    cmp w8, w9598; CHECK-NEXT:    b.ne .LBB8_6599; CHECK-NEXT:  // %bb.5:600; CHECK-NEXT:    mov w0, #123 // =0x7b601; CHECK-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload602; CHECK-NEXT:    .cfi_def_cfa_offset 0603; CHECK-NEXT:    .cfi_restore w19604; CHECK-NEXT:    .cfi_restore w30605; CHECK-NEXT:    ret606; CHECK-NEXT:  .LBB8_6: // %if.end607; CHECK-NEXT:    .cfi_restore_state608; CHECK-NEXT:    mov w0, wzr609; CHECK-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload610; CHECK-NEXT:    .cfi_def_cfa_offset 0611; CHECK-NEXT:    .cfi_restore w19612; CHECK-NEXT:    .cfi_restore w30613; CHECK-NEXT:    ret614entry:615  %0 = load i32, ptr @a, align 4616  %cmp4 = icmp slt i32 %0, 1617  br i1 %cmp4, label %while.body.preheader, label %while.end618 619while.body.preheader:                             ; preds = %entry620  br label %while.body621 622while.body:                                       ; preds = %while.body, %while.body.preheader623  %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ]624  tail call void @do_something() #2625  %inc = add nsw i32 %i.05, 1626  %cmp = icmp slt i32 %i.05, 0627  br i1 %cmp, label %while.body, label %while.end.loopexit628 629while.end.loopexit:                               ; preds = %while.body630  br label %while.end631 632while.end:                                        ; preds = %while.end.loopexit, %entry633  %1 = load i32, ptr @c, align 4634  %cmp1 = icmp sgt i32 %1, -3635  br i1 %cmp1, label %land.lhs.true, label %if.end636 637land.lhs.true:                                    ; preds = %while.end638  %2 = load i32, ptr @b, align 4639  %3 = load i32, ptr @d, align 4640  %cmp2 = icmp eq i32 %2, %3641  br i1 %cmp2, label %return, label %if.end642 643if.end:                                           ; preds = %land.lhs.true, %while.end644  br label %return645 646return:                                           ; preds = %if.end, %land.lhs.true647  %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ]648  ret i32 %retval.0649}650 651; Test in the following case, we don't hit 'cmp' and trigger a false positive652; cmp  w19, #0653; cinc w0, w19, gt654; ...655; fcmp d8, #0.0656; b.gt .LBB0_5657 658define i32 @fcmpri(i32 %argc, ptr nocapture readonly %argv) #0 {659; CHECK-LABEL: fcmpri:660; CHECK:       // %bb.0: // %entry661; CHECK-NEXT:    cmp w0, #2662; CHECK-NEXT:    b.lt .LBB9_3663; CHECK-NEXT:  // %bb.1: // %land.lhs.true664; CHECK-NEXT:    ldr x8, [x1, #8]665; CHECK-NEXT:    cbz x8, .LBB9_3666; CHECK-NEXT:  // %bb.2:667; CHECK-NEXT:    mov w0, #3 // =0x3668; CHECK-NEXT:    ret669; CHECK-NEXT:  .LBB9_3: // %if.end670; CHECK-NEXT:    str d8, [sp, #-32]! // 8-byte Folded Spill671; CHECK-NEXT:    .cfi_def_cfa_offset 32672; CHECK-NEXT:    stp x30, x19, [sp, #16] // 16-byte Folded Spill673; CHECK-NEXT:    .cfi_offset w19, -8674; CHECK-NEXT:    .cfi_offset w30, -16675; CHECK-NEXT:    .cfi_offset b8, -32676; CHECK-NEXT:    mov w0, #1 // =0x1677; CHECK-NEXT:    bl zoo678; CHECK-NEXT:    mov w19, w0679; CHECK-NEXT:    mov w0, #-1 // =0xffffffff680; CHECK-NEXT:    bl yoo681; CHECK-NEXT:    cmp w19, #0682; CHECK-NEXT:    mov w1, #2 // =0x2683; CHECK-NEXT:    fmov d8, d0684; CHECK-NEXT:    cinc w0, w19, gt685; CHECK-NEXT:    bl xoo686; CHECK-NEXT:    fmov d0, #-1.00000000687; CHECK-NEXT:    fcmp d8, #0.0688; CHECK-NEXT:    fmov d1, #-2.00000000689; CHECK-NEXT:    fadd d0, d8, d0690; CHECK-NEXT:    fcsel d0, d8, d0, gt691; CHECK-NEXT:    bl woo692; CHECK-NEXT:    ldp x30, x19, [sp, #16] // 16-byte Folded Reload693; CHECK-NEXT:    mov w0, #4 // =0x4694; CHECK-NEXT:    ldr d8, [sp], #32 // 8-byte Folded Reload695; CHECK-NEXT:    .cfi_def_cfa_offset 0696; CHECK-NEXT:    .cfi_restore w19697; CHECK-NEXT:    .cfi_restore w30698; CHECK-NEXT:    .cfi_restore b8699; CHECK-NEXT:    ret700 701; CHECK-LABEL-DAG: .LBB9_3702 703entry:704  %cmp = icmp sgt i32 %argc, 1705  br i1 %cmp, label %land.lhs.true, label %if.end706 707land.lhs.true:                                    ; preds = %entry708  %arrayidx = getelementptr inbounds ptr, ptr %argv, i64 1709  %0 = load ptr, ptr %arrayidx, align 8710  %cmp1 = icmp eq ptr %0, null711  br i1 %cmp1, label %if.end, label %return712 713if.end:                                           ; preds = %land.lhs.true, %entry714  %call = call i32 @zoo(i32 1)715  %call2 = call double @yoo(i32 -1)716  %cmp4 = icmp sgt i32 %call, 0717  %add = zext i1 %cmp4 to i32718  %cond = add nsw i32 %add, %call719  %call7 = call i32 @xoo(i32 %cond, i32 2)720  %cmp9 = fcmp ogt double %call2, 0.000000e+00721  br i1 %cmp9, label %cond.end14, label %cond.false12722 723cond.false12:                                     ; preds = %if.end724  %sub = fadd fast double %call2, -1.000000e+00725  br label %cond.end14726 727cond.end14:                                       ; preds = %if.end, %cond.false12728  %cond15 = phi double [ %sub, %cond.false12 ], [ %call2, %if.end ]729  %call16 = call i32 @woo(double %cond15, double -2.000000e+00)730  br label %return731 732return:                                           ; preds = %land.lhs.true, %cond.end14733  %retval.0 = phi i32 [ 4, %cond.end14 ], [ 3, %land.lhs.true ]734  ret i32 %retval.0735}736 737define void @cmp_shifted(i32 %in, i32 %lhs, i32 %rhs) #0 {738; CHECK-LABEL: cmp_shifted:739; CHECK:       // %bb.0: // %common.ret740; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill741; CHECK-NEXT:    .cfi_def_cfa_offset 16742; CHECK-NEXT:    .cfi_offset w30, -16743; CHECK-NEXT:    mov w8, #42 // =0x2a744; CHECK-NEXT:    cmp w0, #0745; CHECK-NEXT:    mov w9, #128 // =0x80746; CHECK-NEXT:    csinc w8, w8, wzr, gt747; CHECK-NEXT:    cmp w0, #2, lsl #12 // =8192748; CHECK-NEXT:    csel w0, w9, w8, ge749; CHECK-NEXT:    bl zoo750; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload751; CHECK-NEXT:    .cfi_def_cfa_offset 0752; CHECK-NEXT:    .cfi_restore w30753; CHECK-NEXT:    ret754; [...]755 756  %tst_low = icmp sgt i32 %in, 8191757  br i1 %tst_low, label %true, label %false758 759true:760  call i32 @zoo(i32 128)761  ret void762 763false:764  %tst = icmp sgt i32 %in, 0765  br i1 %tst, label %truer, label %falser766 767truer:768  call i32 @zoo(i32 42)769  ret void770 771falser:772  call i32 @zoo(i32 1)773  ret void774}775 776define i32 @combine_gt_ge_sel(i64 %v, ptr %p) #0 {777; CHECK-LABEL: combine_gt_ge_sel:778; CHECK:       // %bb.0: // %entry779; CHECK-NEXT:    adrp x8, :got:a780; CHECK-NEXT:    ldr x8, [x8, :got_lo12:a]781; CHECK-NEXT:    ldr w8, [x8]782; CHECK-NEXT:    cmp w8, #0783; CHECK-NEXT:    csel x9, x0, xzr, gt784; CHECK-NEXT:    str x9, [x1]785; CHECK-NEXT:    b.le .LBB11_2786; CHECK-NEXT:  // %bb.1: // %lor.lhs.false787; CHECK-NEXT:    cmp w8, #2788; CHECK-NEXT:    b.ge .LBB11_4789; CHECK-NEXT:    b .LBB11_6790; CHECK-NEXT:  .LBB11_2: // %land.lhs.true791; CHECK-NEXT:    adrp x8, :got:b792; CHECK-NEXT:    adrp x9, :got:c793; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]794; CHECK-NEXT:    ldr x9, [x9, :got_lo12:c]795; CHECK-NEXT:    ldr w8, [x8]796; CHECK-NEXT:    ldr w9, [x9]797; CHECK-NEXT:    cmp w8, w9798; CHECK-NEXT:    b.ne .LBB11_4799; CHECK-NEXT:  // %bb.3:800; CHECK-NEXT:    mov w0, #1 // =0x1801; CHECK-NEXT:    ret802; CHECK-NEXT:  .LBB11_4: // %land.lhs.true3803; CHECK-NEXT:    adrp x8, :got:b804; CHECK-NEXT:    adrp x9, :got:d805; CHECK-NEXT:    ldr x8, [x8, :got_lo12:b]806; CHECK-NEXT:    ldr x9, [x9, :got_lo12:d]807; CHECK-NEXT:    ldr w8, [x8]808; CHECK-NEXT:    ldr w9, [x9]809; CHECK-NEXT:    cmp w8, w9810; CHECK-NEXT:    b.ne .LBB11_6811; CHECK-NEXT:  // %bb.5:812; CHECK-NEXT:    mov w0, #1 // =0x1813; CHECK-NEXT:    ret814; CHECK-NEXT:  .LBB11_6: // %if.end815; CHECK-NEXT:    mov w0, wzr816; CHECK-NEXT:    ret817entry:818  %0 = load i32, ptr @a, align 4819  %cmp = icmp sgt i32 %0, 0820  %m = select i1 %cmp, i64 %v, i64 0821  store i64 %m, ptr %p822  br i1 %cmp, label %lor.lhs.false, label %land.lhs.true823 824land.lhs.true:                                    ; preds = %entry825  %1 = load i32, ptr @b, align 4826  %2 = load i32, ptr @c, align 4827  %cmp1 = icmp eq i32 %1, %2828  br i1 %cmp1, label %return, label %land.lhs.true3829 830lor.lhs.false:                                    ; preds = %entry831  %cmp2 = icmp sgt i32 %0, 1832  br i1 %cmp2, label %land.lhs.true3, label %if.end833 834land.lhs.true3:                                   ; preds = %lor.lhs.false, %land.lhs.true835  %3 = load i32, ptr @b, align 4836  %4 = load i32, ptr @d, align 4837  %cmp4 = icmp eq i32 %3, %4838  br i1 %cmp4, label %return, label %if.end839 840if.end:                                           ; preds = %land.lhs.true3, %lor.lhs.false841  br label %return842 843return:                                           ; preds = %if.end, %land.lhs.true3, %land.lhs.true844  %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ]845  ret i32 %retval.0846}847 848declare i32 @zoo(i32)849 850declare double @yoo(i32)851 852declare i32 @xoo(i32, i32)853 854declare i32 @woo(double, double)855 856attributes #0 = { uwtable }857