mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
c419f36f80
Working on top of D69252, this adds canonicalisation patterns for ssub.with.overflow to ssub.sats. Differential Revision: https://reviews.llvm.org/D69753
711 lines
26 KiB
LLVM
711 lines
26 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -instcombine < %s | FileCheck %s
|
|
|
|
define i32 @uadd(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @uadd(
|
|
; CHECK-NEXT: [[S:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i32 [[S]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%s = select i1 %o, i32 -1, i32 %a
|
|
ret i32 %s
|
|
}
|
|
|
|
define i32 @usub(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @usub(
|
|
; CHECK-NEXT: [[S:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i32 [[S]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%s = select i1 %o, i32 0, i32 %a
|
|
ret i32 %s
|
|
}
|
|
|
|
|
|
define i8 @sadd_x_lt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_lt_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_lt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_lt_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_le_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_le_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_le_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_le_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_gt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_gt_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_gt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_gt_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_ge_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_ge_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_x_ge_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_x_ge_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
|
|
define i8 @sadd_y_lt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_lt_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_lt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_lt_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_le_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_le_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_le_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_le_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_gt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_gt_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_gt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_gt_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_ge_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_ge_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @sadd_y_ge_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @sadd_y_ge_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
|
|
|
|
|
|
define i8 @ssub_x_lt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_lt_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_lt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_lt_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_le_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_le_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_le_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_le_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_lt2_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_lt2_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], -1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, -1
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_lt2_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_lt2_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %x, -1
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_gt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_gt_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_gt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_gt_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_ge_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_ge_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %x, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_ge_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_ge_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %x, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_gt2_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_gt2_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, -2
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_x_gt2_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_x_gt2_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -2
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %x, -2
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
|
|
define i8 @ssub_y_lt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_lt_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_lt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_lt_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp slt i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_le_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_le_min(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_le_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_le_max(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sle i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_gt_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_gt_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_gt_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_gt_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sgt i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_ge_min(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_ge_min(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %y, 0
|
|
%s = select i1 %c, i8 127, i8 -128
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
define i8 @ssub_y_ge_max(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: @ssub_y_ge_max(
|
|
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i8 [[R]]
|
|
;
|
|
%ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
|
|
%o = extractvalue { i8, i1 } %ao, 1
|
|
%a = extractvalue { i8, i1 } %ao, 0
|
|
%c = icmp sge i8 %y, 0
|
|
%s = select i1 %c, i8 -128, i8 127
|
|
%r = select i1 %o, i8 %s, i8 %a
|
|
ret i8 %r
|
|
}
|
|
|
|
|
|
define i32 @sadd_i32(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @sadd_i32(
|
|
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%c = icmp slt i32 %x, 0
|
|
%s = select i1 %c, i32 -2147483648, i32 2147483647
|
|
%r = select i1 %o, i32 %s, i32 %a
|
|
ret i32 %r
|
|
}
|
|
|
|
define i32 @ssub_i32(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @ssub_i32(
|
|
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%c = icmp slt i32 %x, 0
|
|
%s = select i1 %c, i32 -2147483648, i32 2147483647
|
|
%r = select i1 %o, i32 %s, i32 %a
|
|
ret i32 %r
|
|
}
|
|
|
|
define i32 @sadd_bounds(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @sadd_bounds(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%c = icmp slt i32 %x, 0
|
|
%s = select i1 %c, i32 -128, i32 127
|
|
%r = select i1 %o, i32 %s, i32 %a
|
|
ret i32 %r
|
|
}
|
|
|
|
define i32 @ssub_bounds(i32 %x, i32 %y) {
|
|
; CHECK-LABEL: @ssub_bounds(
|
|
; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
|
; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1
|
|
; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0
|
|
; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0
|
|
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127
|
|
; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
%ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)
|
|
%o = extractvalue { i32, i1 } %ao, 1
|
|
%a = extractvalue { i32, i1 } %ao, 0
|
|
%c = icmp slt i32 %x, 0
|
|
%s = select i1 %c, i32 -128, i32 127
|
|
%r = select i1 %o, i32 %s, i32 %a
|
|
ret i32 %r
|
|
}
|
|
|
|
declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %0, i32 %1)
|
|
declare { i32, i1 } @llvm.usub.with.overflow.i32(i32 %0, i32 %1)
|
|
declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %0, i8 %1)
|
|
declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %0, i8 %1)
|
|
declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %0, i32 %1)
|
|
declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %0, i32 %1)
|