Index: llvm/test/Transforms/InstSimplify/and-or-icmp-nullptr.ll =================================================================== --- llvm/test/Transforms/InstSimplify/and-or-icmp-nullptr.ll +++ llvm/test/Transforms/InstSimplify/and-or-icmp-nullptr.ll @@ -7,7 +7,7 @@ ; There are 6 basic patterns (or 3 with DeMorganized equivalent) with ; 2 (commute logic op) * -; 2 (swap compare operands) * +; 3 (swap compare and NAND eq operands) * ; variations for a total of 24 tests. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -36,6 +36,19 @@ ret i1 %r } +define i1 @ugt_and_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ugt_and_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] +; 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 + %cmpeq = icmp eq ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ugt_swap_and_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ugt_swap_and_min( ; CHECK-NEXT: ret i1 false @@ -56,6 +69,19 @@ ret i1 %r } +define i1 @ugt_swap_and_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ugt_swap_and_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] +; 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 + %cmpeq = icmp eq ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sgt_and_min(ptr %x, ptr %y) { @@ -97,6 +123,19 @@ ret i1 %r } +define i1 @ule_or_not_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ule_or_not_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] +; 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 + %cmpeq = icmp ne ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ule_swap_or_not_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ule_swap_or_not_min( ; CHECK-NEXT: ret i1 true @@ -117,6 +156,19 @@ ret i1 %r } +define i1 @ule_swap_or_not_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ule_swap_or_not_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] +; 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 + %cmpeq = icmp ne ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sle_or_not_min(ptr %x, ptr %y) { @@ -160,6 +212,19 @@ ret i1 %r } +define i1 @ule_and_min_commute_inner(ptr %x, ptr %y) { +; 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: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ule ptr %x, %y + %cmpeq = icmp eq ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ule_swap_and_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ule_swap_and_min( ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null @@ -182,6 +247,19 @@ ret i1 %r } +define i1 @ule_swap_and_min_commute_inner(ptr %x, ptr %y) { +; 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: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp uge ptr %y, %x + %cmpeq = icmp eq ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sle_and_min(ptr %x, ptr %y) { @@ -225,6 +303,19 @@ ret i1 %r } +define i1 @ule_or_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ule_or_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ule ptr %x, %y + %cmpeq = icmp eq ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ule_swap_or_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ule_swap_or_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] @@ -247,6 +338,19 @@ ret i1 %r } +define i1 @ule_swap_or_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ule_swap_or_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr null, [[X]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp uge ptr %y, %x + %cmpeq = icmp eq ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sle_or_min(ptr %x, ptr %y) { @@ -290,6 +394,19 @@ ret i1 %r } +define i1 @ugt_and_not_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ugt_and_not_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ugt ptr %x, %y + %cmpeq = icmp ne ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ugt_swap_and_not_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ugt_swap_and_not_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] @@ -312,6 +429,19 @@ ret i1 %r } +define i1 @ugt_swap_and_not_min_commute_inner(ptr %x, ptr %y) { +; CHECK-LABEL: @ugt_swap_and_not_min_commute_inner( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr null, [[X]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ult ptr %y, %x + %cmpeq = icmp ne ptr null, %x + %r = and i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sgt_and_not_min(ptr %x, ptr %y) { @@ -355,6 +485,19 @@ ret i1 %r } +define i1 @ugt_or_not_min_commute_inner(ptr %x, ptr %y) { +; 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: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ugt ptr %x, %y + %cmpeq = icmp ne ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + define i1 @ugt_swap_or_not_min(ptr %x, ptr %y) { ; CHECK-LABEL: @ugt_swap_or_not_min( ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null @@ -377,6 +520,19 @@ ret i1 %r } +define i1 @ugt_swap_or_not_min_commute_inner(ptr %x, ptr %y) { +; 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: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] +; + %cmp = icmp ult ptr %y, %x + %cmpeq = icmp ne ptr null, %x + %r = or i1 %cmp, %cmpeq + ret i1 %r +} + ; Negative test - signed compare define i1 @sgt_or_not_min(ptr %x, ptr %y) {