1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @k() convergent 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @f() 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.read_register.i64(metadata) nounwind 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @extern() { 9*9880d681SAndroid Build Coastguard Worker ; Convergent attr shouldn't be removed here; k is convergent. 10*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @k() [[CONVERGENT_ATTR:#[0-9]+]] 11*9880d681SAndroid Build Coastguard Worker %a = call i32 @k() convergent 12*9880d681SAndroid Build Coastguard Worker ret i32 %a 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @extern_no_attr() { 16*9880d681SAndroid Build Coastguard Worker ; Convergent attr shouldn't be added here, even though k is convergent. 17*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @k(){{$}} 18*9880d681SAndroid Build Coastguard Worker %a = call i32 @k() 19*9880d681SAndroid Build Coastguard Worker ret i32 %a 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @no_extern() { 23*9880d681SAndroid Build Coastguard Worker ; Convergent should be removed here, as the target is convergent. 24*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @f(){{$}} 25*9880d681SAndroid Build Coastguard Worker %a = call i32 @f() convergent 26*9880d681SAndroid Build Coastguard Worker ret i32 %a 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @indirect_call(i32 ()* %f) { 30*9880d681SAndroid Build Coastguard Worker ; CHECK call i32 %f() [[CONVERGENT_ATTR]] 31*9880d681SAndroid Build Coastguard Worker %a = call i32 %f() convergent 32*9880d681SAndroid Build Coastguard Worker ret i32 %a 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; do not remove from convergent intrinsic call sites 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @convergent_intrinsic_call( 37*9880d681SAndroid Build Coastguard Worker; CHECK: call i64 @llvm.read_register.i64(metadata !0) [[CONVERGENT_ATTR]] 38*9880d681SAndroid Build Coastguard Workerdefine i64 @convergent_intrinsic_call() { 39*9880d681SAndroid Build Coastguard Worker %val = call i64 @llvm.read_register.i64(metadata !0) convergent 40*9880d681SAndroid Build Coastguard Worker ret i64 %val 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; CHECK: [[CONVERGENT_ATTR]] = { convergent } 44*9880d681SAndroid Build Coastguard Worker!0 = !{!"foo"} 45