135d916e1SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 235d916e1SNoah Goldstein; RUN: opt -passes=instcombine < %s -S | FileCheck %s 335d916e1SNoah Goldstein 435d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits(i8 %x) { 535d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits( 635d916e1SNoah Goldstein; CHECK-NEXT: entry: 735d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65 835d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 935d916e1SNoah Goldstein; CHECK: T: 1061df774aSNoah Goldstein; CHECK-NEXT: ret i8 64 1135d916e1SNoah Goldstein; CHECK: F: 1235d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 1335d916e1SNoah Goldstein; 1435d916e1SNoah Goldsteinentry: 1535d916e1SNoah Goldstein %cmp = icmp ugt i8 %x, 191 1635d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 1735d916e1SNoah GoldsteinT: 1835d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 1935d916e1SNoah Goldstein %r = and i8 %v, 64 2035d916e1SNoah Goldstein ret i8 %r 2135d916e1SNoah GoldsteinF: 2235d916e1SNoah Goldstein br label %T 2335d916e1SNoah Goldstein} 2435d916e1SNoah Goldstein 2535d916e1SNoah Goldsteindefine i8 @phi_ult_low_bits(i8 %x) { 2635d916e1SNoah Goldstein; CHECK-LABEL: @phi_ult_low_bits( 2735d916e1SNoah Goldstein; CHECK-NEXT: entry: 2835d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], -64 2935d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 3035d916e1SNoah Goldstein; CHECK: T: 3135d916e1SNoah Goldstein; CHECK-NEXT: br label [[F]] 3235d916e1SNoah Goldstein; CHECK: F: 3361df774aSNoah Goldstein; CHECK-NEXT: ret i8 64 3435d916e1SNoah Goldstein; 3535d916e1SNoah Goldsteinentry: 3635d916e1SNoah Goldstein %cmp = icmp ult i8 %x, 192 3735d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 3835d916e1SNoah GoldsteinT: 3935d916e1SNoah Goldstein br label %F 4035d916e1SNoah GoldsteinF: 4135d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %T] 4235d916e1SNoah Goldstein %r = and i8 %v, 64 4335d916e1SNoah Goldstein ret i8 %r 4435d916e1SNoah Goldstein} 4535d916e1SNoah Goldstein 4635d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_fail(i8 %x) { 4735d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_fail( 4835d916e1SNoah Goldstein; CHECK-NEXT: entry: 4935d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -66 5035d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 5135d916e1SNoah Goldstein; CHECK: T: 5235d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 5335d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 5435d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 5535d916e1SNoah Goldstein; CHECK: F: 5635d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 5735d916e1SNoah Goldstein; 5835d916e1SNoah Goldsteinentry: 5935d916e1SNoah Goldstein %cmp = icmp ugt i8 %x, 190 6035d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 6135d916e1SNoah GoldsteinT: 6235d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 6335d916e1SNoah Goldstein %r = and i8 %v, 64 6435d916e1SNoah Goldstein ret i8 %r 6535d916e1SNoah GoldsteinF: 6635d916e1SNoah Goldstein br label %T 6735d916e1SNoah Goldstein} 6835d916e1SNoah Goldstein 6935d916e1SNoah Goldsteindefine i8 @phi_uge_high_bits(i8 %x) { 7035d916e1SNoah Goldstein; CHECK-LABEL: @phi_uge_high_bits( 7135d916e1SNoah Goldstein; CHECK-NEXT: entry: 7235d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65 7335d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 7435d916e1SNoah Goldstein; CHECK: T: 7561df774aSNoah Goldstein; CHECK-NEXT: ret i8 64 7635d916e1SNoah Goldstein; CHECK: F: 7735d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 7835d916e1SNoah Goldstein; 7935d916e1SNoah Goldsteinentry: 8035d916e1SNoah Goldstein %cmp = icmp uge i8 %x, 192 8135d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 8235d916e1SNoah GoldsteinT: 8335d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 8435d916e1SNoah Goldstein %r = and i8 %v, 64 8535d916e1SNoah Goldstein ret i8 %r 8635d916e1SNoah GoldsteinF: 8735d916e1SNoah Goldstein br label %T 8835d916e1SNoah Goldstein} 8935d916e1SNoah Goldstein 9035d916e1SNoah Goldsteindefine i8 @phi_uge_high_bits_fail(i8 %x) { 9135d916e1SNoah Goldstein; CHECK-LABEL: @phi_uge_high_bits_fail( 9235d916e1SNoah Goldstein; CHECK-NEXT: entry: 9335d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 5 9435d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 9535d916e1SNoah Goldstein; CHECK: T: 9635d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 9735d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 1 9835d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 9935d916e1SNoah Goldstein; CHECK: F: 10035d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 10135d916e1SNoah Goldstein; 10235d916e1SNoah Goldsteinentry: 10335d916e1SNoah Goldstein %cmp = icmp ugt i8 %x, 5 10435d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 10535d916e1SNoah GoldsteinT: 10635d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 10735d916e1SNoah Goldstein %r = and i8 %v, 1 10835d916e1SNoah Goldstein ret i8 %r 10935d916e1SNoah GoldsteinF: 11035d916e1SNoah Goldstein br label %T 11135d916e1SNoah Goldstein} 11235d916e1SNoah Goldstein 11335d916e1SNoah Goldsteindefine i8 @phi_sge_high_bits(i8 %x) { 11435d916e1SNoah Goldstein; CHECK-LABEL: @phi_sge_high_bits( 11535d916e1SNoah Goldstein; CHECK-NEXT: entry: 11635d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 95 11735d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 11835d916e1SNoah Goldstein; CHECK: T: 11961df774aSNoah Goldstein; CHECK-NEXT: ret i8 96 12035d916e1SNoah Goldstein; CHECK: F: 12135d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 12235d916e1SNoah Goldstein; 12335d916e1SNoah Goldsteinentry: 12435d916e1SNoah Goldstein %cmp = icmp sge i8 %x, 96 12535d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 12635d916e1SNoah GoldsteinT: 12735d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 12835d916e1SNoah Goldstein %r = and i8 %v, 96 12935d916e1SNoah Goldstein ret i8 %r 13035d916e1SNoah GoldsteinF: 13135d916e1SNoah Goldstein br label %T 13235d916e1SNoah Goldstein} 13335d916e1SNoah Goldstein 13435d916e1SNoah Goldsteindefine i8 @phi_sge_high_bits_fail(i8 %x) { 13535d916e1SNoah Goldstein; CHECK-LABEL: @phi_sge_high_bits_fail( 13635d916e1SNoah Goldstein; CHECK-NEXT: entry: 13735d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -2 13835d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 13935d916e1SNoah Goldstein; CHECK: T: 14035d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 14135d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 1 14235d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 14335d916e1SNoah Goldstein; CHECK: F: 14435d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 14535d916e1SNoah Goldstein; 14635d916e1SNoah Goldsteinentry: 14735d916e1SNoah Goldstein %cmp = icmp sge i8 %x, -1 14835d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 14935d916e1SNoah GoldsteinT: 15035d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 15135d916e1SNoah Goldstein %r = and i8 %v, 1 15235d916e1SNoah Goldstein ret i8 %r 15335d916e1SNoah GoldsteinF: 15435d916e1SNoah Goldstein br label %T 15535d916e1SNoah Goldstein} 15635d916e1SNoah Goldstein 15735d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits(i8 %x) { 15835d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits( 15935d916e1SNoah Goldstein; CHECK-NEXT: entry: 16035d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1 16135d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 16235d916e1SNoah Goldstein; CHECK: T: 16361df774aSNoah Goldstein; CHECK-NEXT: ret i8 0 16435d916e1SNoah Goldstein; CHECK: F: 16535d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 16635d916e1SNoah Goldstein; 16735d916e1SNoah Goldsteinentry: 16835d916e1SNoah Goldstein %cmp = icmp sgt i8 %x, -1 16935d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 17035d916e1SNoah GoldsteinT: 17135d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [0, %F] 17235d916e1SNoah Goldstein %r = and i8 %v, 128 17335d916e1SNoah Goldstein ret i8 %r 17435d916e1SNoah GoldsteinF: 17535d916e1SNoah Goldstein br label %T 17635d916e1SNoah Goldstein} 17735d916e1SNoah Goldstein 17835d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits2(i8 %x) { 17935d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits2( 18035d916e1SNoah Goldstein; CHECK-NEXT: entry: 18135d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 63 18235d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 18335d916e1SNoah Goldstein; CHECK: T: 18461df774aSNoah Goldstein; CHECK-NEXT: ret i8 64 18535d916e1SNoah Goldstein; CHECK: F: 18635d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 18735d916e1SNoah Goldstein; 18835d916e1SNoah Goldsteinentry: 18935d916e1SNoah Goldstein %cmp = icmp sgt i8 %x, 63 19035d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 19135d916e1SNoah GoldsteinT: 19235d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 19335d916e1SNoah Goldstein %r = and i8 %v, 64 19435d916e1SNoah Goldstein ret i8 %r 19535d916e1SNoah GoldsteinF: 19635d916e1SNoah Goldstein br label %T 19735d916e1SNoah Goldstein} 19835d916e1SNoah Goldstein 19935d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits_fail(i8 %x) { 20035d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits_fail( 20135d916e1SNoah Goldstein; CHECK-NEXT: entry: 20235d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 62 20335d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 20435d916e1SNoah Goldstein; CHECK: T: 20535d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 20635d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 20735d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 20835d916e1SNoah Goldstein; CHECK: F: 20935d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 21035d916e1SNoah Goldstein; 21135d916e1SNoah Goldsteinentry: 21235d916e1SNoah Goldstein %cmp = icmp sgt i8 %x, 62 21335d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 21435d916e1SNoah GoldsteinT: 21535d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 21635d916e1SNoah Goldstein %r = and i8 %v, 64 21735d916e1SNoah Goldstein ret i8 %r 21835d916e1SNoah GoldsteinF: 21935d916e1SNoah Goldstein br label %T 22035d916e1SNoah Goldstein} 22135d916e1SNoah Goldstein 22235d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits(i8 %x) { 22335d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits( 22435d916e1SNoah Goldstein; CHECK-NEXT: entry: 22535d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0 22635d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 22735d916e1SNoah Goldstein; CHECK: T: 22861df774aSNoah Goldstein; CHECK-NEXT: ret i8 -128 22935d916e1SNoah Goldstein; CHECK: F: 23035d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 23135d916e1SNoah Goldstein; 23235d916e1SNoah Goldsteinentry: 23335d916e1SNoah Goldstein %cmp = icmp slt i8 %x, 0 23435d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 23535d916e1SNoah GoldsteinT: 23635d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 23735d916e1SNoah Goldstein %r = and i8 %v, 128 23835d916e1SNoah Goldstein ret i8 %r 23935d916e1SNoah GoldsteinF: 24035d916e1SNoah Goldstein br label %T 24135d916e1SNoah Goldstein} 24235d916e1SNoah Goldstein 24335d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits2(i8 %x) { 24435d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits2( 24535d916e1SNoah Goldstein; CHECK-NEXT: entry: 24635d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64 24735d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 24835d916e1SNoah Goldstein; CHECK: T: 24961df774aSNoah Goldstein; CHECK-NEXT: ret i8 0 25035d916e1SNoah Goldstein; CHECK: F: 25135d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 25235d916e1SNoah Goldstein; 25335d916e1SNoah Goldsteinentry: 25435d916e1SNoah Goldstein %cmp = icmp slt i8 %x, -64 25535d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 25635d916e1SNoah GoldsteinT: 25735d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [0, %F] 25835d916e1SNoah Goldstein %r = and i8 %v, 64 25935d916e1SNoah Goldstein ret i8 %r 26035d916e1SNoah GoldsteinF: 26135d916e1SNoah Goldstein br label %T 26235d916e1SNoah Goldstein} 26335d916e1SNoah Goldstein 26435d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits_fail(i8 %x) { 26535d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits_fail( 26635d916e1SNoah Goldstein; CHECK-NEXT: entry: 26735d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63 26835d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 26935d916e1SNoah Goldstein; CHECK: T: 27035d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ] 27135d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 27235d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 27335d916e1SNoah Goldstein; CHECK: F: 27435d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 27535d916e1SNoah Goldstein; 27635d916e1SNoah Goldsteinentry: 27735d916e1SNoah Goldstein %cmp = icmp slt i8 %x, -63 27835d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 27935d916e1SNoah GoldsteinT: 28035d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [0, %F] 28135d916e1SNoah Goldstein %r = and i8 %v, 64 28235d916e1SNoah Goldstein ret i8 %r 28335d916e1SNoah GoldsteinF: 28435d916e1SNoah Goldstein br label %T 28535d916e1SNoah Goldstein} 28635d916e1SNoah Goldstein 28735d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits(i8 %x) { 28835d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits( 28935d916e1SNoah Goldstein; CHECK-NEXT: entry: 29035d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64 29135d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 29235d916e1SNoah Goldstein; CHECK: T: 29361df774aSNoah Goldstein; CHECK-NEXT: ret i8 0 29435d916e1SNoah Goldstein; CHECK: F: 29535d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 29635d916e1SNoah Goldstein; 29735d916e1SNoah Goldsteinentry: 29835d916e1SNoah Goldstein %cmp = icmp sle i8 %x, -65 29935d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 30035d916e1SNoah GoldsteinT: 30135d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [0, %F] 30235d916e1SNoah Goldstein %r = and i8 %v, 64 30335d916e1SNoah Goldstein ret i8 %r 30435d916e1SNoah GoldsteinF: 30535d916e1SNoah Goldstein br label %T 30635d916e1SNoah Goldstein} 30735d916e1SNoah Goldstein 30835d916e1SNoah Goldsteindefine i8 @phi_sle_low_bits(i8 %x) { 30935d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_low_bits( 31035d916e1SNoah Goldstein; CHECK-NEXT: entry: 31135d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 65 31235d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 31335d916e1SNoah Goldstein; CHECK: T: 31435d916e1SNoah Goldstein; CHECK-NEXT: br label [[F]] 31535d916e1SNoah Goldstein; CHECK: F: 31661df774aSNoah Goldstein; CHECK-NEXT: ret i8 64 31735d916e1SNoah Goldstein; 31835d916e1SNoah Goldsteinentry: 31935d916e1SNoah Goldstein %cmp = icmp sle i8 %x, 64 32035d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 32135d916e1SNoah GoldsteinT: 32235d916e1SNoah Goldstein br label %F 32335d916e1SNoah GoldsteinF: 32435d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %T] 32535d916e1SNoah Goldstein %r = and i8 %v, 64 32635d916e1SNoah Goldstein ret i8 %r 32735d916e1SNoah Goldstein} 32835d916e1SNoah Goldstein 32935d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits_fail(i8 %x) { 33035d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits_fail( 33135d916e1SNoah Goldstein; CHECK-NEXT: entry: 33235d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 1 33335d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 33435d916e1SNoah Goldstein; CHECK: T: 33535d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 33635d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], -128 33735d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 33835d916e1SNoah Goldstein; CHECK: F: 33935d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 34035d916e1SNoah Goldstein; 34135d916e1SNoah Goldsteinentry: 34235d916e1SNoah Goldstein %cmp = icmp sle i8 %x, 0 34335d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 34435d916e1SNoah GoldsteinT: 34535d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 34635d916e1SNoah Goldstein %r = and i8 %v, 128 34735d916e1SNoah Goldstein ret i8 %r 34835d916e1SNoah GoldsteinF: 34935d916e1SNoah Goldstein br label %T 35035d916e1SNoah Goldstein} 35135d916e1SNoah Goldstein 35235d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits_fail2(i8 %x) { 35335d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits_fail2( 35435d916e1SNoah Goldstein; CHECK-NEXT: entry: 35535d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63 35635d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 35735d916e1SNoah Goldstein; CHECK: T: 35835d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 35935d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 36035d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 36135d916e1SNoah Goldstein; CHECK: F: 36235d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 36335d916e1SNoah Goldstein; 36435d916e1SNoah Goldsteinentry: 36535d916e1SNoah Goldstein %cmp = icmp sle i8 %x, -64 36635d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 36735d916e1SNoah GoldsteinT: 36835d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 36935d916e1SNoah Goldstein %r = and i8 %v, 64 37035d916e1SNoah Goldstein ret i8 %r 37135d916e1SNoah GoldsteinF: 37235d916e1SNoah Goldstein br label %T 37335d916e1SNoah Goldstein} 37435d916e1SNoah Goldstein 37535d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_and_known(i8 %xx) { 37635d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_and_known( 37735d916e1SNoah Goldstein; CHECK-NEXT: entry: 37805670b42SNikita Popov; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 1 37905670b42SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[XX]], -65 38035d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 38135d916e1SNoah Goldstein; CHECK: T: 38205670b42SNikita Popov; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 38305670b42SNikita Popov; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 65 38405670b42SNikita Popov; CHECK-NEXT: ret i8 [[R]] 38535d916e1SNoah Goldstein; CHECK: F: 38635d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 38735d916e1SNoah Goldstein; 38835d916e1SNoah Goldsteinentry: 38935d916e1SNoah Goldstein %x = or i8 %xx, 1 39035d916e1SNoah Goldstein %cmp = icmp ugt i8 %x, 191 39135d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 39235d916e1SNoah GoldsteinT: 39335d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 39435d916e1SNoah Goldstein %r = and i8 %v, 65 39535d916e1SNoah Goldstein ret i8 %r 39635d916e1SNoah GoldsteinF: 39735d916e1SNoah Goldstein br label %T 39835d916e1SNoah Goldstein} 39935d916e1SNoah Goldstein 40035d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_and_known_todo_high_depths(i8 %xx, i8 %y, i8 %z) { 40135d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_and_known_todo_high_depths( 40235d916e1SNoah Goldstein; CHECK-NEXT: entry: 40335d916e1SNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], -2 404a1058776SNikita Popov; CHECK-NEXT: [[XXX:%.*]] = and i8 [[XX:%.*]], [[YY]] 40535d916e1SNoah Goldstein; CHECK-NEXT: [[ZZ:%.*]] = or i8 [[Z:%.*]], 1 40635d916e1SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = add i8 [[XXX]], [[ZZ]] 40735d916e1SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], -65 40835d916e1SNoah Goldstein; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 40935d916e1SNoah Goldstein; CHECK: T: 41035d916e1SNoah Goldstein; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 41135d916e1SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 65 41235d916e1SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 41335d916e1SNoah Goldstein; CHECK: F: 41435d916e1SNoah Goldstein; CHECK-NEXT: br label [[T]] 41535d916e1SNoah Goldstein; 41635d916e1SNoah Goldsteinentry: 41735d916e1SNoah Goldstein %yy = and i8 %y, -2 41835d916e1SNoah Goldstein %xxx = and i8 %xx, %yy 41935d916e1SNoah Goldstein %zz = or i8 %z, 1 42035d916e1SNoah Goldstein %x = add i8 %xxx, %zz 42135d916e1SNoah Goldstein %cmp = icmp ugt i8 %x, 191 42235d916e1SNoah Goldstein br i1 %cmp, label %T, label %F 42335d916e1SNoah GoldsteinT: 42435d916e1SNoah Goldstein %v = phi i8 [ %x, %entry], [-1, %F] 42535d916e1SNoah Goldstein %r = and i8 %v, 65 42635d916e1SNoah Goldstein ret i8 %r 42735d916e1SNoah GoldsteinF: 42835d916e1SNoah Goldstein br label %T 42935d916e1SNoah Goldstein} 4306df63203Sbipmis 4316df63203Sbipmis;Illustrate if 2 pointers are non-equal when one of them is a recursive GEP. 4326df63203Sbipmis;Cases which folds to a canonical icmp(ptr1, ptr2) 4336df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1(ptr %val1) { 4346df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1( 4356df63203Sbipmis; CHECK-NEXT: entry: 4366df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 4376df63203Sbipmis; CHECK: while.cond.i: 4386df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 439f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 4406df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 4416df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 4426df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 4436df63203Sbipmis; CHECK: while.end.i: 4446df63203Sbipmis; CHECK-NEXT: ret i1 false 4456df63203Sbipmis; 4466df63203Sbipmisentry: 4476df63203Sbipmis br label %while.cond.i 4486df63203Sbipmis 4496df63203Sbipmiswhile.cond.i: 4506df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 4516df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 4526df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 4536df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 4546df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 4556df63203Sbipmis 4566df63203Sbipmiswhile.end.i: 4576df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 4586df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 4596df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 4606df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 4616df63203Sbipmis ret i1 %bool 4626df63203Sbipmis} 4636df63203Sbipmis 4646df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_PhiOperandsCommuted(ptr %val1) { 4656df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_PhiOperandsCommuted( 4666df63203Sbipmis; CHECK-NEXT: entry: 4676df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 4686df63203Sbipmis; CHECK: while.cond.i: 4696df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[VAL1:%.*]], [[ENTRY:%.*]] ], [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ] 470f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 4716df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 4726df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 4736df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 4746df63203Sbipmis; CHECK: while.end.i: 4756df63203Sbipmis; CHECK-NEXT: ret i1 false 4766df63203Sbipmis; 4776df63203Sbipmisentry: 4786df63203Sbipmis br label %while.cond.i 4796df63203Sbipmis 4806df63203Sbipmiswhile.cond.i: 4816df63203Sbipmis %a.pn.i = phi ptr [ %val1, %entry ], [ %test.0.i, %while.cond.i ] 4826df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 4836df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 4846df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 4856df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 4866df63203Sbipmis 4876df63203Sbipmiswhile.end.i: 4886df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 4896df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 4906df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 4916df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 4926df63203Sbipmis ret i1 %bool 4936df63203Sbipmis} 4946df63203Sbipmis 4956df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_SubOperandsCommuted(ptr %val1) { 4966df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_SubOperandsCommuted( 4976df63203Sbipmis; CHECK-NEXT: entry: 4986df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 4996df63203Sbipmis; CHECK: while.cond.i: 5006df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 501f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 5026df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 5036df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 5046df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 5056df63203Sbipmis; CHECK: while.end.i: 5066df63203Sbipmis; CHECK-NEXT: ret i1 false 5076df63203Sbipmis; 5086df63203Sbipmisentry: 5096df63203Sbipmis br label %while.cond.i 5106df63203Sbipmis 5116df63203Sbipmiswhile.cond.i: 5126df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 5136df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 5146df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 5156df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 5166df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 5176df63203Sbipmis 5186df63203Sbipmiswhile.end.i: 5196df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 5206df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 5216df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.rhs.cast.i, %sub.ptr.lhs.cast.i 5226df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 5236df63203Sbipmis ret i1 %bool 5246df63203Sbipmis} 5256df63203Sbipmis 5266df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub2(ptr %val1) { 5276df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub2( 5286df63203Sbipmis; CHECK-NEXT: entry: 5296df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 5306df63203Sbipmis; CHECK: while.cond.i: 5316df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 5326df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 -1 5336df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 5346df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 5356df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 5366df63203Sbipmis; CHECK: while.end.i: 5376df63203Sbipmis; CHECK-NEXT: ret i1 false 5386df63203Sbipmis; 5396df63203Sbipmisentry: 5406df63203Sbipmis br label %while.cond.i 5416df63203Sbipmis 5426df63203Sbipmiswhile.cond.i: 5436df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 5446df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 -1 5456df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 5466df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 5476df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 5486df63203Sbipmis 5496df63203Sbipmiswhile.end.i: 5506df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 5516df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 5526df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 5536df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 5546df63203Sbipmis ret i1 %bool 5556df63203Sbipmis} 5566df63203Sbipmis 5576df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub3(ptr %val1) { 5586df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub3( 5596df63203Sbipmis; CHECK-NEXT: entry: 560462cb3cdSNikita Popov; CHECK-NEXT: [[TEST_VAL1:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 7 5616df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 5626df63203Sbipmis; CHECK: while.cond.i: 5636df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ] 564f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 5656df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 5666df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 5676df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 5686df63203Sbipmis; CHECK: while.end.i: 5696df63203Sbipmis; CHECK-NEXT: ret i1 false 5706df63203Sbipmis; 5716df63203Sbipmisentry: 5726df63203Sbipmis %test.val1 = getelementptr inbounds i8, ptr %val1, i64 7 5736df63203Sbipmis br label %while.cond.i 5746df63203Sbipmis 5756df63203Sbipmiswhile.cond.i: 5766df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ] 5776df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 5786df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 5796df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 5806df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 5816df63203Sbipmis 5826df63203Sbipmiswhile.end.i: 5836df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 5846df63203Sbipmis %1 = getelementptr inbounds i8, ptr %val1, i64 5 5856df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %1 to i64 5866df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 5876df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 5886df63203Sbipmis ret i1 %bool 5896df63203Sbipmis} 5906df63203Sbipmis 5916df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual1(ptr %val1, i64 %val2) { 5926df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual1( 5936df63203Sbipmis; CHECK-NEXT: entry: 5946df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 5956df63203Sbipmis; CHECK: while.cond.i: 5966df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 597f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 5986df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 5996df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 6006df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 6016df63203Sbipmis; CHECK: while.end.i: 6026df63203Sbipmis; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[VAL1]], i64 [[VAL2:%.*]] 6036df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[TMP1]] 6046df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 6056df63203Sbipmis; 6066df63203Sbipmisentry: 6076df63203Sbipmis br label %while.cond.i 6086df63203Sbipmis 6096df63203Sbipmiswhile.cond.i: 6106df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 6116df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 6126df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 6136df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 6146df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 6156df63203Sbipmis 6166df63203Sbipmiswhile.end.i: 6176df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 6186df63203Sbipmis %1 = getelementptr inbounds i8, ptr %val1, i64 %val2 6196df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %1 to i64 6206df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 6216df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 6226df63203Sbipmis ret i1 %bool 6236df63203Sbipmis} 6246df63203Sbipmis 6256df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual2(ptr %val1) { 6266df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual2( 6276df63203Sbipmis; CHECK-NEXT: entry: 6286df63203Sbipmis; CHECK-NEXT: [[TEST_VAL1:%.*]] = getelementptr inbounds i8, ptr [[VAL1:%.*]], i64 -1 6296df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 6306df63203Sbipmis; CHECK: while.cond.i: 6316df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ] 632f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 6336df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 6346df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 6356df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 6366df63203Sbipmis; CHECK: while.end.i: 6376df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 6386df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 6396df63203Sbipmis; 6406df63203Sbipmisentry: 6416df63203Sbipmis %test.val1 = getelementptr inbounds i8, ptr %val1, i64 -1 6426df63203Sbipmis br label %while.cond.i 6436df63203Sbipmis 6446df63203Sbipmiswhile.cond.i: 6456df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ] 6466df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 6476df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 6486df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 6496df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 6506df63203Sbipmis 6516df63203Sbipmiswhile.end.i: 6526df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 6536df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 6546df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 6556df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 6566df63203Sbipmis ret i1 %bool 6576df63203Sbipmis} 6586df63203Sbipmis 6596df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual3(ptr %val1) { 6606df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual3( 6616df63203Sbipmis; CHECK-NEXT: entry: 662462cb3cdSNikita Popov; CHECK-NEXT: [[TEST_VAL1:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 5 6636df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 6646df63203Sbipmis; CHECK: while.cond.i: 6656df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ] 6666df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 -1 6676df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 6686df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 6696df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 6706df63203Sbipmis; CHECK: while.end.i: 6716df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 6726df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 6736df63203Sbipmis; 6746df63203Sbipmisentry: 6756df63203Sbipmis %test.val1 = getelementptr inbounds i8, ptr %val1, i64 5 6766df63203Sbipmis br label %while.cond.i 6776df63203Sbipmis 6786df63203Sbipmiswhile.cond.i: 6796df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ] 6806df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 -1 6816df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 6826df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 6836df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 6846df63203Sbipmis 6856df63203Sbipmiswhile.end.i: 6866df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 6876df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 6886df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 6896df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 6906df63203Sbipmis ret i1 %bool 6916df63203Sbipmis} 6926df63203Sbipmis 6936df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_maybeZero(ptr %val1) { 6946df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_maybeZero( 6956df63203Sbipmis; CHECK-NEXT: entry: 6966df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 6976df63203Sbipmis; CHECK: while.cond.i: 6986df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 6996df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A_PN_I]], align 2 700f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 7016df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 7026df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 7036df63203Sbipmis; CHECK: while.end.i: 7046df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]] 7056df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 7066df63203Sbipmis; 7076df63203Sbipmisentry: 7086df63203Sbipmis br label %while.cond.i 7096df63203Sbipmis 7106df63203Sbipmiswhile.cond.i: 7116df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 7126df63203Sbipmis %0 = load i8, ptr %a.pn.i, align 2 7136df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 7146df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 7156df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 7166df63203Sbipmis 7176df63203Sbipmiswhile.end.i: 7186df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %a.pn.i to i64 7196df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 7206df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 7216df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 7226df63203Sbipmis ret i1 %bool 7236df63203Sbipmis} 7246df63203Sbipmis 7256df63203Sbipmis;Non-inbounds test. 7266df63203Sbipmis;Test where Step is non-inbound. 7276df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStep1(ptr %val1) { 7286df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStep1( 7296df63203Sbipmis; CHECK-NEXT: entry: 7306df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 7316df63203Sbipmis; CHECK: while.cond.i: 7326df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 7336df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1 7346df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 7356df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 7366df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 7376df63203Sbipmis; CHECK: while.end.i: 7386df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 7396df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 7406df63203Sbipmis; 7416df63203Sbipmisentry: 7426df63203Sbipmis br label %while.cond.i 7436df63203Sbipmis 7446df63203Sbipmiswhile.cond.i: 7456df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 7466df63203Sbipmis %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1 7476df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 7486df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 7496df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 7506df63203Sbipmis 7516df63203Sbipmiswhile.end.i: 7526df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 7536df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 7546df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 7556df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 7566df63203Sbipmis ret i1 %bool 7576df63203Sbipmis} 7586df63203Sbipmis 7596df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStep2(ptr %val1) { 7606df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStep2( 7616df63203Sbipmis; CHECK-NEXT: entry: 7626df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 7636df63203Sbipmis; CHECK: while.cond.i: 7646df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 7656df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 -1 7666df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 7676df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 7686df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 7696df63203Sbipmis; CHECK: while.end.i: 7706df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 7716df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 7726df63203Sbipmis; 7736df63203Sbipmisentry: 7746df63203Sbipmis br label %while.cond.i 7756df63203Sbipmis 7766df63203Sbipmiswhile.cond.i: 7776df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 7786df63203Sbipmis %test.0.i = getelementptr i8, ptr %a.pn.i, i64 -1 7796df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 7806df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 7816df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 7826df63203Sbipmis 7836df63203Sbipmiswhile.end.i: 7846df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 7856df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 7866df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 7876df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 7886df63203Sbipmis ret i1 %bool 7896df63203Sbipmis} 7906df63203Sbipmis 7916df63203Sbipmis;Test where Step and GEP B are non-inbound. 7926df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStepAndB(ptr %val1) { 7936df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStepAndB( 7946df63203Sbipmis; CHECK-NEXT: entry: 795462cb3cdSNikita Popov; CHECK-NEXT: [[TEST:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 2 7966df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 7976df63203Sbipmis; CHECK: while.cond.i: 7986df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ] 7996df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1 8006df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 8016df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 8026df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 8036df63203Sbipmis; CHECK: while.end.i: 8046df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]] 8056df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 8066df63203Sbipmis; 8076df63203Sbipmisentry: 8086df63203Sbipmis %test = getelementptr inbounds i8, ptr %val1, i64 2 8096df63203Sbipmis br label %while.cond.i 8106df63203Sbipmis 8116df63203Sbipmiswhile.cond.i: 8126df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ] 8136df63203Sbipmis %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1 8146df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 8156df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 8166df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 8176df63203Sbipmis 8186df63203Sbipmiswhile.end.i: 8196df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 8206df63203Sbipmis %test.1.i = getelementptr i8, ptr %val1, i64 1 8216df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %test.1.i to i64 8226df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 8236df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 8246df63203Sbipmis ret i1 %bool 8256df63203Sbipmis} 8266df63203Sbipmis 8276df63203Sbipmis;Test where Start and Step are non-inbound. 8286df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStartAndStep(ptr %val1) { 8296df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStartAndStep( 8306df63203Sbipmis; CHECK-NEXT: entry: 8316df63203Sbipmis; CHECK-NEXT: [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1 8326df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 8336df63203Sbipmis; CHECK: while.cond.i: 8346df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ] 8356df63203Sbipmis; CHECK-NEXT: [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1 8366df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 8376df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 8386df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 8396df63203Sbipmis; CHECK: while.end.i: 8406df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 8416df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 8426df63203Sbipmis; 8436df63203Sbipmisentry: 8446df63203Sbipmis %test = getelementptr i8, ptr %val1, i64 1 8456df63203Sbipmis br label %while.cond.i 8466df63203Sbipmis 8476df63203Sbipmiswhile.cond.i: 8486df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ] 8496df63203Sbipmis %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1 8506df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 8516df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 8526df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 8536df63203Sbipmis 8546df63203Sbipmiswhile.end.i: 8556df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 8566df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 8576df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 8586df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 8596df63203Sbipmis ret i1 %bool 8606df63203Sbipmis} 8616df63203Sbipmis 8626df63203Sbipmis;Test where Start and GEP B are non-inbounds pointer with same definition. 8636df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundSameDefStartAndB(ptr %val1) { 8646df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundSameDefStartAndB( 8656df63203Sbipmis; CHECK-NEXT: entry: 8666df63203Sbipmis; CHECK-NEXT: [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1 8676df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 8686df63203Sbipmis; CHECK: while.cond.i: 8696df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ] 870f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 8716df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 8726df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 8736df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 8746df63203Sbipmis; CHECK: while.end.i: 8756df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]] 8766df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 8776df63203Sbipmis; 8786df63203Sbipmisentry: 8796df63203Sbipmis %test = getelementptr i8, ptr %val1, i64 1 8806df63203Sbipmis br label %while.cond.i 8816df63203Sbipmis 8826df63203Sbipmiswhile.cond.i: 8836df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ] 8846df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 8856df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 8866df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 8876df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 8886df63203Sbipmis 8896df63203Sbipmiswhile.end.i: 8906df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 8916df63203Sbipmis %test2 = getelementptr i8, ptr %val1, i64 1 8926df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %test2 to i64 8936df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 8946df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 8956df63203Sbipmis ret i1 %bool 8966df63203Sbipmis} 8976df63203Sbipmis 8986df63203Sbipmis;Test where Start and GEP B are non-inbounds and exactly same pointers. 8996df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundSameStartAndB(ptr %val1) { 9006df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundSameStartAndB( 9016df63203Sbipmis; CHECK-NEXT: entry: 9026df63203Sbipmis; CHECK-NEXT: [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1 9036df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 9046df63203Sbipmis; CHECK: while.cond.i: 9056df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ] 906f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 9076df63203Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 9086df63203Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 9096df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 9106df63203Sbipmis; CHECK: while.end.i: 9116df63203Sbipmis; CHECK-NEXT: ret i1 false 9126df63203Sbipmis; 9136df63203Sbipmisentry: 9146df63203Sbipmis %test = getelementptr i8, ptr %val1, i64 1 9156df63203Sbipmis br label %while.cond.i 9166df63203Sbipmis 9176df63203Sbipmiswhile.cond.i: 9186df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ] 9196df63203Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 9206df63203Sbipmis %0 = load i8, ptr %test.0.i, align 2 9216df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 9226df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 9236df63203Sbipmis 9246df63203Sbipmiswhile.end.i: 9256df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 9266df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %test to i64 9276df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 9286df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 9296df63203Sbipmis ret i1 %bool 9306df63203Sbipmis} 9316df63203Sbipmis 9326df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_scalableGEP(ptr %val1) { 9336df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_scalableGEP( 9346df63203Sbipmis; CHECK-NEXT: entry: 9356df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 9366df63203Sbipmis; CHECK: while.cond.i: 9376df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 93874aa1abfSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64() 93974aa1abfSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[TMP0]], 4 94074aa1abfSNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 [[TMP1]] 94174aa1abfSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TEST_0_I]], align 1 94274aa1abfSNikita Popov; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP2]], 0 9436df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 9446df63203Sbipmis; CHECK: while.end.i: 9456df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 9466df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 9476df63203Sbipmis; 9486df63203Sbipmisentry: 9496df63203Sbipmis br label %while.cond.i 9506df63203Sbipmis 9516df63203Sbipmiswhile.cond.i: 9526df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 9536df63203Sbipmis %test.0.i = getelementptr <vscale x 16 x i8>, ptr %a.pn.i, i64 1 9546df63203Sbipmis %0 = load i8, ptr %test.0.i, align 1 9556df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 9566df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 9576df63203Sbipmis 9586df63203Sbipmiswhile.end.i: 9596df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 9606df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 9616df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 9626df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 9636df63203Sbipmis ret i1 %bool 9646df63203Sbipmis} 9656df63203Sbipmis 9666df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_scalableGEP_inbounds(ptr %val1) { 9676df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_scalableGEP_inbounds( 9686df63203Sbipmis; CHECK-NEXT: entry: 9696df63203Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 9706df63203Sbipmis; CHECK: while.cond.i: 9716df63203Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 97274aa1abfSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64() 97374aa1abfSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[TMP0]], 4 97474aa1abfSNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 [[TMP1]] 97574aa1abfSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TEST_0_I]], align 1 97674aa1abfSNikita Popov; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP2]], 0 9776df63203Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 9786df63203Sbipmis; CHECK: while.end.i: 9796df63203Sbipmis; CHECK-NEXT: [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]] 9806df63203Sbipmis; CHECK-NEXT: ret i1 [[BOOL]] 9816df63203Sbipmis; 9826df63203Sbipmisentry: 9836df63203Sbipmis br label %while.cond.i 9846df63203Sbipmis 9856df63203Sbipmiswhile.cond.i: 9866df63203Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 9876df63203Sbipmis %test.0.i = getelementptr inbounds <vscale x 16 x i8>, ptr %a.pn.i, i64 1 9886df63203Sbipmis %0 = load i8, ptr %test.0.i, align 1 9896df63203Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 9906df63203Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 9916df63203Sbipmis 9926df63203Sbipmiswhile.end.i: 9936df63203Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 9946df63203Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 9956df63203Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 9966df63203Sbipmis %bool = icmp eq i64 %sub.ptr.sub.i, 0 9976df63203Sbipmis ret i1 %bool 9986df63203Sbipmis} 99964987c64Sbipmis 100064987c64Sbipmis; Test cmp(or), where one of argument to OR is a SUB of ptr2int with a recursive GEP. 100164987c64Sbipmisdefine i1 @recursiveGEP_orcmp(ptr %val1, i64 %val2) { 100264987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmp( 100364987c64Sbipmis; CHECK-NEXT: entry: 100464987c64Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 100564987c64Sbipmis; CHECK: while.cond.i: 100664987c64Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 1007f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 100864987c64Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 100964987c64Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 101064987c64Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 101164987c64Sbipmis; CHECK: while.end.i: 101264987c64Sbipmis; CHECK-NEXT: ret i1 false 101364987c64Sbipmis; 101464987c64Sbipmisentry: 101564987c64Sbipmis br label %while.cond.i 101664987c64Sbipmis 101764987c64Sbipmiswhile.cond.i: 101864987c64Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 101964987c64Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 102064987c64Sbipmis %0 = load i8, ptr %test.0.i, align 2 102164987c64Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 102264987c64Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 102364987c64Sbipmis 102464987c64Sbipmiswhile.end.i: 102564987c64Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 102664987c64Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 102764987c64Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 102864987c64Sbipmis %orval = or i64 %sub.ptr.sub.i, %val2 102964987c64Sbipmis %bool = icmp eq i64 %orval, 0 103064987c64Sbipmis ret i1 %bool 103164987c64Sbipmis} 103264987c64Sbipmis 103364987c64Sbipmisdefine i1 @recursiveGEP_orcmp_orOperandsCommuted(ptr %val1, i64 %val2) { 103464987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmp_orOperandsCommuted( 103564987c64Sbipmis; CHECK-NEXT: entry: 103664987c64Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 103764987c64Sbipmis; CHECK: while.cond.i: 103864987c64Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 1039f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 104064987c64Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 104164987c64Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 104264987c64Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 104364987c64Sbipmis; CHECK: while.end.i: 104464987c64Sbipmis; CHECK-NEXT: ret i1 false 104564987c64Sbipmis; 104664987c64Sbipmisentry: 104764987c64Sbipmis br label %while.cond.i 104864987c64Sbipmis 104964987c64Sbipmiswhile.cond.i: 105064987c64Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 105164987c64Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 105264987c64Sbipmis %0 = load i8, ptr %test.0.i, align 2 105364987c64Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 105464987c64Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 105564987c64Sbipmis 105664987c64Sbipmiswhile.end.i: 105764987c64Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 105864987c64Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 105964987c64Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 106064987c64Sbipmis %orval = or i64 %val2, %sub.ptr.sub.i 106164987c64Sbipmis %bool = icmp eq i64 %orval, 0 106264987c64Sbipmis ret i1 %bool 106364987c64Sbipmis} 106464987c64Sbipmis 106564987c64Sbipmis; Test one of the argument to SUB is a ptr2int of a recursive GEP, with multiple use of SUB. 106664987c64Sbipmisdefine i1 @recursiveGEP_orcmpMultiUse(ptr %val1, i64 %val2, ptr %dv1, ptr %dv2) { 106764987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmpMultiUse( 106864987c64Sbipmis; CHECK-NEXT: entry: 106964987c64Sbipmis; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] 107064987c64Sbipmis; CHECK: while.cond.i: 107164987c64Sbipmis; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ] 1072f7685af4SNikita Popov; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1 107364987c64Sbipmis; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2 107464987c64Sbipmis; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0 107564987c64Sbipmis; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]] 107664987c64Sbipmis; CHECK: while.end.i: 107764987c64Sbipmis; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END4:%.*]] 107864987c64Sbipmis; CHECK: if.then: 107964987c64Sbipmis; CHECK-NEXT: br label [[CLEANUP:%.*]] 108064987c64Sbipmis; CHECK: if.end4: 108164987c64Sbipmis; CHECK-NEXT: br label [[CLEANUP]] 108264987c64Sbipmis; CHECK: cleanup: 108364987c64Sbipmis; CHECK-NEXT: ret i1 true 108464987c64Sbipmis; 108564987c64Sbipmisentry: 108664987c64Sbipmis br label %while.cond.i 108764987c64Sbipmis 108864987c64Sbipmiswhile.cond.i: 108964987c64Sbipmis %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ] 109064987c64Sbipmis %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1 109164987c64Sbipmis %0 = load i8, ptr %test.0.i, align 2 109264987c64Sbipmis %cmp3.not.i = icmp eq i8 %0, 0 109364987c64Sbipmis br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i 109464987c64Sbipmis 109564987c64Sbipmiswhile.end.i: 109664987c64Sbipmis %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64 109764987c64Sbipmis %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64 109864987c64Sbipmis %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i 109964987c64Sbipmis %orval = or i64 %sub.ptr.sub.i, %val2 110064987c64Sbipmis %or.cond = icmp eq i64 %orval, 0 110164987c64Sbipmis br i1 %or.cond, label %if.then, label %if.end4 110264987c64Sbipmis 110364987c64Sbipmisif.then: 110464987c64Sbipmis %cmp = icmp eq ptr %dv1, %dv2 110564987c64Sbipmis br label %cleanup 110664987c64Sbipmis 110764987c64Sbipmisif.end4: 110864987c64Sbipmis %tobool = icmp ne i64 %sub.ptr.sub.i, 0 110964987c64Sbipmis br label %cleanup 111064987c64Sbipmis 111164987c64Sbipmiscleanup: 111264987c64Sbipmis %retval.0 = phi i1 [ %cmp, %if.then ], [ %tobool, %if.end4 ] 111364987c64Sbipmis ret i1 %retval.0 111464987c64Sbipmis} 1115*c2fba023Sgoldsteinn 1116*c2fba023Sgoldsteinn 1117*c2fba023Sgoldsteinndefine i32 @issue_124275_wrong_br_direction(i32 noundef %inp) { 1118*c2fba023Sgoldsteinn; CHECK-LABEL: @issue_124275_wrong_br_direction( 1119*c2fba023Sgoldsteinn; CHECK-NEXT: entry: 1120*c2fba023Sgoldsteinn; CHECK-NEXT: [[TMP0:%.*]] = xor i32 [[INP:%.*]], -2 1121*c2fba023Sgoldsteinn; CHECK-NEXT: [[XOR_INP_NEG:%.*]] = add i32 [[TMP0]], 1 1122*c2fba023Sgoldsteinn; CHECK-NEXT: [[CMP_NE_NOT:%.*]] = icmp eq i32 [[XOR_INP_NEG]], 0 1123*c2fba023Sgoldsteinn; CHECK-NEXT: br i1 [[CMP_NE_NOT]], label [[B1:%.*]], label [[B0:%.*]] 1124*c2fba023Sgoldsteinn; CHECK: B0: 1125*c2fba023Sgoldsteinn; CHECK-NEXT: [[PHI_B0:%.*]] = phi i32 [ [[PHI_B1:%.*]], [[B1]] ], [ [[XOR_INP_NEG]], [[ENTRY:%.*]] ] 1126*c2fba023Sgoldsteinn; CHECK-NEXT: br label [[B1]] 1127*c2fba023Sgoldsteinn; CHECK: B1: 1128*c2fba023Sgoldsteinn; CHECK-NEXT: [[PHI_B1]] = phi i32 [ [[PHI_B0]], [[B0]] ], [ 0, [[ENTRY]] ] 1129*c2fba023Sgoldsteinn; CHECK-NEXT: [[CMP_NE_B1_NOT:%.*]] = icmp eq i32 [[PHI_B1]], 0 1130*c2fba023Sgoldsteinn; CHECK-NEXT: br i1 [[CMP_NE_B1_NOT]], label [[B0]], label [[END:%.*]] 1131*c2fba023Sgoldsteinn; CHECK: end: 1132*c2fba023Sgoldsteinn; CHECK-NEXT: ret i32 0 1133*c2fba023Sgoldsteinn; 1134*c2fba023Sgoldsteinnentry: 1135*c2fba023Sgoldsteinn %xor_inp = xor i32 %inp, 1 1136*c2fba023Sgoldsteinn %sub = sub i32 0, %xor_inp 1137*c2fba023Sgoldsteinn %cmp_ne = icmp ne i32 %sub, 0 1138*c2fba023Sgoldsteinn br i1 %cmp_ne, label %B0, label %B1 1139*c2fba023Sgoldsteinn 1140*c2fba023SgoldsteinnB0: 1141*c2fba023Sgoldsteinn %phi_B0 = phi i32 [ %phi_B1, %B1 ], [ %sub, %entry ] 1142*c2fba023Sgoldsteinn br label %B1 1143*c2fba023Sgoldsteinn 1144*c2fba023SgoldsteinnB1: 1145*c2fba023Sgoldsteinn %phi_B1 = phi i32 [ %phi_B0, %B0 ], [ 0, %entry ] 1146*c2fba023Sgoldsteinn %cmp_ne_B1 = icmp ne i32 %phi_B1, 0 1147*c2fba023Sgoldsteinn %cmp_eq_B1 = xor i1 %cmp_ne_B1, true 1148*c2fba023Sgoldsteinn br i1 %cmp_eq_B1, label %B0, label %end 1149*c2fba023Sgoldsteinn 1150*c2fba023Sgoldsteinnend: 1151*c2fba023Sgoldsteinn ret i32 0 1152*c2fba023Sgoldsteinn} 1153