brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 42a89ab Raw
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