179 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 | 
						|
; RUN: opt -instcombine -S %s | FileCheck %s
 | 
						|
 | 
						|
define i32 @reassoc_add_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @reassoc_add_nuw(
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i32 [[X:%.*]], 68
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %add0 = add nuw i32 %x, 4
 | 
						|
  %add1 = add nuw i32 %add0, 64
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
; This does the wrong thing because the sub is turned into an add of a
 | 
						|
; negative constant first which drops the nuw.
 | 
						|
define i32 @reassoc_sub_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @reassoc_sub_nuw(
 | 
						|
; CHECK-NEXT:    [[SUB1:%.*]] = add i32 [[X:%.*]], -68
 | 
						|
; CHECK-NEXT:    ret i32 [[SUB1]]
 | 
						|
;
 | 
						|
  %sub0 = sub nuw i32 %x, 4
 | 
						|
  %sub1 = sub nuw i32 %sub0, 64
 | 
						|
  ret i32 %sub1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @reassoc_mul_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @reassoc_mul_nuw(
 | 
						|
; CHECK-NEXT:    [[MUL1:%.*]] = mul nuw i32 [[X:%.*]], 260
 | 
						|
; CHECK-NEXT:    ret i32 [[MUL1]]
 | 
						|
;
 | 
						|
  %mul0 = mul nuw i32 %x, 4
 | 
						|
  %mul1 = mul nuw i32 %mul0, 65
 | 
						|
  ret i32 %mul1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @no_reassoc_add_nuw_none(i32 %x) {
 | 
						|
; CHECK-LABEL: @no_reassoc_add_nuw_none(
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X:%.*]], 68
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %add0 = add i32 %x, 4
 | 
						|
  %add1 = add nuw i32 %add0, 64
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @no_reassoc_add_none_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @no_reassoc_add_none_nuw(
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X:%.*]], 68
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %add0 = add nuw i32 %x, 4
 | 
						|
  %add1 = add i32 %add0, 64
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @reassoc_x2_add_nuw(i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @reassoc_x2_add_nuw(
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i32 [[X:%.*]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i32 [[ADD1]], 12
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD2]]
 | 
						|
;
 | 
						|
  %add0 = add nuw i32 %x, 4
 | 
						|
  %add1 = add nuw i32 %y, 8
 | 
						|
  %add2 = add nuw i32 %add0, %add1
 | 
						|
  ret i32 %add2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @reassoc_x2_mul_nuw(i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @reassoc_x2_mul_nuw(
 | 
						|
; CHECK-NEXT:    [[MUL1:%.*]] = mul i32 [[X:%.*]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    [[MUL2:%.*]] = mul nuw i32 [[MUL1]], 45
 | 
						|
; CHECK-NEXT:    ret i32 [[MUL2]]
 | 
						|
;
 | 
						|
  %mul0 = mul nuw i32 %x, 5
 | 
						|
  %mul1 = mul nuw i32 %y, 9
 | 
						|
  %mul2 = mul nuw i32 %mul0, %mul1
 | 
						|
  ret i32 %mul2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @reassoc_x2_sub_nuw(i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @reassoc_x2_sub_nuw(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = sub i32 [[X:%.*]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    [[SUB2:%.*]] = add i32 [[TMP1]], 4
 | 
						|
; CHECK-NEXT:    ret i32 [[SUB2]]
 | 
						|
;
 | 
						|
  %sub0 = sub nuw i32 %x, 4
 | 
						|
  %sub1 = sub nuw i32 %y, 8
 | 
						|
  %sub2 = sub nuw i32 %sub0, %sub1
 | 
						|
  ret i32 %sub2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw(
 | 
						|
; CHECK-NEXT:    [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 2
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD2]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, 3
 | 
						|
  %add2 = add nuw i32 %mul1, %x
 | 
						|
  ret i32 %add2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul_nuw_int_max(i32 %x) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_int_max(
 | 
						|
; CHECK-NEXT:    [[ADD2:%.*]] = shl nuw i32 [[X:%.*]], 31
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD2]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, 2147483647
 | 
						|
  %add2 = add nuw i32 %mul1, %x
 | 
						|
  ret i32 %add2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_mul_nuw(i32 %x) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_mul_nuw(
 | 
						|
; CHECK-NEXT:    [[ADD2:%.*]] = shl i32 [[X:%.*]], 2
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD2]]
 | 
						|
;
 | 
						|
  %mul1 = mul i32 %x, 3
 | 
						|
  %add2 = add nuw i32 %mul1, %x
 | 
						|
  ret i32 %add2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul(i32 %x) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul(
 | 
						|
; CHECK-NEXT:    [[ADD2:%.*]] = shl i32 [[X:%.*]], 2
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD2]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, 3
 | 
						|
  %add2 = add i32 %mul1, %x
 | 
						|
  ret i32 %add2
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul_nuw_mul_nuw_var(i32 %x, i32 %y, i32 %z) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_mul_nuw_var(
 | 
						|
; CHECK-NEXT:    [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = mul nuw i32 [[MUL21]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, %y
 | 
						|
  %mul2 = mul nuw i32 %x, %z
 | 
						|
  %add1 = add nuw i32 %mul1, %mul2
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul_mul_nuw_var(i32 %x, i32 %y, i32 %z) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul_mul_nuw_var(
 | 
						|
; CHECK-NEXT:    [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = mul i32 [[MUL21]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %mul1 = mul i32 %x, %y
 | 
						|
  %mul2 = mul nuw i32 %x, %z
 | 
						|
  %add1 = add nuw i32 %mul1, %mul2
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_nuw_mul_nuw_mul_var(i32 %x, i32 %y, i32 %z) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_nuw_mul_nuw_mul_var(
 | 
						|
; CHECK-NEXT:    [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = mul i32 [[MUL21]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, %y
 | 
						|
  %mul2 = mul i32 %x, %z
 | 
						|
  %add1 = add nuw i32 %mul1, %mul2
 | 
						|
  ret i32 %add1
 | 
						|
}
 | 
						|
 | 
						|
define i32 @tryFactorization_add_mul_nuw_mul_var(i32 %x, i32 %y, i32 %z) {
 | 
						|
; CHECK-LABEL: @tryFactorization_add_mul_nuw_mul_var(
 | 
						|
; CHECK-NEXT:    [[MUL21:%.*]] = add i32 [[Y:%.*]], [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[ADD1:%.*]] = mul i32 [[MUL21]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    ret i32 [[ADD1]]
 | 
						|
;
 | 
						|
  %mul1 = mul nuw i32 %x, %y
 | 
						|
  %mul2 = mul nuw i32 %x, %z
 | 
						|
  %add1 = add i32 %mul1, %mul2
 | 
						|
  ret i32 %add1
 | 
						|
}
 |