149 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s3 4 5define i1 @infer_nuw(i8 range(i8 0, 2) %A, i8 range(i8 0, 2) %B) {6; CHECK-LABEL: define i1 @infer_nuw(7; CHECK-SAME: i8 range(i8 0, 2) [[A:%.*]], i8 range(i8 0, 2) [[B:%.*]]) {8; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[B]], [[A]]9; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[XOR]] to i110; CHECK-NEXT: ret i1 [[TRUNC]]11;12 %xor = xor i8 %B, %A13 %trunc = trunc i8 %xor to i114 ret i1 %trunc15}16 17 18define i4 @infer_nsw(i8 %A) {19; CHECK-LABEL: define range(i4 -4, 4) i4 @infer_nsw(20; CHECK-SAME: i8 [[A:%.*]]) {21; CHECK-NEXT: [[ASHR:%.*]] = ashr i8 [[A]], 522; CHECK-NEXT: [[B:%.*]] = trunc nsw i8 [[ASHR]] to i423; CHECK-NEXT: ret i4 [[B]]24;25 %ashr = ashr i8 %A, 526 %result = trunc i8 %ashr to i427 ret i4 %result28}29 30 31define i8 @infer_nuw_nsw(i16 range(i16 -5, -3) %A, i16 range(i16 -5, -3) %B) {32; CHECK-LABEL: define range(i8 0, 8) i8 @infer_nuw_nsw(33; CHECK-SAME: i16 range(i16 -5, -3) [[A:%.*]], i16 range(i16 -5, -3) [[B:%.*]]) {34; CHECK-NEXT: [[XOR:%.*]] = xor i16 [[B]], [[A]]35; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw nsw i16 [[XOR]] to i836; CHECK-NEXT: ret i8 [[TRUNC]]37;38 %xor = xor i16 %B, %A39 %trunc = trunc i16 %xor to i840 ret i8 %trunc41}42 43 44define i8 @infer_nsw_from_assume(i16 %x) {45; CHECK-LABEL: define i8 @infer_nsw_from_assume(46; CHECK-SAME: i16 [[X:%.*]]) {47; CHECK-NEXT: [[ADD:%.*]] = add i16 [[X]], 12848; CHECK-NEXT: [[OR_COND_I:%.*]] = icmp ult i16 [[ADD]], 25649; CHECK-NEXT: tail call void @llvm.assume(i1 [[OR_COND_I]])50; CHECK-NEXT: [[CONV1:%.*]] = trunc nsw i16 [[X]] to i851; CHECK-NEXT: ret i8 [[CONV1]]52;53 %add = add i16 %x, 12854 %or.cond.i = icmp ult i16 %add, 25655 tail call void @llvm.assume(i1 %or.cond.i)56 %conv1 = trunc i16 %x to i857 ret i8 %conv158}59 60 61define i1 @rust_issue_122734(i8 range(i8 0, 3) %A, i8 range(i8 0, 3) %B) {62; CHECK-LABEL: define i1 @rust_issue_122734(63; CHECK-SAME: i8 range(i8 0, 3) [[A:%.*]], i8 range(i8 0, 3) [[B:%.*]]) {64; CHECK-NEXT: [[START:.*]]:65; CHECK-NEXT: [[LHS:%.*]] = icmp eq i8 [[A]], 266; CHECK-NEXT: [[RHS:%.*]] = icmp eq i8 [[B]], 267; CHECK-NEXT: [[OR:%.*]] = or i1 [[LHS]], [[RHS]]68; CHECK-NEXT: [[AND:%.*]] = and i1 [[LHS]], [[RHS]]69; CHECK-NEXT: br i1 [[OR]], label %[[IFTRUE:.*]], label %[[IFFALSE:.*]]70; CHECK: [[IFTRUE]]:71; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[XOR2:%.*]], %[[IFFALSE]] ], [ [[AND]], %[[START]] ]72; CHECK-NEXT: ret i1 [[PHI]]73; CHECK: [[IFFALSE]]:74; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A]], [[B]]75; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[XOR]] to i176; CHECK-NEXT: [[XOR2]] = xor i1 [[TRUNC]], true77; CHECK-NEXT: br label %[[IFTRUE]]78;79start:80 %lhs = icmp eq i8 %A, 281 %rhs = icmp eq i8 %B, 282 %or = or i1 %lhs, %rhs83 %and = and i1 %lhs, %rhs84 br i1 %or, label %iftrue, label %iffalse85 86iftrue:87 %phi = phi i1 [ %xor2, %iffalse], [ %and, %start ]88 ret i1 %phi89 90iffalse:91 %xor = xor i8 %A, %B92 %trunc = trunc i8 %xor to i193 %xor2 = xor i1 %trunc, true94 br label %iftrue95}96 97 98define i1 @overdefined_range_negative(i8 %A, i8 %B) {99; CHECK-LABEL: define i1 @overdefined_range_negative(100; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {101; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A]], [[B]]102; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[XOR]] to i1103; CHECK-NEXT: ret i1 [[TRUNC]]104;105 %xor = xor i8 %A, %B106 %trunc = trunc i8 %xor to i1107 ret i1 %trunc108}109 110define i1 @trunc_nuw_infere_false_for_icmp_ne_1(i8 %x) {111; CHECK-LABEL: define i1 @trunc_nuw_infere_false_for_icmp_ne_1(112; CHECK-SAME: i8 [[X:%.*]]) {113; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X]], 1114; CHECK-NEXT: br i1 [[ICMP]], label %[[IFTRUE:.*]], label %[[IFFALSE:.*]]115; CHECK: [[IFTRUE]]:116; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X]] to i1117; CHECK-NEXT: ret i1 false118; CHECK: [[IFFALSE]]:119; CHECK-NEXT: ret i1 true120;121 %icmp = icmp ne i8 %x, 1122 br i1 %icmp, label %iftrue, label %iffalse123iftrue:124 %trunc = trunc nuw i8 %x to i1125 ret i1 %trunc126iffalse:127 ret i1 true128}129 130define i1 @neg_trunc_do_not_infere_false_for_icmp_ne_1(i8 %x) {131; CHECK-LABEL: define i1 @neg_trunc_do_not_infere_false_for_icmp_ne_1(132; CHECK-SAME: i8 [[X:%.*]]) {133; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X]], 1134; CHECK-NEXT: br i1 [[ICMP]], label %[[IFTRUE:.*]], label %[[IFFALSE:.*]]135; CHECK: [[IFTRUE]]:136; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X]] to i1137; CHECK-NEXT: ret i1 [[TRUNC]]138; CHECK: [[IFFALSE]]:139; CHECK-NEXT: ret i1 true140;141 %icmp = icmp ne i8 %x, 1142 br i1 %icmp, label %iftrue, label %iffalse143iftrue:144 %trunc = trunc i8 %x to i1145 ret i1 %trunc146iffalse:147 ret i1 true148}149