1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux -mcpu=generic | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @uadd_overflow(i32 %a, i32 %b) #0 { 4*9880d681SAndroid Build Coastguard Worker %sadd = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b) 5*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i32, i1 } %sadd, 1 6*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 7*9880d681SAndroid Build Coastguard Worker ret i32 %2 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: uadd_overflow: 10*9880d681SAndroid Build Coastguard Worker ; CHECK: add r[[R2:[0-9]+]], r[[R0:[0-9]+]], r[[R1:[0-9]+]] 11*9880d681SAndroid Build Coastguard Worker ; CHECK: mov r[[R1]], #1 12*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp r[[R2]], r[[R0]] 13*9880d681SAndroid Build Coastguard Worker ; CHECK: movhs r[[R1]], #0 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i32 @sadd_overflow(i32 %a, i32 %b) #0 { 18*9880d681SAndroid Build Coastguard Worker %sadd = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) 19*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i32, i1 } %sadd, 1 20*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 21*9880d681SAndroid Build Coastguard Worker ret i32 %2 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sadd_overflow: 24*9880d681SAndroid Build Coastguard Worker ; CHECK: add r[[R2:[0-9]+]], r[[R0:[0-9]+]], r[[R1:[0-9]+]] 25*9880d681SAndroid Build Coastguard Worker ; CHECK: mov r[[R1]], #1 26*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp r[[R2]], r[[R0]] 27*9880d681SAndroid Build Coastguard Worker ; CHECK: movvc r[[R1]], #0 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @usub_overflow(i32 %a, i32 %b) #0 { 31*9880d681SAndroid Build Coastguard Worker %sadd = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b) 32*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i32, i1 } %sadd, 1 33*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 34*9880d681SAndroid Build Coastguard Worker ret i32 %2 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: usub_overflow: 37*9880d681SAndroid Build Coastguard Worker ; CHECK: mov r[[R2]], #1 38*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp r[[R0]], r[[R1]] 39*9880d681SAndroid Build Coastguard Worker ; CHECK: movhs r[[R2]], #0 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i32 @ssub_overflow(i32 %a, i32 %b) #0 { 43*9880d681SAndroid Build Coastguard Worker %sadd = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a, i32 %b) 44*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i32, i1 } %sadd, 1 45*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 46*9880d681SAndroid Build Coastguard Worker ret i32 %2 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: ssub_overflow: 49*9880d681SAndroid Build Coastguard Worker ; CHECK: mov r[[R2]], #1 50*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp r[[R0]], r[[R1]] 51*9880d681SAndroid Build Coastguard Worker ; CHECK: movvc r[[R2]], #0 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) #1 55*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) #2 56*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) #3 57*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) #4 58