1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub1( 4*9880d681SAndroid Build Coastguard Worker; CHECK: %y = sub i32 0, %x 5*9880d681SAndroid Build Coastguard Worker; CHECK: %z = sdiv i32 %y, 337 6*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %z 7*9880d681SAndroid Build Coastguard Workerdefine i32 @sub1(i32 %x) { 8*9880d681SAndroid Build Coastguard Worker %y = sub i32 0, %x 9*9880d681SAndroid Build Coastguard Worker %z = sdiv i32 %y, 337 10*9880d681SAndroid Build Coastguard Worker ret i32 %z 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub2( 14*9880d681SAndroid Build Coastguard Worker; CHECK: %z = sdiv i32 %x, -337 15*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %z 16*9880d681SAndroid Build Coastguard Workerdefine i32 @sub2(i32 %x) { 17*9880d681SAndroid Build Coastguard Worker %y = sub nsw i32 0, %x 18*9880d681SAndroid Build Coastguard Worker %z = sdiv i32 %y, 337 19*9880d681SAndroid Build Coastguard Worker ret i32 %z 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl_icmp( 23*9880d681SAndroid Build Coastguard Worker; CHECK: %B = icmp eq i64 %X, 0 24*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %B 25*9880d681SAndroid Build Coastguard Workerdefine i1 @shl_icmp(i64 %X) nounwind { 26*9880d681SAndroid Build Coastguard Worker %A = shl nuw i64 %X, 2 ; X/4 27*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 0 28*9880d681SAndroid Build Coastguard Worker ret i1 %B 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl1( 32*9880d681SAndroid Build Coastguard Worker; CHECK: %B = shl nuw nsw i64 %A, 8 33*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 %B 34*9880d681SAndroid Build Coastguard Workerdefine i64 @shl1(i64 %X, i64* %P) nounwind { 35*9880d681SAndroid Build Coastguard Worker %A = and i64 %X, 312 36*9880d681SAndroid Build Coastguard Worker store i64 %A, i64* %P ; multiple uses of A. 37*9880d681SAndroid Build Coastguard Worker %B = shl i64 %A, 8 38*9880d681SAndroid Build Coastguard Worker ret i64 %B 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @preserve1( 42*9880d681SAndroid Build Coastguard Worker; CHECK: add nsw i32 %x, 5 43*9880d681SAndroid Build Coastguard Workerdefine i32 @preserve1(i32 %x) nounwind { 44*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %x, 2 45*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %add, 3 46*9880d681SAndroid Build Coastguard Worker ret i32 %add3 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nopreserve1( 50*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 %x, -126 51*9880d681SAndroid Build Coastguard Workerdefine i8 @nopreserve1(i8 %x) nounwind { 52*9880d681SAndroid Build Coastguard Worker %add = add nsw i8 %x, 127 53*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i8 %add, 3 54*9880d681SAndroid Build Coastguard Worker ret i8 %add3 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nopreserve2( 58*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 %x, 3 59*9880d681SAndroid Build Coastguard Workerdefine i8 @nopreserve2(i8 %x) nounwind { 60*9880d681SAndroid Build Coastguard Worker %add = add i8 %x, 1 61*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i8 %add, 2 62*9880d681SAndroid Build Coastguard Worker ret i8 %add3 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nopreserve3( 66*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 %A, %B 67*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 68*9880d681SAndroid Build Coastguard Workerdefine i8 @nopreserve3(i8 %A, i8 %B) nounwind { 69*9880d681SAndroid Build Coastguard Worker %x = add i8 %A, 10 70*9880d681SAndroid Build Coastguard Worker %y = add i8 %B, 10 71*9880d681SAndroid Build Coastguard Worker %add = add nsw i8 %x, %y 72*9880d681SAndroid Build Coastguard Worker ret i8 %add 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nopreserve4( 76*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 %A, %B 77*9880d681SAndroid Build Coastguard Worker; CHECK: add i8 78*9880d681SAndroid Build Coastguard Workerdefine i8 @nopreserve4(i8 %A, i8 %B) nounwind { 79*9880d681SAndroid Build Coastguard Worker %x = add nsw i8 %A, 10 80*9880d681SAndroid Build Coastguard Worker %y = add nsw i8 %B, 10 81*9880d681SAndroid Build Coastguard Worker %add = add nsw i8 %x, %y 82*9880d681SAndroid Build Coastguard Worker ret i8 %add 83*9880d681SAndroid Build Coastguard Worker} 84