|
6 | 6 | ; classes.
|
7 | 7 |
|
8 | 8 | declare void @llvm.assume(i1 noundef) #0
|
| 9 | +declare float @llvm.fabs.f32(float) #0 |
9 | 10 |
|
10 | 11 | ; --------------------------------------------------------------------
|
11 | 12 | ; Test assume x < -1.0 with compares to 0
|
@@ -3037,4 +3038,126 @@ define i1 @assume_olt_2__olt_1(float %arg) {
|
3037 | 3038 | ret i1 %cmp
|
3038 | 3039 | }
|
3039 | 3040 |
|
| 3041 | +; -------------------------------------------------------------------- |
| 3042 | +; Negative infinity |
| 3043 | +; -------------------------------------------------------------------- |
| 3044 | + |
| 3045 | +define i1 @assume_ogt_neginf_one_neginf(float %arg) { |
| 3046 | +; CHECK-LABEL: define i1 @assume_ogt_neginf_one_neginf( |
| 3047 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3048 | +; CHECK-NEXT: [[CMP_OGT_NEGINF:%.*]] = fcmp ogt float [[ARG]], 0xFFF0000000000000 |
| 3049 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGT_NEGINF]]) |
| 3050 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[ARG]], 0xFFF0000000000000 |
| 3051 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3052 | +; |
| 3053 | + %cmp.ogt.neginf = fcmp ogt float %arg, 0xFFF0000000000000 |
| 3054 | + call void @llvm.assume(i1 %cmp.ogt.neginf) |
| 3055 | + %cmp = fcmp one float %arg, 0xFFF0000000000000 |
| 3056 | + ret i1 %cmp |
| 3057 | +} |
| 3058 | + |
| 3059 | +define i1 @assume_ogt_neginf_oeq_posinf(float %arg) { |
| 3060 | +; CHECK-LABEL: define i1 @assume_ogt_neginf_oeq_posinf( |
| 3061 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3062 | +; CHECK-NEXT: [[CMP_OGT_NEGINF:%.*]] = fcmp ogt float [[ARG]], 0xFFF0000000000000 |
| 3063 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGT_NEGINF]]) |
| 3064 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ARG]], 0x7FF0000000000000 |
| 3065 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3066 | +; |
| 3067 | + %cmp.ogt.neginf = fcmp ogt float %arg, 0xFFF0000000000000 |
| 3068 | + call void @llvm.assume(i1 %cmp.ogt.neginf) |
| 3069 | + %cmp = fcmp oeq float %arg, 0x7FF0000000000000 |
| 3070 | + ret i1 %cmp |
| 3071 | +} |
| 3072 | + |
| 3073 | +define i1 @assume_ule_neginf_oeq_neginf(float %arg) { |
| 3074 | +; CHECK-LABEL: define i1 @assume_ule_neginf_oeq_neginf( |
| 3075 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3076 | +; CHECK-NEXT: [[CMP_ULE_NEGINF:%.*]] = fcmp ule float [[ARG]], 0xFFF0000000000000 |
| 3077 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ULE_NEGINF]]) |
| 3078 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ARG]], 0xFFF0000000000000 |
| 3079 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3080 | +; |
| 3081 | + %cmp.ule.neginf = fcmp ule float %arg, 0xFFF0000000000000 |
| 3082 | + call void @llvm.assume(i1 %cmp.ule.neginf) |
| 3083 | + %cmp = fcmp oeq float %arg, 0xFFF0000000000000 |
| 3084 | + ret i1 %cmp |
| 3085 | +} |
| 3086 | + |
| 3087 | +define i1 @assume_ult_neginf_oeq_neginf(float %arg) { |
| 3088 | +; CHECK-LABEL: define i1 @assume_ult_neginf_oeq_neginf( |
| 3089 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3090 | +; CHECK-NEXT: [[CMP_ULT_NEGINF:%.*]] = fcmp ult float [[ARG]], 0xFFF0000000000000 |
| 3091 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ULT_NEGINF]]) |
| 3092 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ARG]], 0xFFF0000000000000 |
| 3093 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3094 | +; |
| 3095 | + %cmp.ult.neginf = fcmp ult float %arg, 0xFFF0000000000000 |
| 3096 | + call void @llvm.assume(i1 %cmp.ult.neginf) |
| 3097 | + %cmp = fcmp oeq float %arg, 0xFFF0000000000000 |
| 3098 | + ret i1 %cmp |
| 3099 | +} |
| 3100 | + |
| 3101 | +define i1 @assume_fabs_ogt_neginf_one_neginf(float %arg) { |
| 3102 | +; CHECK-LABEL: define i1 @assume_fabs_ogt_neginf_one_neginf( |
| 3103 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3104 | +; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) |
| 3105 | +; CHECK-NEXT: [[CMP_OGT_NEGINF:%.*]] = fcmp ogt float [[FABS_ARG]], 0xFFF0000000000000 |
| 3106 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGT_NEGINF]]) |
| 3107 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[ARG]], 0xFFF0000000000000 |
| 3108 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3109 | +; |
| 3110 | + %fabs.arg = call float @llvm.fabs.f32(float %arg) |
| 3111 | + %cmp.ogt.neginf = fcmp ogt float %fabs.arg, 0xFFF0000000000000 |
| 3112 | + call void @llvm.assume(i1 %cmp.ogt.neginf) |
| 3113 | + %cmp = fcmp one float %arg, 0xFFF0000000000000 |
| 3114 | + ret i1 %cmp |
| 3115 | +} |
| 3116 | + |
| 3117 | +define i1 @assume_fabs_ogt_neginf_one_posinf(float %arg) { |
| 3118 | +; CHECK-LABEL: define i1 @assume_fabs_ogt_neginf_one_posinf( |
| 3119 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3120 | +; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) |
| 3121 | +; CHECK-NEXT: [[CMP_OGT_NEGINF:%.*]] = fcmp ogt float [[FABS_ARG]], 0xFFF0000000000000 |
| 3122 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGT_NEGINF]]) |
| 3123 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[ARG]], 0x7FF0000000000000 |
| 3124 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3125 | +; |
| 3126 | + %fabs.arg = call float @llvm.fabs.f32(float %arg) |
| 3127 | + %cmp.ogt.neginf = fcmp ogt float %fabs.arg, 0xFFF0000000000000 |
| 3128 | + call void @llvm.assume(i1 %cmp.ogt.neginf) |
| 3129 | + %cmp = fcmp one float %arg, 0x7FF0000000000000 |
| 3130 | + ret i1 %cmp |
| 3131 | +} |
| 3132 | + |
| 3133 | +define i1 @assume_fabs_ule_neginf_oeq_neginf(float %arg) { |
| 3134 | +; CHECK-LABEL: define i1 @assume_fabs_ule_neginf_oeq_neginf( |
| 3135 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3136 | +; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) |
| 3137 | +; CHECK-NEXT: [[CMP_OGT_NEGINF:%.*]] = fcmp ule float [[FABS_ARG]], 0xFFF0000000000000 |
| 3138 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGT_NEGINF]]) |
| 3139 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ARG]], 0xFFF0000000000000 |
| 3140 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3141 | +; |
| 3142 | + %fabs.arg = call float @llvm.fabs.f32(float %arg) |
| 3143 | + %cmp.ogt.neginf = fcmp ule float %fabs.arg, 0xFFF0000000000000 |
| 3144 | + call void @llvm.assume(i1 %cmp.ogt.neginf) |
| 3145 | + %cmp = fcmp oeq float %arg, 0xFFF0000000000000 |
| 3146 | + ret i1 %cmp |
| 3147 | +} |
| 3148 | + |
| 3149 | +define i1 @assume_oge_neginf_oeq_neginf(float %arg) { |
| 3150 | +; CHECK-LABEL: define i1 @assume_oge_neginf_oeq_neginf( |
| 3151 | +; CHECK-SAME: float [[ARG:%.*]]) { |
| 3152 | +; CHECK-NEXT: [[CMP_OGE_NEGINF:%.*]] = fcmp oge float [[ARG]], 0xFFF0000000000000 |
| 3153 | +; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_OGE_NEGINF]]) |
| 3154 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ARG]], 0xFFF0000000000000 |
| 3155 | +; CHECK-NEXT: ret i1 [[CMP]] |
| 3156 | +; |
| 3157 | + %cmp.oge.neginf = fcmp oge float %arg, 0xFFF0000000000000 |
| 3158 | + call void @llvm.assume(i1 %cmp.oge.neginf) |
| 3159 | + %cmp = fcmp oeq float %arg, 0xFFF0000000000000 |
| 3160 | + ret i1 %cmp |
| 3161 | +} |
| 3162 | + |
3040 | 3163 | attributes #0 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
|
0 commit comments