1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine void @hang_2002-03-11(i32 %X) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hang_2002-03-11( 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker %reg117 = add i32 %X, 0 9*9880d681SAndroid Build Coastguard Worker ret void 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Instcombine was missing a test that caused it to make illegal transformations 13*9880d681SAndroid Build Coastguard Worker; sometimes. In this case, it transformed the sub into an add: 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @sub_failure_2002-05-14(i32 %i, i32 %j) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub_failure_2002-05-14( 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = mul i32 %i, %j 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = sub i32 2, [[A]] 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 20*9880d681SAndroid Build Coastguard Worker; 21*9880d681SAndroid Build Coastguard Worker %A = mul i32 %i, %j 22*9880d681SAndroid Build Coastguard Worker %B = sub i32 2, %A 23*9880d681SAndroid Build Coastguard Worker ret i32 %B 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; This testcase was incorrectly getting completely eliminated. There should be 27*9880d681SAndroid Build Coastguard Worker; SOME instruction named %c here, even if it's a bitwise and. 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i64 @cast_test_2002-08-02(i64 %A) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cast_test_2002-08-02( 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C2:%.*]] = and i64 %A, 255 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[C2]] 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker %c1 = trunc i64 %A to i8 35*9880d681SAndroid Build Coastguard Worker %c2 = zext i8 %c1 to i64 36*9880d681SAndroid Build Coastguard Worker ret i64 %c2 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @missed_const_prop_2002-12-05(i32 %A) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @missed_const_prop_2002-12-05( 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker %A.neg = sub i32 0, %A 44*9880d681SAndroid Build Coastguard Worker %.neg = sub i32 0, 1 45*9880d681SAndroid Build Coastguard Worker %X = add i32 %.neg, 1 46*9880d681SAndroid Build Coastguard Worker %Y.neg.ra = add i32 %A, %X 47*9880d681SAndroid Build Coastguard Worker %r = add i32 %A.neg, %Y.neg.ra 48*9880d681SAndroid Build Coastguard Worker ret i32 %r 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51