1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/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 i64 @test_sext_zext(i16 %A) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sext_zext( 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C2:%.*]] = zext i16 %A to i64 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[C2]] 8*9880d681SAndroid Build Coastguard Worker; 9*9880d681SAndroid Build Coastguard Worker %c1 = zext i16 %A to i32 10*9880d681SAndroid Build Coastguard Worker %c2 = sext i32 %c1 to i64 11*9880d681SAndroid Build Coastguard Worker ret i64 %c2 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test2(<2 x i1> %A) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = zext <2 x i1> %A to <2 x i64> 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = xor <2 x i64> [[TMP1]], <i64 1, i64 1> 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[ZEXT]] 19*9880d681SAndroid Build Coastguard Worker; 20*9880d681SAndroid Build Coastguard Worker %xor = xor <2 x i1> %A, <i1 true, i1 true> 21*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i1> %xor to <2 x i64> 22*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %zext 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test3(<2 x i64> %A) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and <2 x i64> %A, <i64 23, i64 42> 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[AND]] 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %A to <2 x i32> 31*9880d681SAndroid Build Coastguard Worker %and = and <2 x i32> %trunc, <i32 23, i32 42> 32*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i32> %and to <2 x i64> 33*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %zext 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test4(<2 x i64> %A) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i64> %A, <i64 4294967295, i64 4294967295> 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = and <2 x i64> [[TMP1]], <i64 23, i64 42> 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[XOR]] 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %A to <2 x i32> 43*9880d681SAndroid Build Coastguard Worker %and = and <2 x i32> %trunc, <i32 23, i32 42> 44*9880d681SAndroid Build Coastguard Worker %xor = xor <2 x i32> %and, <i32 23, i32 42> 45*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i32> %xor to <2 x i64> 46*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %zext 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; FIXME: If the xor was done in the smaller type, the back-to-back zexts would get combined. 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i64 @fold_xor_zext_sandwich(i1 %a) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_xor_zext_sandwich( 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT1:%.*]] = zext i1 %a to i32 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[ZEXT1]], 1 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT2:%.*]] = zext i32 [[XOR]] to i64 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[ZEXT2]] 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker %zext1 = zext i1 %a to i32 59*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %zext1, 1 60*9880d681SAndroid Build Coastguard Worker %zext2 = zext i32 %xor to i64 61*9880d681SAndroid Build Coastguard Worker ret i64 %zext2 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @fold_xor_zext_sandwich_vec(<2 x i1> %a) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_xor_zext_sandwich_vec( 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT1:%.*]] = zext <2 x i1> %a to <2 x i64> 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i64> [[ZEXT1]], <i64 1, i64 1> 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> [[XOR]] 69*9880d681SAndroid Build Coastguard Worker; 70*9880d681SAndroid Build Coastguard Worker %zext1 = zext <2 x i1> %a to <2 x i32> 71*9880d681SAndroid Build Coastguard Worker %xor = xor <2 x i32> %zext1, <i32 1, i32 1> 72*9880d681SAndroid Build Coastguard Worker %zext2 = zext <2 x i32> %xor to <2 x i64> 73*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %zext2 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76