667 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			667 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 | |
| ; RUN: opt < %s -instsimplify -S | FileCheck %s
 | |
| 
 | |
| declare i3 @llvm.uadd.sat.i3(i3, i3)
 | |
| declare i8 @llvm.uadd.sat.i8(i8, i8)
 | |
| declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
 | |
| declare <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9>, <2 x i9>)
 | |
| 
 | |
| declare i8 @llvm.sadd.sat.i8(i8, i8)
 | |
| declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
 | |
| 
 | |
| declare i8 @llvm.usub.sat.i8(i8, i8)
 | |
| declare i8 @llvm.ssub.sat.i8(i8, i8)
 | |
| declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
 | |
| declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
 | |
| 
 | |
| define i8 @uadd_scalar_0(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_0(
 | |
| ; CHECK-NEXT:    ret i8 [[A:%.*]]
 | |
| ;
 | |
|   %x1 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 0)
 | |
|   ret i8 %x1
 | |
| }
 | |
| 
 | |
| define <2 x i8> @uadd_vector_0(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_0(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %x1v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer)
 | |
|   ret <2 x i8> %x1v
 | |
| }
 | |
| 
 | |
| define i3 @uadd_scalar_0_commute(i3 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_0_commute(
 | |
| ; CHECK-NEXT:    ret i3 [[A:%.*]]
 | |
| ;
 | |
|   %x2 = call i3 @llvm.uadd.sat.i3(i3 0, i3 %a)
 | |
|   ret i3 %x2
 | |
| }
 | |
| 
 | |
| define <2 x i8> @uadd_vector_0_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_0_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %x2v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 0, i8 undef>, <2 x i8> %a)
 | |
|   ret <2 x i8> %x2v
 | |
| }
 | |
| 
 | |
| define i8 @uadd_scalar_maxval(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_maxval(
 | |
| ; CHECK-NEXT:    ret i8 -1
 | |
| ;
 | |
|   %x3 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 255)
 | |
|   ret i8 %x3
 | |
| }
 | |
| 
 | |
| define <2 x i9> @uadd_vector_maxval(<2 x i9> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_maxval(
 | |
| ; CHECK-NEXT:    ret <2 x i9> <i9 -1, i9 -1>
 | |
| ;
 | |
|   %x3v = call <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9> %a, <2 x i9> <i9 511, i9 511>)
 | |
|   ret <2 x i9> %x3v
 | |
| }
 | |
| 
 | |
| define i3 @uadd_scalar_maxval_commute(i3 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_maxval_commute(
 | |
| ; CHECK-NEXT:    ret i3 -1
 | |
| ;
 | |
|   %x4 = call i3 @llvm.uadd.sat.i3(i3 7, i3 %a)
 | |
|   ret i3 %x4
 | |
| }
 | |
| 
 | |
| define <2 x i8> @uadd_vector_maxval_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_maxval_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
 | |
| ;
 | |
|   %x4v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 255, i8 255>, <2 x i8> %a)
 | |
|   ret <2 x i8> %x4v
 | |
| }
 | |
| 
 | |
| define i8 @uadd_scalar_undef(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_undef(
 | |
| ; CHECK-NEXT:    ret i8 -1
 | |
| ;
 | |
|   %x5 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 undef)
 | |
|   ret i8 %x5
 | |
| }
 | |
| 
 | |
| define <2 x i8> @uadd_vector_undef(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_undef(
 | |
| ; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
 | |
| ;
 | |
|   %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>)
 | |
|   ret <2 x i8> %x5v
 | |
| }
 | |
| 
 | |
| define i8 @uadd_scalar_undef_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_scalar_undef_commute(
 | |
| ; CHECK-NEXT:    ret i8 -1
 | |
| ;
 | |
|   %x6 = call i8 @llvm.uadd.sat.i8(i8 undef, i8 %a)
 | |
|   ret i8 %x6
 | |
| }
 | |
| 
 | |
| define <2 x i8> @uadd_vector_undef_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @uadd_vector_undef_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
 | |
| ;
 | |
|   %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a)
 | |
