1*9880d681SAndroid Build Coastguard Worker; This test makes sure that add instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; This test is for Integer BitWidth > 64 && BitWidth <= 1024. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | \ 5*9880d681SAndroid Build Coastguard Worker; RUN: grep -v OK | not grep add 6*9880d681SAndroid Build Coastguard Worker; END. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i111 @test1(i111 %x) { 9*9880d681SAndroid Build Coastguard Worker %tmp.2 = shl i111 1, 110 10*9880d681SAndroid Build Coastguard Worker %tmp.4 = xor i111 %x, %tmp.2 11*9880d681SAndroid Build Coastguard Worker ;; Add of sign bit -> xor of sign bit. 12*9880d681SAndroid Build Coastguard Worker %tmp.6 = add i111 %tmp.4, %tmp.2 13*9880d681SAndroid Build Coastguard Worker ret i111 %tmp.6 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i65 @test2(i65 %x) { 17*9880d681SAndroid Build Coastguard Worker %tmp.0 = shl i65 1, 64 18*9880d681SAndroid Build Coastguard Worker %tmp.2 = xor i65 %x, %tmp.0 19*9880d681SAndroid Build Coastguard Worker ;; Add of sign bit -> xor of sign bit. 20*9880d681SAndroid Build Coastguard Worker %tmp.4 = add i65 %tmp.2, %tmp.0 21*9880d681SAndroid Build Coastguard Worker ret i65 %tmp.4 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i1024 @test3(i1024 %x) { 25*9880d681SAndroid Build Coastguard Worker %tmp.0 = shl i1024 1, 1023 26*9880d681SAndroid Build Coastguard Worker %tmp.2 = xor i1024 %x, %tmp.0 27*9880d681SAndroid Build Coastguard Worker ;; Add of sign bit -> xor of sign bit. 28*9880d681SAndroid Build Coastguard Worker %tmp.4 = add i1024 %tmp.2, %tmp.0 29*9880d681SAndroid Build Coastguard Worker ret i1024 %tmp.4 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine i128 @test4(i128 %x) { 33*9880d681SAndroid Build Coastguard Worker ;; If we have ADD(XOR(AND(X, 0xFF), 0xF..F80), 0x80), it's a sext. 34*9880d681SAndroid Build Coastguard Worker %tmp.5 = shl i128 1, 127 35*9880d681SAndroid Build Coastguard Worker %tmp.1 = ashr i128 %tmp.5, 120 36*9880d681SAndroid Build Coastguard Worker %tmp.2 = xor i128 %x, %tmp.1 37*9880d681SAndroid Build Coastguard Worker %tmp.4 = add i128 %tmp.2, %tmp.5 38*9880d681SAndroid Build Coastguard Worker ret i128 %tmp.4 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i77 @test6(i77 %x) { 42*9880d681SAndroid Build Coastguard Worker ;; (x & 254)+1 -> (x & 254)|1 43*9880d681SAndroid Build Coastguard Worker %tmp.2 = and i77 %x, 562949953421310 44*9880d681SAndroid Build Coastguard Worker %tmp.4 = add i77 %tmp.2, 1 45*9880d681SAndroid Build Coastguard Worker ret i77 %tmp.4 46*9880d681SAndroid Build Coastguard Worker} 47