@@ -61,63 +61,55 @@ void ConvertComplexPowPass::runOnOperation() {
61
61
62
62
fir::FirOpBuilder builder (mod, fir::getKindMapping (mod));
63
63
64
- mod.walk ([&](complex ::PowOp op) {
64
+ mod.walk ([&](complex ::PowiOp op) {
65
65
builder.setInsertionPoint (op);
66
66
Location loc = op.getLoc ();
67
67
auto complexTy = cast<ComplexType>(op.getType ());
68
68
auto elemTy = complexTy.getElementType ();
69
-
70
69
Value base = op.getLhs ();
71
- Value rhs = op.getRhs ();
72
-
73
- Value intExp;
74
- if (auto create = rhs.getDefiningOp <complex ::CreateOp>()) {
75
- if (isZero (create.getImaginary ())) {
76
- if (auto conv = create.getReal ().getDefiningOp <fir::ConvertOp>()) {
77
- if (auto intTy = dyn_cast<IntegerType>(conv.getValue ().getType ()))
78
- intExp = conv.getValue ();
79
- }
80
- }
81
- }
82
-
70
+ Value intExp = op.getRhs ();
83
71
func::FuncOp callee;
84
- SmallVector<Value> args;
85
- if (intExp) {
86
- unsigned realBits = cast<FloatType>(elemTy).getWidth ();
87
- unsigned intBits = cast<IntegerType>(intExp.getType ()).getWidth ();
88
- auto funcTy = builder.getFunctionType (
89
- {complexTy, builder.getIntegerType (intBits)}, {complexTy});
90
- if (realBits == 32 && intBits == 32 )
91
- callee = getOrDeclare (builder, loc, RTNAME_STRING (cpowi), funcTy);
92
- else if (realBits == 32 && intBits == 64 )
93
- callee = getOrDeclare (builder, loc, RTNAME_STRING (cpowk), funcTy);
94
- else if (realBits == 64 && intBits == 32 )
95
- callee = getOrDeclare (builder, loc, RTNAME_STRING (zpowi), funcTy);
96
- else if (realBits == 64 && intBits == 64 )
97
- callee = getOrDeclare (builder, loc, RTNAME_STRING (zpowk), funcTy);
98
- else if (realBits == 128 && intBits == 32 )
99
- callee = getOrDeclare (builder, loc, RTNAME_STRING (cqpowi), funcTy);
100
- else if (realBits == 128 && intBits == 64 )
101
- callee = getOrDeclare (builder, loc, RTNAME_STRING (cqpowk), funcTy);
102
- else
103
- return ;
104
- args = {base, intExp};
105
- } else {
106
- unsigned realBits = cast<FloatType>(elemTy).getWidth ();
107
- auto funcTy =
108
- builder.getFunctionType ({complexTy, complexTy}, {complexTy});
109
- if (realBits == 32 )
110
- callee = getOrDeclare (builder, loc, " cpowf" , funcTy);
111
- else if (realBits == 64 )
112
- callee = getOrDeclare (builder, loc, " cpow" , funcTy);
113
- else if (realBits == 128 )
114
- callee = getOrDeclare (builder, loc, RTNAME_STRING (CPowF128), funcTy);
115
- else
116
- return ;
117
- args = {base, rhs};
118
- }
72
+ unsigned realBits = cast<FloatType>(elemTy).getWidth ();
73
+ unsigned intBits = cast<IntegerType>(intExp.getType ()).getWidth ();
74
+ auto funcTy = builder.getFunctionType (
75
+ {complexTy, builder.getIntegerType (intBits)}, {complexTy});
76
+ if (realBits == 32 && intBits == 32 )
77
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (cpowi), funcTy);
78
+ else if (realBits == 32 && intBits == 64 )
79
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (cpowk), funcTy);
80
+ else if (realBits == 64 && intBits == 32 )
81
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (zpowi), funcTy);
82
+ else if (realBits == 64 && intBits == 64 )
83
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (zpowk), funcTy);
84
+ else if (realBits == 128 && intBits == 32 )
85
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (cqpowi), funcTy);
86
+ else if (realBits == 128 && intBits == 64 )
87
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (cqpowk), funcTy);
88
+ else
89
+ return ;
90
+ auto call = fir::CallOp::create (builder, loc, callee, {base, intExp});
91
+ op.replaceAllUsesWith (call.getResult (0 ));
92
+ op.erase ();
93
+ });
119
94
120
- auto call = fir::CallOp::create (builder, loc, callee, args);
95
+ mod.walk ([&](complex ::PowOp op) {
96
+ builder.setInsertionPoint (op);
97
+ Location loc = op.getLoc ();
98
+ auto complexTy = cast<ComplexType>(op.getType ());
99
+ auto elemTy = complexTy.getElementType ();
100
+ unsigned realBits = cast<FloatType>(elemTy).getWidth ();
101
+ func::FuncOp callee;
102
+ auto funcTy = builder.getFunctionType ({complexTy, complexTy}, {complexTy});
103
+ if (realBits == 32 )
104
+ callee = getOrDeclare (builder, loc, " cpowf" , funcTy);
105
+ else if (realBits == 64 )
106
+ callee = getOrDeclare (builder, loc, " cpow" , funcTy);
107
+ else if (realBits == 128 )
108
+ callee = getOrDeclare (builder, loc, RTNAME_STRING (CPowF128), funcTy);
109
+ else
110
+ return ;
111
+ auto call =
112
+ fir::CallOp::create (builder, loc, callee, {op.getLhs (), op.getRhs ()});
121
113
op.replaceAllUsesWith (call.getResult (0 ));
122
114
op.erase ();
123
115
});
0 commit comments