|   ret <2 x i8> %x5v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_0(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_0(
 | |
| ; CHECK-NEXT:    ret i8 [[A:%.*]]
 | |
| ;
 | |
|   %y1 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 0)
 | |
|   ret i8 %y1
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_0(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_0(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %y1v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 0>)
 | |
|   ret <2 x i8> %y1v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_0_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_0_commute(
 | |
| ; CHECK-NEXT:    ret i8 [[A:%.*]]
 | |
| ;
 | |
|   %y2 = call i8 @llvm.sadd.sat.i8(i8 0, i8 %a)
 | |
|   ret i8 %y2
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_0_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_0_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %y2v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> %a)
 | |
|   ret <2 x i8> %y2v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_maxval(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_maxval(
 | |
| ; CHECK-NEXT:    [[Y3:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 127)
 | |
| ; CHECK-NEXT:    ret i8 [[Y3]]
 | |
| ;
 | |
|   %y3 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 127)
 | |
|   ret i8 %y3
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_maxval(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_maxval(
 | |
| ; CHECK-NEXT:    [[Y3V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>)
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[Y3V]]
 | |
| ;
 | |
|   %y3v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>)
 | |
|   ret <2 x i8> %y3v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_maxval_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_maxval_commute(
 | |
| ; CHECK-NEXT:    [[Y4:%.*]] = call i8 @llvm.sadd.sat.i8(i8 127, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    ret i8 [[Y4]]
 | |
| ;
 | |
|   %y4 = call i8 @llvm.sadd.sat.i8(i8 127, i8 %a)
 | |
|   ret i8 %y4
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_maxval_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_maxval_commute(
 | |
| ; CHECK-NEXT:    [[Y4V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> [[A:%.*]])
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[Y4V]]
 | |
| ;
 | |
|   %y4v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> %a)
 | |
|   ret <2 x i8> %y4v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_undef(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_undef(
 | |
| ; CHECK-NEXT:    ret i8 -1
 | |
| ;
 | |
|   %y5 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 undef)
 | |
|   ret i8 %y5
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_undef(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_undef(
 | |
| ; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
 | |
| ;
 | |
|   %y5v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> undef)
 | |
|   ret <2 x i8> %y5v
 | |
| }
 | |
| 
 | |
| define i8 @sadd_scalar_undef_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_scalar_undef_commute(
 | |
| ; CHECK-NEXT:    ret i8 -1
 | |
| ;
 | |
|   %y6 = call i8 @llvm.sadd.sat.i8(i8 undef, i8 %a)
 | |
|   ret i8 %y6
 | |
| }
 | |
| 
 | |
| define <2 x i8> @sadd_vector_undef_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @sadd_vector_undef_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> <i8 -1, i8 -1>
 | |
| ;
 | |
|   %y6v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a)
 | |
|   ret <2 x i8> %y6v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_0(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_0(
 | |
| ; CHECK-NEXT:    ret i8 [[A:%.*]]
 | |
| ;
 | |
|   %x1 = call i8 @llvm.usub.sat.i8(i8 %a, i8 0)
 | |
|   ret i8 %x1
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_0(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_0(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %x1v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>)
 | |
|   ret <2 x i8> %x1v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_0_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_0_commute(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %x2 = call i8 @llvm.usub.sat.i8(i8 0, i8 %a)
 | |
|   ret i8 %x2
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_0_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_0_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %x2v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a)
 | |
|   ret <2 x i8> %x2v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_maxval(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_maxval(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %x3 = call i8 @llvm.usub.sat.i8(i8 %a, i8 255)
 | |
|   ret i8 %x3
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_maxval(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_maxval(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %x3v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 255, i8 255>)
 | |
|   ret <2 x i8> %x3v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_undef(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_undef(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %x4 = call i8 @llvm.usub.sat.i8(i8 %a, i8 undef)
 | |
|   ret i8 %x4
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_undef(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_undef(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %x4v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>)
 | |
|   ret <2 x i8> %x4v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_undef_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_undef_commute(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %x5 = call i8 @llvm.usub.sat.i8(i8 undef, i8 %a)
 | |
|   ret i8 %x5
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_undef_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_undef_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %x5v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a)
 | |
|   ret <2 x i8> %x5v
 | |
| }
 | |
| 
 | |
| define i8 @usub_scalar_same(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_scalar_same(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %x6 = call i8 @llvm.usub.sat.i8(i8 %a, i8 %a)
 | |
|   ret i8 %x6
 | |
| }
 | |
| 
 | |
| define <2 x i8> @usub_vector_same(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @usub_vector_same(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %x6v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> %a)
 | |
|   ret <2 x i8> %x6v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_0(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_0(
 | |
| ; CHECK-NEXT:    ret i8 [[A:%.*]]
 | |
| ;
 | |
|   %y1 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 0)
 | |
|   ret i8 %y1
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_0(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_0(
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
 | |
| ;
 | |
|   %y1v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>)
 | |
|   ret <2 x i8> %y1v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_0_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_0_commute(
 | |
| ; CHECK-NEXT:    [[Y2:%.*]] = call i8 @llvm.ssub.sat.i8(i8 0, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    ret i8 [[Y2]]
 | |
| ;
 | |
|   %y2 = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a)
 | |
|   ret i8 %y2
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_0_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_0_commute(
 | |
| ; CHECK-NEXT:    [[Y2V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> [[A:%.*]])
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[Y2V]]
 | |
| ;
 | |
|   %y2v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a)
 | |
|   ret <2 x i8> %y2v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_maxval(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_maxval(
 | |
| ; CHECK-NEXT:    [[Y3:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 127)
 | |
| ; CHECK-NEXT:    ret i8 [[Y3]]
 | |
| ;
 | |
|   %y3 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 127)
 | |
|   ret i8 %y3
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_maxval(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_maxval(
 | |
| ; CHECK-NEXT:    [[Y3V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>)
 | |
| ; CHECK-NEXT:    ret <2 x i8> [[Y3V]]
 | |
| ;
 | |
|   %y3v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>)
 | |
|   ret <2 x i8> %y3v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_undef(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_undef(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %y4 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 undef)
 | |
|   ret i8 %y4
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_undef(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_undef(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %y4v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> undef)
 | |
|   ret <2 x i8> %y4v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_undef_commute(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_undef_commute(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %y5 = call i8 @llvm.ssub.sat.i8(i8 undef, i8 %a)
 | |
|   ret i8 %y5
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_undef_commute(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_undef_commute(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %y5v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a)
 | |
|   ret <2 x i8> %y5v
 | |
| }
 | |
| 
 | |
| define i8 @ssub_scalar_same(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_scalar_same(
 | |
| ; CHECK-NEXT:    ret i8 0
 | |
| ;
 | |
|   %y6 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 %a)
 | |
|   ret i8 %y6
 | |
| }
 | |
| 
 | |
| define <2 x i8> @ssub_vector_same(<2 x i8> %a) {
 | |
| ; CHECK-LABEL: @ssub_vector_same(
 | |
| ; CHECK-NEXT:    ret <2 x i8> zeroinitializer
 | |
| ;
 | |
|   %y6v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> %a)
 | |
|   ret <2 x i8> %y6v
 | |
| }
 | |
| 
 | |
| define i1 @uadd_icmp_op0_known(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_icmp_op0_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp uge i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @uadd_icmp_op0_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_icmp_op0_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp ugt i8 [[B]], 10
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp ugt i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @uadd_icmp_op1_known(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_icmp_op1_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp uge i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @uadd_icmp_op1_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @uadd_icmp_op1_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A:%.*]], i8 10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp ugt i8 [[B]], 10
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp ugt i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op0_pos_known(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op0_pos_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp sge i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op0_pos_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op0_pos_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp sgt i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op0_neg_known(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op0_neg_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a)
 | |
|   %c = icmp sle i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op0_neg_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op0_neg_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 -10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a)
 | |
|   %c = icmp slt i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op1_pos_known(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op1_pos_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp sge i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op1_pos_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op1_pos_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp sgt i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op1_neg_known(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op1_neg_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10)
 | |
|   %c = icmp sle i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @sadd_icmp_op1_neg_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @sadd_icmp_op1_neg_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 -10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10)
 | |
|   %c = icmp slt i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @usub_icmp_op0_known(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_icmp_op0_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp ule i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @usub_icmp_op0_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_icmp_op0_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[B]], 10
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp ult i8 %b, 10
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @usub_icmp_op1_known(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_icmp_op1_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp ule i8 %b, 245
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @usub_icmp_op1_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @usub_icmp_op1_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A:%.*]], i8 10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[B]], -11
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp ult i8 %b, 245
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op0_pos_known(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op0_pos_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp sge i8 %b, -117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op0_pos_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op0_pos_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -117
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a)
 | |
|   %c = icmp sgt i8 %b, -117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op0_neg_known(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op0_neg_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a)
 | |
|   %c = icmp sle i8 %b, 118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op0_neg_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op0_neg_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 -10, i8 [[A:%.*]])
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 118
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a)
 | |
|   %c = icmp slt i8 %b, 118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| ; Peculiar case: ssub.sat(0, x) is never signed min.
 | |
| define i1 @ssub_icmp_op0_zero(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op0_zero(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a)
 | |
|   %c = icmp ne i8 %b, -128
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op1_pos_known(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op1_pos_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp sle i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op1_pos_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op1_pos_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 [[B]], 117
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10)
 | |
|   %c = icmp slt i8 %b, 117
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op1_neg_known(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op1_neg_known(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10)
 | |
|   %c = icmp sge i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op1_neg_unknown(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op1_neg_unknown(
 | |
| ; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 -10)
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp sgt i8 [[B]], -118
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10)
 | |
|   %c = icmp sgt i8 %b, -118
 | |
|   ret i1 %c
 | |
| }
 | |
| 
 | |
| define i1 @ssub_icmp_op1_smin(i8 %a) {
 | |
| ; CHECK-LABEL: @ssub_icmp_op1_smin(
 | |
| ; CHECK-NEXT:    ret i1 true
 | |
| ;
 | |
|   %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -128)
 | |
|   %c = icmp sge i8 %b, 0
 | |
|   ret i1 %c
 | |
| }
 |