Skip to content

Instantly share code, notes, and snippets.

@vddvss
Created October 18, 2019 01:04
Show Gist options
  • Save vddvss/4e8b11f883b896d2c0773c8a6d58b0af to your computer and use it in GitHub Desktop.
Save vddvss/4e8b11f883b896d2c0773c8a6d58b0af to your computer and use it in GitHub Desktop.
ir test case
target triple = "powerpc64le-unknown-linux-gnu"
%rect = type { double, double, double, double }
; Function Attrs: noinline
define void @test(%rect* %res, %rect* %a, %rect* %b) {
%a_vec_cast = bitcast %rect* %a to <2 x double>*
%a_vec = load <2 x double>, <2 x double>* %a_vec_cast
%b_vec_cast = bitcast %rect* %b to <2 x double>*
%b_vec = load <2 x double>, <2 x double>* %b_vec_cast
%a_pow_b = call <2 x double> @llvm.pow.v2f64(<2 x double> %a_vec, <2 x double> %b_vec)
%w_a = getelementptr inbounds %rect, %rect* %a, i64 0, i32 2
%w_b = getelementptr inbounds %rect, %rect* %b, i64 0, i32 2
%w_a_vec_cast = bitcast double* %w_a to <2 x double>*
%w_a_vec = load <2 x double>, <2 x double>* %w_a_vec_cast
%a_x_a_w = fadd <2 x double> %w_a_vec, %a_vec
%w_b_vec_cast = bitcast double* %w_b to <2 x double>*
%w_b_vec = load <2 x double>, <2 x double>* %w_b_vec_cast
%b_x_b_w = fadd <2 x double> %w_b_vec, %b_vec
%a_add_pow_b_add = call <2 x double> @llvm.pow.v2f64(<2 x double> %a_x_a_w, <2 x double> %b_x_b_w)
%x2 = extractelement <2 x double> %a_add_pow_b_add, i32 0
%x1 = extractelement <2 x double> %a_pow_b, i32 0
%x2_gt_x1 = fcmp ogt double %x2, %x1
%y2 = extractelement <2 x double> %a_add_pow_b_add, i32 1
%y1 = extractelement <2 x double> %a_pow_b, i32 1
%y2_gt_y1 = fcmp ogt double %y2, %y1
%x_and_y_gt = and i1 %x2_gt_x1, %y2_gt_y1
br i1 %x_and_y_gt, label %if.then, label %if.end
if.then: ; preds = %entry
%res_x = getelementptr inbounds %rect, %rect* %res, i64 0, i32 0
store double %x1, double* %res_x
%res_y = getelementptr inbounds %rect, %rect* %res, i64 0, i32 1
store double %y1, double* %res_y
%res_w = getelementptr inbounds %rect, %rect* %res, i64 0, i32 2
%x_sub_y = fsub <2 x double> %a_add_pow_b_add, %a_pow_b
%res_w_cast = bitcast double* %res_w to <2 x double>*
store <2 x double> %x_sub_y, <2 x double>* %res_w_cast
br label %if.end
if.end: ; preds = %if.then, %entry
ret void
}
define i32 @main() {
%a = alloca %rect
%b = alloca %rect
%res = alloca %rect
store %rect { double 0.0, double 2.0, double 2.0, double 3.0 }, %rect* %a
store %rect { double 0.0, double 2.0, double 2.0, double 3.0 }, %rect* %b
store %rect { double 0.0, double 0.0, double 0.0, double 0.0 }, %rect* %res
call void @test(%rect* %res, %rect* %a, %rect* %b)
%res_d = bitcast %rect* %res to double*
%px = getelementptr inbounds %rect, %rect* %res, i64 0, i32 0
%x = load double, double* %px
%py = getelementptr inbounds %rect, %rect* %res, i64 0, i32 1
%y = load double, double* %py
%pw = getelementptr inbounds %rect, %rect* %res, i64 0, i32 2
%w = load double, double* %pw
%ph = getelementptr inbounds %rect, %rect* %res, i64 0, i32 3
%h = load double, double* %ph
%x_cmp = fcmp une double %x, 1.0
%x_ext = zext i1 %x_cmp to i32
ret i32 %x_ext
}
declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x double>) #4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment