1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine -expensive-combines < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@d = global i32 15, align 4 6*9880d681SAndroid Build Coastguard Worker@b = global i32* @d, align 8 7*9880d681SAndroid Build Coastguard Worker@a = common global i32 0, align 4 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 10*9880d681SAndroid Build Coastguard Workerdefine signext i32 @main() #1 { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %0 = load i32*, i32** @b, align 8 13*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @a, align 4 14*9880d681SAndroid Build Coastguard Worker %lnot = icmp eq i32 %1, 0 15*9880d681SAndroid Build Coastguard Worker %lnot.ext = zext i1 %lnot to i32 16*9880d681SAndroid Build Coastguard Worker %shr.i = lshr i32 2072, %lnot.ext 17*9880d681SAndroid Build Coastguard Worker %call.lobit = lshr i32 %shr.i, 7 18*9880d681SAndroid Build Coastguard Worker %2 = and i32 %call.lobit, 1 19*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %0, align 4 20*9880d681SAndroid Build Coastguard Worker %or = or i32 %2, %3 21*9880d681SAndroid Build Coastguard Worker store i32 %or, i32* %0, align 4 22*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* @a, align 4 23*9880d681SAndroid Build Coastguard Worker %lnot.1 = icmp eq i32 %4, 0 24*9880d681SAndroid Build Coastguard Worker %lnot.ext.1 = zext i1 %lnot.1 to i32 25*9880d681SAndroid Build Coastguard Worker %shr.i.1 = lshr i32 2072, %lnot.ext.1 26*9880d681SAndroid Build Coastguard Worker %call.lobit.1 = lshr i32 %shr.i.1, 7 27*9880d681SAndroid Build Coastguard Worker %5 = and i32 %call.lobit.1, 1 28*9880d681SAndroid Build Coastguard Worker %or.1 = or i32 %5, %or 29*9880d681SAndroid Build Coastguard Worker store i32 %or.1, i32* %0, align 4 30*9880d681SAndroid Build Coastguard Worker ret i32 %or.1 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; Check that both InstCombine and InstSimplify can use computeKnownBits to 33*9880d681SAndroid Build Coastguard Worker; realize that: 34*9880d681SAndroid Build Coastguard Worker; ((2072 >> (L == 0)) >> 7) & 1 35*9880d681SAndroid Build Coastguard Worker; is always zero. 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @main 38*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V1:[0-9]+]] = load i32*, i32** @b, align 8 39*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V2:[0-9]+]] = load i32, i32* %[[V1]], align 4 40*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[V2]] 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 44*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 45*9880d681SAndroid Build Coastguard Worker 46