From 103364b4b23e37fff66f2da37873cfd890f9a4e5 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Sun, 9 Feb 2020 19:06:09 -0600 Subject: [PATCH] [Attributor][Tests][NFC] Add more range tests Inspired by https://llvm.discourse.group/t/impossible-condition-optimization/461 --- llvm/test/Transforms/Attributor/range.ll | 158 +++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll index 10b16e4..642f821 100644 --- a/llvm/test/Transforms/Attributor/range.ll +++ b/llvm/test/Transforms/Attributor/range.ll @@ -525,6 +525,164 @@ return: ; preds = %if.end3, %if.then } declare dso_local i32 @foo(i32) + +; Examples taken from https://llvm.discourse.group/t/impossible-condition-optimization/461/1 +; +; The important part is that we return a constant (false) +; +; { + +; FIXME: All but the return is not needed anymore +define dso_local zeroext i1 @phi(i32 %arg) { +; OLD_PM-LABEL: define {{[^@]+}}@phi +; OLD_PM-SAME: (i32 [[ARG:%.*]]) +; OLD_PM-NEXT: bb: +; OLD_PM-NEXT: [[TMP:%.*]] = icmp sgt i32 [[ARG]], 5 +; OLD_PM-NEXT: br i1 [[TMP]], label [[BB1:%.*]], label [[BB2:%.*]] +; OLD_PM: bb1: +; OLD_PM-NEXT: br label [[BB3:%.*]] +; OLD_PM: bb2: +; OLD_PM-NEXT: br label [[BB3]] +; OLD_PM: bb3: +; OLD_PM-NEXT: [[DOT02:%.*]] = phi i32 [ 1, [[BB1]] ], [ 2, [[BB2]] ] +; OLD_PM-NEXT: [[TMP4:%.*]] = icmp sgt i32 [[ARG]], 10 +; OLD_PM-NEXT: br i1 [[TMP4]], label [[BB5:%.*]], label [[BB7:%.*]] +; OLD_PM: bb5: +; OLD_PM-NEXT: [[TMP6:%.*]] = add nsw i32 [[DOT02]], 1 +; OLD_PM-NEXT: br label [[BB9:%.*]] +; OLD_PM: bb7: +; OLD_PM-NEXT: [[TMP8:%.*]] = add nsw i32 [[DOT02]], 2 +; OLD_PM-NEXT: br label [[BB9]] +; OLD_PM: bb9: +; OLD_PM-NEXT: [[DOT01:%.*]] = phi i32 [ [[TMP6]], [[BB5]] ], [ [[TMP8]], [[BB7]] ] +; OLD_PM-NEXT: [[TMP10:%.*]] = icmp eq i32 [[DOT01]], 5 +; OLD_PM-NEXT: br i1 [[TMP10]], label [[BB11:%.*]], label [[BB12:%.*]] +; OLD_PM: bb11: +; OLD_PM-NEXT: br label [[BB13:%.*]] +; OLD_PM: bb12: +; OLD_PM-NEXT: br label [[BB13]] +; OLD_PM: bb13: +; OLD_PM-NEXT: [[DOT0:%.*]] = phi i1 [ true, [[BB11]] ], [ false, [[BB12]] ] +; OLD_PM-NEXT: ret i1 [[DOT0]] +; +; NEW_PM-LABEL: define {{[^@]+}}@phi +; NEW_PM-SAME: (i32 [[ARG:%.*]]) +; NEW_PM-NEXT: bb: +; NEW_PM-NEXT: [[TMP:%.*]] = icmp sgt i32 [[ARG]], 5 +; NEW_PM-NEXT: br i1 [[TMP]], label [[BB1:%.*]], label [[BB2:%.*]] +; NEW_PM: bb1: +; NEW_PM-NEXT: br label [[BB3:%.*]] +; NEW_PM: bb2: +; NEW_PM-NEXT: br label [[BB3]] +; NEW_PM: bb3: +; NEW_PM-NEXT: [[TMP4:%.*]] = icmp sgt i32 [[ARG]], 10 +; NEW_PM-NEXT: br i1 [[TMP4]], label [[BB5:%.*]], label [[BB7:%.*]] +; NEW_PM: bb5: +; NEW_PM-NEXT: br label [[BB9:%.*]] +; NEW_PM: bb7: +; NEW_PM-NEXT: br label [[BB9]] +; NEW_PM: bb9: +; NEW_PM-NEXT: br label [[BB12:%.*]] +; NEW_PM: bb11: +; NEW_PM-NEXT: unreachable +; NEW_PM: bb12: +; NEW_PM-NEXT: br label [[BB13:%.*]] +; NEW_PM: bb13: +; NEW_PM-NEXT: ret i1 false +; +bb: + %tmp = icmp sgt i32 %arg, 5 + br i1 %tmp, label %bb1, label %bb2 + +bb1: ; preds = %bb + br label %bb3 + +bb2: ; preds = %bb + br label %bb3 + +bb3: ; preds = %bb2, %bb1 + %.02 = phi i32 [ 1, %bb1 ], [ 2, %bb2 ] + %tmp4 = icmp sgt i32 %arg, 10 + br i1 %tmp4, label %bb5, label %bb7 + +bb5: ; preds = %bb3 + %tmp6 = add nsw i32 %.02, 1 + br label %bb9 + +bb7: ; preds = %bb3 + %tmp8 = add nsw i32 %.02, 2 + br label %bb9 + +bb9: ; preds = %bb7, %bb5 + %.01 = phi i32 [ %tmp6, %bb5 ], [ %tmp8, %bb7 ] + %tmp10 = icmp eq i32 %.01, 5 + br i1 %tmp10, label %bb11, label %bb12 + +bb11: ; preds = %bb9 + br label %bb13 + +bb12: ; preds = %bb9 + br label %bb13 + +bb13: ; preds = %bb12, %bb11 + %.0 = phi i1 [ true, %bb11 ], [ false, %bb12 ] + ret i1 %.0 +} + +define dso_local i1 @select(i32 %a) local_unnamed_addr #0 { +; OLD_PM-LABEL: define {{[^@]+}}@select +; OLD_PM-SAME: (i32 [[A:%.*]]) local_unnamed_addr +; OLD_PM-NEXT: entry: +; OLD_PM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], 5 +; OLD_PM-NEXT: [[DOT:%.*]] = select i1 [[CMP]], i32 1, i32 2 +; OLD_PM-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[A]], 10 +; OLD_PM-NEXT: [[Y_0_V:%.*]] = select i1 [[CMP1]], i32 1, i32 2 +; OLD_PM-NEXT: [[Y_0:%.*]] = add nuw nsw i32 [[DOT]], [[Y_0_V]] +; OLD_PM-NEXT: [[CMP6:%.*]] = icmp eq i32 [[Y_0]], 5 +; OLD_PM-NEXT: ret i1 [[CMP6]] +; +; NEW_PM-LABEL: define {{[^@]+}}@select +; NEW_PM-SAME: (i32 [[A:%.*]]) local_unnamed_addr +; NEW_PM-NEXT: entry: +; NEW_PM-NEXT: ret i1 false +; +entry: + %cmp = icmp sgt i32 %a, 5 + %. = select i1 %cmp, i32 1, i32 2 + %cmp1 = icmp sgt i32 %a, 10 + %y.0.v = select i1 %cmp1, i32 1, i32 2 + %y.0 = add nuw nsw i32 %., %y.0.v + %cmp6 = icmp eq i32 %y.0, 5 + ret i1 %cmp6 +} + +; FIXME: We do not look through the zext here. +define dso_local i32 @select_zext(i32 %a) local_unnamed_addr #0 { +; CHECK-LABEL: define {{[^@]+}}@select_zext +; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], 5 +; CHECK-NEXT: [[DOT:%.*]] = select i1 [[CMP]], i32 1, i32 2 +; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[A]], 10 +; CHECK-NEXT: [[Y_0_V:%.*]] = select i1 [[CMP1]], i32 1, i32 2 +; CHECK-NEXT: [[Y_0:%.*]] = add nuw nsw i32 [[DOT]], [[Y_0_V]] +; CHECK-NEXT: [[CMP6:%.*]] = icmp eq i32 [[Y_0]], 5 +; CHECK-NEXT: [[DOT13:%.*]] = zext i1 [[CMP6]] to i32 +; CHECK-NEXT: ret i32 [[DOT13]] +; +entry: + %cmp = icmp sgt i32 %a, 5 + %. = select i1 %cmp, i32 1, i32 2 + %cmp1 = icmp sgt i32 %a, 10 + %y.0.v = select i1 %cmp1, i32 1, i32 2 + %y.0 = add nuw nsw i32 %., %y.0.v + %cmp6 = icmp eq i32 %y.0, 5 + %.13 = zext i1 %cmp6 to i32 + ret i32 %.13 +} + +; } + !0 = !{i32 0, i32 10} !1 = !{i32 10, i32 100} ;CHECK: !0 = !{i32 0, i32 10} -- 2.7.4