Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/InstSimplify/and-or-icmp-nullptr.ll
Show All 32 Lines | ; | ||||
%cmp = icmp ugt ptr %x, %y | %cmp = icmp ugt ptr %x, %y | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_and_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_and_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_and_min_commute_inner( | ; CHECK-LABEL: @ugt_and_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: ret i1 false | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | |||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ugt ptr %x, %y | %cmp = icmp ugt ptr %x, %y | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_and_min(ptr %x, ptr %y) { | define i1 @ugt_swap_and_min(ptr %x, ptr %y) { | ||||
Show All 13 Lines | ; | ||||
%cmp = icmp ult ptr %y, %x | %cmp = icmp ult ptr %y, %x | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_and_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_swap_and_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_swap_and_min_commute_inner( | ; CHECK-LABEL: @ugt_swap_and_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: ret i1 false | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | |||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ult ptr %y, %x | %cmp = icmp ult ptr %y, %x | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 34 Lines | ; | ||||
%cmp = icmp ule ptr %x, %y | %cmp = icmp ule ptr %x, %y | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_or_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_or_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_or_not_min_commute_inner( | ; CHECK-LABEL: @ule_or_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: ret i1 true | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | |||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ule ptr %x, %y | %cmp = icmp ule ptr %x, %y | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_or_not_min(ptr %x, ptr %y) { | define i1 @ule_swap_or_not_min(ptr %x, ptr %y) { | ||||
Show All 13 Lines | ; | ||||
%cmp = icmp uge ptr %y, %x | %cmp = icmp uge ptr %y, %x | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_or_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_swap_or_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_swap_or_not_min_commute_inner( | ; CHECK-LABEL: @ule_swap_or_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: ret i1 true | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | |||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp uge ptr %y, %x | %cmp = icmp uge ptr %y, %x | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 36 Lines | ; | ||||
%cmp = icmp ule ptr %x, %y | %cmp = icmp ule ptr %x, %y | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_and_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_and_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_and_min_commute_inner( | ; CHECK-LABEL: @ule_and_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMPEQ]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ule ptr %x, %y | %cmp = icmp ule ptr %x, %y | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_and_min(ptr %x, ptr %y) { | define i1 @ule_swap_and_min(ptr %x, ptr %y) { | ||||
Show All 15 Lines | ; | ||||
%cmp = icmp uge ptr %y, %x | %cmp = icmp uge ptr %y, %x | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_and_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_swap_and_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_swap_and_min_commute_inner( | ; CHECK-LABEL: @ule_swap_and_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMPEQ]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp uge ptr %y, %x | %cmp = icmp uge ptr %y, %x | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 37 Lines | ; | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_or_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_or_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_or_min_commute_inner( | ; CHECK-LABEL: @ule_or_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMP]] | ||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ule ptr %x, %y | %cmp = icmp ule ptr %x, %y | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_or_min(ptr %x, ptr %y) { | define i1 @ule_swap_or_min(ptr %x, ptr %y) { | ||||
Show All 16 Lines | ; | ||||
%cmpeq = icmp eq ptr %x, null | %cmpeq = icmp eq ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ule_swap_or_min_commute_inner(ptr %x, ptr %y) { | define i1 @ule_swap_or_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ule_swap_or_min_commute_inner( | ; CHECK-LABEL: @ule_swap_or_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMP]] | ||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp uge ptr %y, %x | %cmp = icmp uge ptr %y, %x | ||||
%cmpeq = icmp eq ptr null, %x | %cmpeq = icmp eq ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 37 Lines | ; | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_and_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_and_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_and_not_min_commute_inner( | ; CHECK-LABEL: @ugt_and_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMP]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ugt ptr %x, %y | %cmp = icmp ugt ptr %x, %y | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_and_not_min(ptr %x, ptr %y) { | define i1 @ugt_swap_and_not_min(ptr %x, ptr %y) { | ||||
Show All 16 Lines | ; | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = and i1 %cmpeq, %cmp | %r = and i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_and_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_swap_and_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_swap_and_not_min_commute_inner( | ; CHECK-LABEL: @ugt_swap_and_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMP]] | ||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ult ptr %y, %x | %cmp = icmp ult ptr %y, %x | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = and i1 %cmp, %cmpeq | %r = and i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 36 Lines | ; | ||||
%cmp = icmp ugt ptr %x, %y | %cmp = icmp ugt ptr %x, %y | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_or_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_or_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_or_not_min_commute_inner( | ; CHECK-LABEL: @ugt_or_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] | ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMPEQ]] | ||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ugt ptr %x, %y | %cmp = icmp ugt ptr %x, %y | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_or_not_min(ptr %x, ptr %y) { | define i1 @ugt_swap_or_not_min(ptr %x, ptr %y) { | ||||
Show All 15 Lines | ; | ||||
%cmp = icmp ult ptr %y, %x | %cmp = icmp ult ptr %y, %x | ||||
%cmpeq = icmp ne ptr %x, null | %cmpeq = icmp ne ptr %x, null | ||||
%r = or i1 %cmpeq, %cmp | %r = or i1 %cmpeq, %cmp | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @ugt_swap_or_not_min_commute_inner(ptr %x, ptr %y) { | define i1 @ugt_swap_or_not_min_commute_inner(ptr %x, ptr %y) { | ||||
; CHECK-LABEL: @ugt_swap_or_not_min_commute_inner( | ; CHECK-LABEL: @ugt_swap_or_not_min_commute_inner( | ||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] | ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X:%.*]] | ||||
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] | ; CHECK-NEXT: ret i1 [[CMPEQ]] | ||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] | |||||
; CHECK-NEXT: ret i1 [[R]] | |||||
; | ; | ||||
%cmp = icmp ult ptr %y, %x | %cmp = icmp ult ptr %y, %x | ||||
%cmpeq = icmp ne ptr null, %x | %cmpeq = icmp ne ptr null, %x | ||||
%r = or i1 %cmp, %cmpeq | %r = or i1 %cmp, %cmpeq | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
; Negative test - signed compare | ; Negative test - signed compare | ||||
Show All 13 Lines |