1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3; PR2629 4 5define void @f(ptr %x) nounwind { 6; CHECK-LABEL: @f( 7; CHECK-NEXT: entry: 8; CHECK-NEXT: br label [[BB:%.*]] 9; CHECK: bb: 10; CHECK-NEXT: [[L1:%.*]] = load i8, ptr [[X:%.*]], align 1 11; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[L1]], -9 12; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[TMP0]], -3 13; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[L1]], -13 14; CHECK-NEXT: [[C2:%.*]] = icmp ult i8 [[TMP1]], -3 15; CHECK-NEXT: [[A1:%.*]] = and i1 [[C1]], [[C2]] 16; CHECK-NEXT: br i1 [[A1]], label [[INCOMPATIBLE:%.*]], label [[OKAY:%.*]] 17; CHECK: okay: 18; CHECK-NEXT: ret void 19; CHECK: incompatible: 20; CHECK-NEXT: ret void 21; 22entry: 23 br label %bb 24 25bb: 26 %l1 = load i8, ptr %x, align 1 27 %s1 = sub i8 %l1, 6 28 %c1 = icmp ugt i8 %s1, 2 29 %s2 = sub i8 %l1, 10 30 %c2 = icmp ugt i8 %s2, 2 31 %a1 = and i1 %c1, %c2 32 br i1 %a1, label %incompatible, label %okay 33 34okay: 35 ret void 36 37incompatible: 38 ret void 39} 40 41define void @f_logical(ptr %x) nounwind { 42; CHECK-LABEL: @f_logical( 43; CHECK-NEXT: entry: 44; CHECK-NEXT: br label [[BB:%.*]] 45; CHECK: bb: 46; CHECK-NEXT: [[L1:%.*]] = load i8, ptr [[X:%.*]], align 1 47; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[L1]], -9 48; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[TMP0]], -3 49; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[L1]], -13 50; CHECK-NEXT: [[C2:%.*]] = icmp ult i8 [[TMP1]], -3 51; CHECK-NEXT: [[A1:%.*]] = and i1 [[C1]], [[C2]] 52; CHECK-NEXT: br i1 [[A1]], label [[INCOMPATIBLE:%.*]], label [[OKAY:%.*]] 53; CHECK: okay: 54; CHECK-NEXT: ret void 55; CHECK: incompatible: 56; CHECK-NEXT: ret void 57; 58entry: 59 br label %bb 60 61bb: 62 %l1 = load i8, ptr %x, align 1 63 %s1 = sub i8 %l1, 6 64 %c1 = icmp ugt i8 %s1, 2 65 %s2 = sub i8 %l1, 10 66 %c2 = icmp ugt i8 %s2, 2 67 %a1 = select i1 %c1, i1 %c2, i1 false 68 br i1 %a1, label %incompatible, label %okay 69 70okay: 71 ret void 72 73incompatible: 74 ret void 75} 76