diff --git a/llvm/test/Transforms/InstCombine/select_meta.ll b/llvm/test/Transforms/InstCombine/select_meta.ll --- a/llvm/test/Transforms/InstCombine/select_meta.ll +++ b/llvm/test/Transforms/InstCombine/select_meta.ll @@ -64,8 +64,8 @@ define i64 @test43(i32 %a) nounwind { ; CHECK-LABEL: @test43( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 0) -; CHECK-NEXT: [[MAX:%.*]] = zext i32 [[TMP1]] to i64 +; CHECK-NEXT: [[NARROW:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 0) +; CHECK-NEXT: [[MAX:%.*]] = zext i32 [[NARROW]] to i64 ; CHECK-NEXT: ret i64 [[MAX]] ; %a_ext = sext i32 %a to i64 @@ -316,10 +316,72 @@ ret <2 x i32> %r } +; TODO: The !unpredictable should be preserved. +define i64 @unpredictable_select_add(i1 %cond, i64 %x, i64 %y) { +; CHECK-LABEL: @unpredictable_select_add( +; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND:%.*]], i64 [[Y:%.*]], i64 0 +; CHECK-NEXT: [[RET:%.*]] = add i64 [[ADD]], [[X:%.*]] +; CHECK-NEXT: ret i64 [[RET]] +; + %add = add i64 %x, %y + %ret = select i1 %cond, i64 %add, i64 %x, !unpredictable !3 + ret i64 %ret +} + +; TODO: The !unpredictable should be preserved. +define i64 @unpredictable_select_or(i1 %cond, i64 %x, i64 %y) { +; CHECK-LABEL: @unpredictable_select_or( +; CHECK-NEXT: [[ADD:%.*]] = select i1 [[COND:%.*]], i64 [[X:%.*]], i64 0 +; CHECK-NEXT: [[RET:%.*]] = or i64 [[ADD]], [[Y:%.*]] +; CHECK-NEXT: ret i64 [[RET]] +; + %add = or i64 %x, %y + %ret = select i1 %cond, i64 %add, i64 %y, !unpredictable !3 + ret i64 %ret +} + +; TODO: The !unpredictable should be preserved. +define i1 @unpredictable_logical_and_not_not(i1 %a, i1 %b) { +; CHECK-LABEL: @unpredictable_logical_and_not_not( +; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] +; CHECK-NEXT: [[R:%.*]] = xor i1 [[TMP1]], true +; CHECK-NEXT: ret i1 [[R]] +; + %na = xor i1 %a, true + %nb = xor i1 %b, true + %r = select i1 %na, i1 %nb, i1 false, !unpredictable !3 + ret i1 %r +} + +; TODO: The !unpredictable should be preserved. +define i1 @unpredictable_logical_or_not_not(i1 %a, i1 %b) { +; CHECK-LABEL: @unpredictable_logical_or_not_not( +; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false +; CHECK-NEXT: [[R:%.*]] = xor i1 [[TMP1]], true +; CHECK-NEXT: ret i1 [[R]] +; + %na = xor i1 %a, true + %nb = xor i1 %b, true + %r = select i1 %na, i1 true, i1 %nb, !unpredictable !3 + ret i1 %r +} + +; TODO: The !unpredictable should be preserved. +define float @unpredictable_fmax(float %a, float %b) { +; CHECK-LABEL: @unpredictable_fmax( +; CHECK-NEXT: [[C_INV:%.*]] = fcmp ole float [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[R:%.*]] = select i1 [[C_INV]], float [[B]], float [[A]] +; CHECK-NEXT: ret float [[R]] +; + %c = fcmp ugt float %a, %b + %r = select i1 %c, float %a, float %b, !unpredictable !3 + ret float %r +} !1 = !{!"branch_weights", i32 2, i32 10} !2 = !{!"branch_weights", i32 3, i32 10} +!3 = !{} ; CHECK: !0 = !{!"branch_weights", i32 2, i32 10} ; CHECK-NEXT: !1 = !{!"branch_weights", i32 10, i32 2} - +; CHECK-NEXT: !2 = !{}