Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/InstCombine/xor.ll
Show First 20 Lines • Show All 988 Lines • ▼ Show 20 Lines | |||||
%r = xor i8 %a, -2 | %r = xor i8 %a, -2 | ||||
ret i8 %r | ret i8 %r | ||||
} | } | ||||
; (~A & B) ^ A --> (A | B) | ; (~A & B) ^ A --> (A | B) | ||||
; The division ops are here to thwart complexity-based canonicalization: all ops are binops. | ; The division ops are here to thwart complexity-based canonicalization: all ops are binops. | ||||
define i32 @test52(i32 %p1, i32 %p2) { | define i32 @test52(i32 %p1, i32 %p2) { | ||||
; CHECK-LABEL: @test52( | ; CHECK-LABEL: @test52( | ||||
xbolva00: Any vector test? | |||||
; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ||||
; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ||||
; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1 | ; CHECK-NEXT: [[Z:%.*]] = or i32 [[A]], [[B]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]] | |||||
; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[A]] | |||||
; CHECK-NEXT: ret i32 [[Z]] | ; CHECK-NEXT: ret i32 [[Z]] | ||||
; | ; | ||||
%a = udiv i32 42, %p1 | %a = udiv i32 42, %p1 | ||||
%b = udiv i32 42, %p2 | %b = udiv i32 42, %p2 | ||||
%o = xor i32 %a, -1 | %o = xor i32 %a, -1 | ||||
%r = and i32 %o, %b | %r = and i32 %o, %b | ||||
%z = xor i32 %r, %a | %z = xor i32 %r, %a | ||||
ret i32 %z | ret i32 %z | ||||
} | } | ||||
; (~B & A) ^ B --> (A | B) | ; vector test for pattern (~A & B) ^ A --> (A | B) | ||||
This test doesn't exercise anything differently than "test52"; it just reversed the value names. spatel: This test doesn't exercise anything differently than "test52"; it just reversed the value names. | |||||
; The division ops are here to thwart complexity-based canonicalization: all ops are binops. | |||||
define i32 @test53(i32 %p1, i32 %p2) { | define <4 x i32> @test53(<4 x i32> %p1, <4 x i32> %p2) { | ||||
; CHECK-LABEL: @test53( | ; CHECK-LABEL: @test53( | ||||
; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ; CHECK-NEXT: [[A:%.*]] = udiv <4 x i32> <i32 42, i32 42, i32 42, i32 42>, [[P1:%.*]] | ||||
; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ; CHECK-NEXT: [[B:%.*]] = udiv <4 x i32> <i32 42, i32 42, i32 42, i32 42>, [[P2:%.*]] | ||||
; CHECK-NEXT: [[O:%.*]] = xor i32 [[B]], -1 | ; CHECK-NEXT: [[Z:%.*]] = or <4 x i32> [[A]], [[B]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[A]], [[O]] | ; CHECK-NEXT: ret <4 x i32> [[Z]] | ||||
; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[B]] | |||||
; CHECK-NEXT: ret i32 [[Z]] | |||||
; | ; | ||||
%a = udiv i32 42, %p1 | %a = udiv <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %p1 | ||||
%b = udiv i32 42, %p2 | %b = udiv <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %p2 | ||||
%o = xor i32 %b, -1 | %o = xor <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1> | ||||
%r = and i32 %o, %a | %r = and <4 x i32> %o, %b | ||||
%z = xor i32 %r, %b | %z = xor <4 x i32> %r, %a | ||||
ret i32 %z | ret <4 x i32> %z | ||||
} | } | ||||
define i32 @test54(i32 %p1, i32 %p2) { | define i32 @test54(i32 %p1, i32 %p2) { | ||||
; CHECK-LABEL: @test54( | ; CHECK-LABEL: @test54( | ||||
; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ||||
; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ||||
; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1 | ; CHECK-NEXT: [[Z:%.*]] = or i32 [[A]], [[B]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]] | |||||
; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[A]] | |||||
; CHECK-NEXT: ret i32 [[Z]] | ; CHECK-NEXT: ret i32 [[Z]] | ||||
; | ; | ||||
%a = udiv i32 42, %p1 | %a = udiv i32 42, %p1 | ||||
%b = udiv i32 42, %p2 | %b = udiv i32 42, %p2 | ||||
%o = xor i32 %a, -1 | %o = xor i32 %a, -1 | ||||
%r = and i32 %b, %o | %r = and i32 %b, %o | ||||
%z = xor i32 %r, %a | %z = xor i32 %r, %a | ||||
ret i32 %z | ret i32 %z | ||||
} | } | ||||
define i32 @test55(i32 %p1, i32 %p2) { | define i32 @test55(i32 %p1, i32 %p2) { | ||||
; CHECK-LABEL: @test55( | ; CHECK-LABEL: @test55( | ||||
; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]] | ||||
; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]] | ||||
; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1 | ; CHECK-NEXT: [[Z:%.*]] = or i32 [[A]], [[B]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]] | |||||
spatelAuthorUnsubmitted Not Done ReplyInline ActionsThe canonicalized form of the 'and' is different than how it was written. This test is not checking the pattern that you intended it to check. spatel: The canonicalized form of the 'and' is different than how it was written. This test is not… | |||||
; CHECK-NEXT: [[Z:%.*]] = xor i32 [[A]], [[R]] | |||||
; CHECK-NEXT: ret i32 [[Z]] | ; CHECK-NEXT: ret i32 [[Z]] | ||||
; | ; | ||||
%a = udiv i32 42, %p1 | %a = udiv i32 42, %p1 | ||||
%b = udiv i32 42, %p2 | %b = udiv i32 42, %p2 | ||||
%o = xor i32 %a, -1 | %o = xor i32 %a, -1 | ||||
%r = and i32 %o, %b | %r = and i32 %o, %b | ||||
%z = xor i32 %a, %r | %z = xor i32 %a, %r | ||||
ret i32 %z | ret i32 %z | ||||
} | } | ||||
Context not available. |
Any vector test?