1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Check that code corresponding to the following C function is 4*9880d681SAndroid Build Coastguard Worker; simplified into a single ASR operation: 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker; int test_asr(int a, int b) { 7*9880d681SAndroid Build Coastguard Worker; return a < 0 ? -(-a - 1 >> b) - 1 : a >> b; 8*9880d681SAndroid Build Coastguard Worker; } 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Workerdefine i32 @test_asr(i32 %a, i32 %b) { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %c = icmp slt i32 %a, 0 13*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb2, label %bb3 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerbb2: 16*9880d681SAndroid Build Coastguard Worker %t1 = sub i32 0, %a 17*9880d681SAndroid Build Coastguard Worker %not = sub i32 %t1, 1 18*9880d681SAndroid Build Coastguard Worker %d = ashr i32 %not, %b 19*9880d681SAndroid Build Coastguard Worker %t2 = sub i32 0, %d 20*9880d681SAndroid Build Coastguard Worker %not2 = sub i32 %t2, 1 21*9880d681SAndroid Build Coastguard Worker br label %bb4 22*9880d681SAndroid Build Coastguard Workerbb3: 23*9880d681SAndroid Build Coastguard Worker %e = ashr i32 %a, %b 24*9880d681SAndroid Build Coastguard Worker br label %bb4 25*9880d681SAndroid Build Coastguard Workerbb4: 26*9880d681SAndroid Build Coastguard Worker %f = phi i32 [ %not2, %bb2 ], [ %e, %bb3 ] 27*9880d681SAndroid Build Coastguard Worker ret i32 %f 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_asr( 29*9880d681SAndroid Build Coastguard Worker; CHECK: bb4: 30*9880d681SAndroid Build Coastguard Worker; CHECK: %f = ashr i32 %a, %b 31*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %f 32*9880d681SAndroid Build Coastguard Worker} 33