121 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @single(i32 %A) {5; CHECK-LABEL: @single(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[CONV71:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 -128)8; CHECK-NEXT: [[CONV7:%.*]] = trunc i32 [[CONV71]] to i89; CHECK-NEXT: ret i8 [[CONV7]]10;11entry:12 %l1 = icmp slt i32 %A, -12813 %l2 = select i1 %l1, i32 128, i32 %A14 %conv7 = trunc i32 %l2 to i815 ret i8 %conv716}17 18define i8 @double(i32 %A) {19; CHECK-LABEL: @double(20; CHECK-NEXT: entry:21; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 -128)22; CHECK-NEXT: [[CONV71:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP0]], i32 127)23; CHECK-NEXT: [[CONV7:%.*]] = trunc nsw i32 [[CONV71]] to i824; CHECK-NEXT: ret i8 [[CONV7]]25;26entry:27 %l1 = icmp slt i32 %A, -12828 %l2 = select i1 %l1, i32 128, i32 %A29 %.inv = icmp sgt i32 %A, 12730 %spec.select.i = select i1 %.inv, i32 127, i32 %l231 %conv7 = trunc i32 %spec.select.i to i832 ret i8 %conv733}34 35define i8 @thisdoesnotloop(i32 %A, i32 %B) {36; CHECK-LABEL: @thisdoesnotloop(37; CHECK-NEXT: entry:38; CHECK-NEXT: [[L1:%.*]] = icmp slt i32 [[A:%.*]], -12839; CHECK-NEXT: [[TMP0:%.*]] = trunc i32 [[B:%.*]] to i840; CHECK-NEXT: [[CONV7:%.*]] = select i1 [[L1]], i8 -128, i8 [[TMP0]]41; CHECK-NEXT: ret i8 [[CONV7]]42;43entry:44 %l1 = icmp slt i32 %A, -12845 %l2 = select i1 %l1, i32 128, i32 %B46 %conv7 = trunc i32 %l2 to i847 ret i8 %conv748}49 50define i8 @original(i32 %A, i32 %B) {51; CHECK-LABEL: @original(52; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 -128)53; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 127)54; CHECK-NEXT: [[CONV7:%.*]] = trunc nsw i32 [[SPEC_SELECT_I]] to i855; CHECK-NEXT: ret i8 [[CONV7]]56;57 %cmp4.i = icmp slt i32 127, %A58 %cmp6.i = icmp sle i32 -128, %A59 %retval.0.i = select i1 %cmp4.i, i32 127, i32 -12860 %not.cmp4.i = xor i1 %cmp4.i, true61 %cleanup.dest.slot.0.i = and i1 %cmp6.i, %not.cmp4.i62 %spec.select.i = select i1 %cleanup.dest.slot.0.i, i32 %A, i32 %retval.0.i63 %conv7 = trunc i32 %spec.select.i to i864 ret i8 %conv765}66 67define i8 @original_logical(i32 %A, i32 %B) {68; CHECK-LABEL: @original_logical(69; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 -128)70; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 127)71; CHECK-NEXT: [[CONV7:%.*]] = trunc nsw i32 [[SPEC_SELECT_I]] to i872; CHECK-NEXT: ret i8 [[CONV7]]73;74 %cmp4.i = icmp slt i32 127, %A75 %cmp6.i = icmp sle i32 -128, %A76 %retval.0.i = select i1 %cmp4.i, i32 127, i32 -12877 %not.cmp4.i = xor i1 %cmp4.i, true78 %cleanup.dest.slot.0.i = select i1 %cmp6.i, i1 %not.cmp4.i, i1 false79 %spec.select.i = select i1 %cleanup.dest.slot.0.i, i32 %A, i32 %retval.0.i80 %conv7 = trunc i32 %spec.select.i to i881 ret i8 %conv782}83 84; This would infinite loop because we have potentially opposing85; constant transforms on degenerate (unsimplified) cmps.86 87define i32 @PR49205(i32 %t0, i1 %b) {88; CHECK-LABEL: @PR49205(89; CHECK-NEXT: entry:90; CHECK-NEXT: br label [[FOR_COND:%.*]]91; CHECK: for.cond:92; CHECK-NEXT: br i1 [[B:%.*]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]93; CHECK: for.body:94; CHECK-NEXT: br label [[FOR_COND]]95; CHECK: for.end:96; CHECK-NEXT: ret i32 197;98entry:99 br label %for.cond100 101for.cond:102 %s = phi i32 [ 7, %entry ], [ %add, %for.body ]103 br i1 %b, label %for.body, label %for.end104 105for.body:106 %div = add i32 %t0, undef107 %add = add nsw i32 %div, 1108 br label %for.cond109 110for.end:111 %cmp6 = icmp ne i32 %s, 4112 %conv = zext i1 %cmp6 to i32113 %and7 = and i32 %s, %conv114 %sub = sub i32 %s, %and7115 %cmp9 = icmp ne i32 %sub, 4116 %conv10 = zext i1 %cmp9 to i32117 %sub11 = sub i32 %conv10, %sub118 %and = and i32 %sub11, 1119 ret i32 %and120}121