1*9880d681SAndroid Build Coastguard Worker; This tests for various complex cast elimination cases instcombine should 2*9880d681SAndroid Build Coastguard Worker; handle. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i1 @test1(i32 %X) { 9*9880d681SAndroid Build Coastguard Worker %A = bitcast i32 %X to i32 ; <i32> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker ; Convert to setne int %X, 12 11*9880d681SAndroid Build Coastguard Worker %c = icmp ne i32 %A, 12 ; <i1> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker ret i1 %c 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 14*9880d681SAndroid Build Coastguard Worker; CHECK: %c = icmp ne i32 %X, 12 15*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(i32 %X, i32 %Y) { 19*9880d681SAndroid Build Coastguard Worker %A = bitcast i32 %X to i32 ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker %B = bitcast i32 %Y to i32 ; <i32> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker ; Convert to setne int %X, %Y 22*9880d681SAndroid Build Coastguard Worker %c = icmp ne i32 %A, %B ; <i1> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker ret i1 %c 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 25*9880d681SAndroid Build Coastguard Worker; CHECK: %c = icmp ne i32 %X, %Y 26*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %A) { 30*9880d681SAndroid Build Coastguard Worker %B = bitcast i32 %A to i32 ; <i32> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker %C = shl i32 %B, 2 ; <i32> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker %D = bitcast i32 %C to i32 ; <i32> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker ret i32 %D 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 35*9880d681SAndroid Build Coastguard Worker; CHECK: %C = shl i32 %A, 2 36*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i16 @test5(i16 %A) { 40*9880d681SAndroid Build Coastguard Worker %B = sext i16 %A to i32 ; <i32> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, 15 ; <i32> [#uses=1] 42*9880d681SAndroid Build Coastguard Worker %D = trunc i32 %C to i16 ; <i16> [#uses=1] 43*9880d681SAndroid Build Coastguard Worker ret i16 %D 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 45*9880d681SAndroid Build Coastguard Worker; CHECK: %C = and i16 %A, 15 46*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 %C 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i1 %A) { 50*9880d681SAndroid Build Coastguard Worker %B = zext i1 %A to i32 ; <i32> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 ; <i1> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker ret i1 %C 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 54*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %A 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i1 @test6a(i1 %A) { 58*9880d681SAndroid Build Coastguard Worker %B = zext i1 %A to i32 ; <i32> [#uses=1] 59*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, -1 ; <i1> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker ret i1 %C 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6a( 62*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i8* %A) { 66*9880d681SAndroid Build Coastguard Worker %B = bitcast i8* %A to i32* ; <i32*> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32* %B, null ; <i1> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker ret i1 %C 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 70*9880d681SAndroid Build Coastguard Worker; CHECK: %C = icmp eq i8* %A, null 71*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %C 72*9880d681SAndroid Build Coastguard Worker} 73