1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4; Make sure instcombine don't fold select into operands. We don't want to emit 5; select of two integers unless it's selecting 0 / 1. 6 7define i32 @t1(i32 %c, i32 %x) { 8; CHECK-LABEL: @t1( 9; CHECK-NEXT: [[T1:%.*]] = icmp eq i32 [[C:%.*]], 0 10; CHECK-NEXT: [[T2:%.*]] = lshr i32 [[X:%.*]], 18 11; CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 [[T2]], i32 [[X]] 12; CHECK-NEXT: ret i32 [[T3]] 13; 14 %t1 = icmp eq i32 %c, 0 15 %t2 = lshr i32 %x, 18 16 %t3 = select i1 %t1, i32 %t2, i32 %x 17 ret i32 %t3 18} 19 20define i32 @t2(i32 %c, i32 %x) { 21; CHECK-LABEL: @t2( 22; CHECK-NEXT: [[T1:%.*]] = icmp eq i32 [[C:%.*]], 0 23; CHECK-NEXT: [[T2:%.*]] = and i32 [[X:%.*]], 18 24; CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 [[T2]], i32 [[X]] 25; CHECK-NEXT: ret i32 [[T3]] 26; 27 %t1 = icmp eq i32 %c, 0 28 %t2 = and i32 %x, 18 29 %t3 = select i1 %t1, i32 %t2, i32 %x 30 ret i32 %t3 31} 32 33define float @t3(float %x, float %y) { 34; CHECK-LABEL: @t3( 35; CHECK-NEXT: [[T1:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]] 36; CHECK-NEXT: [[TMP1:%.*]] = fadd fast float [[X]], 1.000000e+00 37; CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], float [[TMP1]], float 2.000000e+00 38; CHECK-NEXT: ret float [[T3]] 39; 40 %t1 = fcmp ogt float %x, %y 41 %t2 = select i1 %t1, float %x, float 1.0 42 %t3 = fadd fast float %t2, 1.0 43 ret float %t3 44} 45 46define i8 @ashr_exact_poison_constant_fold(i1 %b, i8 %x) { 47; CHECK-LABEL: @ashr_exact_poison_constant_fold( 48; CHECK-NEXT: [[TMP1:%.*]] = ashr i8 [[X:%.*]], 3 49; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 5 50; CHECK-NEXT: ret i8 [[R]] 51; 52 %s = select i1 %b, i8 %x, i8 42 53 %r = ashr exact i8 %s, 3 54 ret i8 %r 55} 56 57define i8 @ashr_exact(i1 %b, i8 %x) { 58; CHECK-LABEL: @ashr_exact( 59; CHECK-NEXT: [[TMP1:%.*]] = ashr exact i8 [[X:%.*]], 3 60; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 2 61; CHECK-NEXT: ret i8 [[R]] 62; 63 %s = select i1 %b, i8 %x, i8 16 64 %r = ashr exact i8 %s, 3 65 ret i8 %r 66} 67 68define i8 @shl_nsw_nuw_poison_constant_fold(i1 %b, i8 %x) { 69; CHECK-LABEL: @shl_nsw_nuw_poison_constant_fold( 70; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i8 16, [[X:%.*]] 71; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 -128, i8 [[TMP1]] 72; CHECK-NEXT: ret i8 [[R]] 73; 74 %s = select i1 %b, i8 3, i8 %x 75 %r = shl nsw nuw i8 16, %s 76 ret i8 %r 77} 78 79define i8 @shl_nsw_nuw(i1 %b, i8 %x) { 80; CHECK-LABEL: @shl_nsw_nuw( 81; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i8 7, [[X:%.*]] 82; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 56, i8 [[TMP1]] 83; CHECK-NEXT: ret i8 [[R]] 84; 85 %s = select i1 %b, i8 3, i8 %x 86 %r = shl nsw nuw i8 7, %s 87 ret i8 %r 88} 89 90define i8 @add_nsw_poison_constant_fold(i1 %b, i8 %x) { 91; CHECK-LABEL: @add_nsw_poison_constant_fold( 92; CHECK-NEXT: [[TMP1:%.*]] = add nsw i8 [[X:%.*]], 64 93; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 -127 94; CHECK-NEXT: ret i8 [[R]] 95; 96 %s = select i1 %b, i8 %x, i8 65 97 %r = add nsw i8 %s, 64 98 ret i8 %r 99} 100 101define i8 @add_nsw(i1 %b, i8 %x) { 102; CHECK-LABEL: @add_nsw( 103; CHECK-NEXT: [[TMP1:%.*]] = add nsw i8 [[X:%.*]], 64 104; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 71 105; CHECK-NEXT: ret i8 [[R]] 106; 107 %s = select i1 %b, i8 %x, i8 7 108 %r = add nsw i8 %s, 64 109 ret i8 %r 110} 111