brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 4fca708 Raw
169 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 4target datalayout = "p:32:32"5 6define i32 @infer_range_from_dom_equality(i32 %x, i32 %y) {7; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality(8; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {9; CHECK-NEXT:  [[ENTRY:.*:]]10; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Y]]11; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]12; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]13; CHECK:       [[IF_THEN]]:14; CHECK-NEXT:    ret i32 115; CHECK:       [[IF_ELSE]]:16; CHECK-NEXT:    ret i32 [[SUB]]17;18entry:19  %cond = icmp eq i32 %x, %y20  %sub = sub i32 %x, %y21  br i1 %cond, label %if.then, label %if.else22 23if.then:24  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)25  ret i32 %max126 27if.else:28  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)29  ret i32 %max230}31 32define i32 @infer_range_from_dom_equality_commuted1(i32 %x, i32 %y) {33; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_commuted1(34; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {35; CHECK-NEXT:  [[ENTRY:.*:]]36; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Y]]37; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[Y]], [[X]]38; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]39; CHECK:       [[IF_THEN]]:40; CHECK-NEXT:    ret i32 141; CHECK:       [[IF_ELSE]]:42; CHECK-NEXT:    ret i32 [[SUB]]43;44entry:45  %cond = icmp eq i32 %x, %y46  %sub = sub i32 %y, %x47  br i1 %cond, label %if.then, label %if.else48 49if.then:50  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)51  ret i32 %max152 53if.else:54  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)55  ret i32 %max256}57 58define i32 @infer_range_from_dom_equality_commuted2(i32 %x, i32 %y) {59; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_commuted2(60; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {61; CHECK-NEXT:  [[ENTRY:.*:]]62; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[Y]], [[X]]63; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]64; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]65; CHECK:       [[IF_THEN]]:66; CHECK-NEXT:    ret i32 167; CHECK:       [[IF_ELSE]]:68; CHECK-NEXT:    ret i32 [[SUB]]69;70entry:71  %cond = icmp eq i32 %y, %x72  %sub = sub i32 %x, %y73  br i1 %cond, label %if.then, label %if.else74 75if.then:76  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)77  ret i32 %max178 79if.else:80  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)81  ret i32 %max282}83 84define i32 @infer_range_from_dom_equality_ptrdiff(ptr %x, ptr %y) {85; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_ptrdiff(86; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {87; CHECK-NEXT:    [[COND:%.*]] = icmp eq ptr [[X]], [[Y]]88; CHECK-NEXT:    [[XI:%.*]] = ptrtoint ptr [[X]] to i3289; CHECK-NEXT:    [[YI:%.*]] = ptrtoint ptr [[Y]] to i3290; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[XI]], [[YI]]91; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]92; CHECK:       [[IF_THEN]]:93; CHECK-NEXT:    ret i32 194; CHECK:       [[IF_ELSE]]:95; CHECK-NEXT:    ret i32 [[SUB]]96;97  %cond = icmp eq ptr %x, %y98  %xi = ptrtoint ptr %x to i3299  %yi = ptrtoint ptr %y to i32100  %sub = sub i32 %xi, %yi101  br i1 %cond, label %if.then, label %if.else102 103if.then:104  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)105  ret i32 %max1106 107if.else:108  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)109  ret i32 %max2110}111 112; Negative tests113 114define i32 @infer_range_from_dom_slt(i32 %x, i32 %y) {115; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_slt(116; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {117; CHECK-NEXT:  [[ENTRY:.*:]]118; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[X]], [[Y]]119; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]120; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]121; CHECK:       [[IF_THEN]]:122; CHECK-NEXT:    [[MAX1:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)123; CHECK-NEXT:    ret i32 [[MAX1]]124; CHECK:       [[IF_ELSE]]:125; CHECK-NEXT:    [[MAX2:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)126; CHECK-NEXT:    ret i32 [[MAX2]]127;128entry:129  %cond = icmp slt i32 %x, %y130  %sub = sub i32 %x, %y131  br i1 %cond, label %if.then, label %if.else132 133if.then:134  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)135  ret i32 %max1136 137if.else:138  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)139  ret i32 %max2140}141 142define i32 @infer_range_from_dom_equality_not_match(i32 %x, i32 %y, i32 %z) {143; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_not_match(144; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {145; CHECK-NEXT:  [[ENTRY:.*:]]146; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Z]]147; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]148; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]149; CHECK:       [[IF_THEN]]:150; CHECK-NEXT:    [[MAX1:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)151; CHECK-NEXT:    ret i32 [[MAX1]]152; CHECK:       [[IF_ELSE]]:153; CHECK-NEXT:    [[MAX2:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)154; CHECK-NEXT:    ret i32 [[MAX2]]155;156entry:157  %cond = icmp eq i32 %x, %z158  %sub = sub i32 %x, %y159  br i1 %cond, label %if.then, label %if.else160 161if.then:162  %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)163  ret i32 %max1164 165if.else:166  %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)167  ret i32 %max2168}169