While we do not want to form actual lookup tables early, we do want to perform some optimizations, as they may enable inlining of the much simpler form. Builds on https://github.com/llvm/llvm-project/pull/156477, which originally included this change as well. This PR makes two changes on top of it: * Do not perform the optimization early if it requires adding a mask check. These make the resulting IR less analyzable. * Add a new SimplifyCFG option that controls switch-to-arithmetic conversion separately from switch-to-lookup conversion. Enable the new flag at the end of the function simplification pipeline. This means that we attempt the arithmetic conversion before inlining, but avoid it in the early pipeline, where it may lose information.
449 lines
14 KiB
LLVM
449 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt -S -O3 < %s | FileCheck %s
|
|
|
|
target datalayout = "n64:32:16:8"
|
|
|
|
define i8 @test(i8 %x) {
|
|
; CHECK-LABEL: define range(i8 0, 53) i8 @test(
|
|
; CHECK-SAME: i8 [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: [[START:.*:]]
|
|
; CHECK-NEXT: [[X_:%.*]] = tail call i8 @llvm.umin.i8(i8 [[X]], i8 52)
|
|
; CHECK-NEXT: ret i8 [[X_]]
|
|
;
|
|
start:
|
|
%_0 = alloca [1 x i8], align 1
|
|
%0 = icmp eq i8 %x, 0
|
|
br i1 %0, label %bb1, label %bb2
|
|
|
|
bb1: ; preds = %start
|
|
store i8 0, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb2: ; preds = %start
|
|
%1 = icmp eq i8 %x, 1
|
|
br i1 %1, label %bb3, label %bb4
|
|
|
|
bb105: ; preds = %bb104, %bb103, %bb101, %bb99, %bb97, %bb95, %bb93, %bb91, %bb89, %bb87, %bb85, %bb83, %bb81, %bb79, %bb77, %bb75, %bb73, %bb71, %bb69, %bb67, %bb65, %bb63, %bb61, %bb59, %bb57, %bb55, %bb53, %bb51, %bb49, %bb47, %bb45, %bb43, %bb41, %bb39, %bb37, %bb35, %bb33, %bb31, %bb29, %bb27, %bb25, %bb23, %bb21, %bb19, %bb17, %bb15, %bb13, %bb11, %bb9, %bb7, %bb5, %bb3, %bb1
|
|
%2 = load i8, ptr %_0, align 1
|
|
ret i8 %2
|
|
|
|
bb3: ; preds = %bb2
|
|
store i8 1, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb4: ; preds = %bb2
|
|
%3 = icmp eq i8 %x, 2
|
|
br i1 %3, label %bb5, label %bb6
|
|
|
|
bb5: ; preds = %bb4
|
|
store i8 2, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb6: ; preds = %bb4
|
|
%4 = icmp eq i8 %x, 3
|
|
br i1 %4, label %bb7, label %bb8
|
|
|
|
bb7: ; preds = %bb6
|
|
store i8 3, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb8: ; preds = %bb6
|
|
%5 = icmp eq i8 %x, 4
|
|
br i1 %5, label %bb9, label %bb10
|
|
|
|
bb9: ; preds = %bb8
|
|
store i8 4, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb10: ; preds = %bb8
|
|
%6 = icmp eq i8 %x, 5
|
|
br i1 %6, label %bb11, label %bb12
|
|
|
|
bb11: ; preds = %bb10
|
|
store i8 5, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb12: ; preds = %bb10
|
|
%7 = icmp eq i8 %x, 6
|
|
br i1 %7, label %bb13, label %bb14
|
|
|
|
bb13: ; preds = %bb12
|
|
store i8 6, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb14: ; preds = %bb12
|
|
%8 = icmp eq i8 %x, 7
|
|
br i1 %8, label %bb15, label %bb16
|
|
|
|
bb15: ; preds = %bb14
|
|
store i8 7, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb16: ; preds = %bb14
|
|
%9 = icmp eq i8 %x, 8
|
|
br i1 %9, label %bb17, label %bb18
|
|
|
|
bb17: ; preds = %bb16
|
|
store i8 8, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb18: ; preds = %bb16
|
|
%10 = icmp eq i8 %x, 9
|
|
br i1 %10, label %bb19, label %bb20
|
|
|
|
bb19: ; preds = %bb18
|
|
store i8 9, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb20: ; preds = %bb18
|
|
%11 = icmp eq i8 %x, 10
|
|
br i1 %11, label %bb21, label %bb22
|
|
|
|
bb21: ; preds = %bb20
|
|
store i8 10, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb22: ; preds = %bb20
|
|
%12 = icmp eq i8 %x, 11
|
|
br i1 %12, label %bb23, label %bb24
|
|
|
|
bb23: ; preds = %bb22
|
|
store i8 11, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb24: ; preds = %bb22
|
|
%13 = icmp eq i8 %x, 12
|
|
br i1 %13, label %bb25, label %bb26
|
|
|
|
bb25: ; preds = %bb24
|
|
store i8 12, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb26: ; preds = %bb24
|
|
%14 = icmp eq i8 %x, 13
|
|
br i1 %14, label %bb27, label %bb28
|
|
|
|
bb27: ; preds = %bb26
|
|
store i8 13, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb28: ; preds = %bb26
|
|
%15 = icmp eq i8 %x, 14
|
|
br i1 %15, label %bb29, label %bb30
|
|
|
|
bb29: ; preds = %bb28
|
|
store i8 14, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb30: ; preds = %bb28
|
|
%16 = icmp eq i8 %x, 15
|
|
br i1 %16, label %bb31, label %bb32
|
|
|
|
bb31: ; preds = %bb30
|
|
store i8 15, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb32: ; preds = %bb30
|
|
%17 = icmp eq i8 %x, 16
|
|
br i1 %17, label %bb33, label %bb34
|
|
|
|
bb33: ; preds = %bb32
|
|
store i8 16, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb34: ; preds = %bb32
|
|
%18 = icmp eq i8 %x, 17
|
|
br i1 %18, label %bb35, label %bb36
|
|
|
|
bb35: ; preds = %bb34
|
|
store i8 17, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb36: ; preds = %bb34
|
|
%19 = icmp eq i8 %x, 18
|
|
br i1 %19, label %bb37, label %bb38
|
|
|
|
bb37: ; preds = %bb36
|
|
store i8 18, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb38: ; preds = %bb36
|
|
%20 = icmp eq i8 %x, 19
|
|
br i1 %20, label %bb39, label %bb40
|
|
|
|
bb39: ; preds = %bb38
|
|
store i8 19, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb40: ; preds = %bb38
|
|
%21 = icmp eq i8 %x, 20
|
|
br i1 %21, label %bb41, label %bb42
|
|
|
|
bb41: ; preds = %bb40
|
|
store i8 20, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb42: ; preds = %bb40
|
|
%22 = icmp eq i8 %x, 21
|
|
br i1 %22, label %bb43, label %bb44
|
|
|
|
bb43: ; preds = %bb42
|
|
store i8 21, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb44: ; preds = %bb42
|
|
%23 = icmp eq i8 %x, 22
|
|
br i1 %23, label %bb45, label %bb46
|
|
|
|
bb45: ; preds = %bb44
|
|
store i8 22, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb46: ; preds = %bb44
|
|
%24 = icmp eq i8 %x, 23
|
|
br i1 %24, label %bb47, label %bb48
|
|
|
|
bb47: ; preds = %bb46
|
|
store i8 23, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb48: ; preds = %bb46
|
|
%25 = icmp eq i8 %x, 24
|
|
br i1 %25, label %bb49, label %bb50
|
|
|
|
bb49: ; preds = %bb48
|
|
store i8 24, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb50: ; preds = %bb48
|
|
%26 = icmp eq i8 %x, 25
|
|
br i1 %26, label %bb51, label %bb52
|
|
|
|
bb51: ; preds = %bb50
|
|
store i8 25, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb52: ; preds = %bb50
|
|
%27 = icmp eq i8 %x, 26
|
|
br i1 %27, label %bb53, label %bb54
|
|
|
|
bb53: ; preds = %bb52
|
|
store i8 26, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb54: ; preds = %bb52
|
|
%28 = icmp eq i8 %x, 27
|
|
br i1 %28, label %bb55, label %bb56
|
|
|
|
bb55: ; preds = %bb54
|
|
store i8 27, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb56: ; preds = %bb54
|
|
%29 = icmp eq i8 %x, 28
|
|
br i1 %29, label %bb57, label %bb58
|
|
|
|
bb57: ; preds = %bb56
|
|
store i8 28, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb58: ; preds = %bb56
|
|
%30 = icmp eq i8 %x, 29
|
|
br i1 %30, label %bb59, label %bb60
|
|
|
|
bb59: ; preds = %bb58
|
|
store i8 29, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb60: ; preds = %bb58
|
|
%31 = icmp eq i8 %x, 30
|
|
br i1 %31, label %bb61, label %bb62
|
|
|
|
bb61: ; preds = %bb60
|
|
store i8 30, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb62: ; preds = %bb60
|
|
%32 = icmp eq i8 %x, 31
|
|
br i1 %32, label %bb63, label %bb64
|
|
|
|
bb63: ; preds = %bb62
|
|
store i8 31, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb64: ; preds = %bb62
|
|
%33 = icmp eq i8 %x, 32
|
|
br i1 %33, label %bb65, label %bb66
|
|
|
|
bb65: ; preds = %bb64
|
|
store i8 32, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb66: ; preds = %bb64
|
|
%34 = icmp eq i8 %x, 33
|
|
br i1 %34, label %bb67, label %bb68
|
|
|
|
bb67: ; preds = %bb66
|
|
store i8 33, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb68: ; preds = %bb66
|
|
%35 = icmp eq i8 %x, 34
|
|
br i1 %35, label %bb69, label %bb70
|
|
|
|
bb69: ; preds = %bb68
|
|
store i8 34, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb70: ; preds = %bb68
|
|
%36 = icmp eq i8 %x, 35
|
|
br i1 %36, label %bb71, label %bb72
|
|
|
|
bb71: ; preds = %bb70
|
|
store i8 35, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb72: ; preds = %bb70
|
|
%37 = icmp eq i8 %x, 36
|
|
br i1 %37, label %bb73, label %bb74
|
|
|
|
bb73: ; preds = %bb72
|
|
store i8 36, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb74: ; preds = %bb72
|
|
%38 = icmp eq i8 %x, 37
|
|
br i1 %38, label %bb75, label %bb76
|
|
|
|
bb75: ; preds = %bb74
|
|
store i8 37, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb76: ; preds = %bb74
|
|
%39 = icmp eq i8 %x, 38
|
|
br i1 %39, label %bb77, label %bb78
|
|
|
|
bb77: ; preds = %bb76
|
|
store i8 38, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb78: ; preds = %bb76
|
|
%40 = icmp eq i8 %x, 39
|
|
br i1 %40, label %bb79, label %bb80
|
|
|
|
bb79: ; preds = %bb78
|
|
store i8 39, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb80: ; preds = %bb78
|
|
%41 = icmp eq i8 %x, 40
|
|
br i1 %41, label %bb81, label %bb82
|
|
|
|
bb81: ; preds = %bb80
|
|
store i8 40, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb82: ; preds = %bb80
|
|
%42 = icmp eq i8 %x, 41
|
|
br i1 %42, label %bb83, label %bb84
|
|
|
|
bb83: ; preds = %bb82
|
|
store i8 41, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb84: ; preds = %bb82
|
|
%43 = icmp eq i8 %x, 42
|
|
br i1 %43, label %bb85, label %bb86
|
|
|
|
bb85: ; preds = %bb84
|
|
store i8 42, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb86: ; preds = %bb84
|
|
%44 = icmp eq i8 %x, 43
|
|
br i1 %44, label %bb87, label %bb88
|
|
|
|
bb87: ; preds = %bb86
|
|
store i8 43, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb88: ; preds = %bb86
|
|
%45 = icmp eq i8 %x, 44
|
|
br i1 %45, label %bb89, label %bb90
|
|
|
|
bb89: ; preds = %bb88
|
|
store i8 44, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb90: ; preds = %bb88
|
|
%46 = icmp eq i8 %x, 45
|
|
br i1 %46, label %bb91, label %bb92
|
|
|
|
bb91: ; preds = %bb90
|
|
store i8 45, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb92: ; preds = %bb90
|
|
%47 = icmp eq i8 %x, 46
|
|
br i1 %47, label %bb93, label %bb94
|
|
|
|
bb93: ; preds = %bb92
|
|
store i8 46, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb94: ; preds = %bb92
|
|
%48 = icmp eq i8 %x, 47
|
|
br i1 %48, label %bb95, label %bb96
|
|
|
|
bb95: ; preds = %bb94
|
|
store i8 47, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb96: ; preds = %bb94
|
|
%49 = icmp eq i8 %x, 48
|
|
br i1 %49, label %bb97, label %bb98
|
|
|
|
bb97: ; preds = %bb96
|
|
store i8 48, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb98: ; preds = %bb96
|
|
%50 = icmp eq i8 %x, 49
|
|
br i1 %50, label %bb99, label %bb100
|
|
|
|
bb99: ; preds = %bb98
|
|
store i8 49, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb100: ; preds = %bb98
|
|
%51 = icmp eq i8 %x, 50
|
|
br i1 %51, label %bb101, label %bb102
|
|
|
|
bb101: ; preds = %bb100
|
|
store i8 50, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb102: ; preds = %bb100
|
|
%52 = icmp eq i8 %x, 51
|
|
br i1 %52, label %bb103, label %bb104
|
|
|
|
bb103: ; preds = %bb102
|
|
store i8 51, ptr %_0, align 1
|
|
br label %bb105
|
|
|
|
bb104: ; preds = %bb102
|
|
store i8 52, ptr %_0, align 1
|
|
br label %bb105
|
|
}
|
|
|
|
; Make sure the call is inlined.
|
|
define i8 @test2(i8 %x) {
|
|
; CHECK-LABEL: define range(i8 0, 53) i8 @test2(
|
|
; CHECK-SAME: i8 [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
|
|
; CHECK-NEXT: [[CALL:%.*]] = tail call range(i8 0, 53) i8 @llvm.umin.i8(i8 [[X]], i8 52)
|
|
; CHECK-NEXT: ret i8 [[CALL]]
|
|
;
|
|
%call = call i8 @test(i8 %x)
|
|
ret i8 %call
|
|
}
|